Scrapy基本用法

安裝scrapy

不同操作系統安裝操作不同,可以直接看官方文檔Install Scrapy

創建一個項目

在命令行輸入

scrapy startproject tutorial

進入項目目錄創建一個spider

cd tutorial
scrapy genspider quotes domain.com
import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

運行scrapy,在項目頂級目錄下輸入命令

scrapy crawl quotes

在QuotesSpider這個類裏,name指明spider的名稱,在start_requests函數裏發出請求,用parse函數處理請求返回的結果,start_requests函數可以替換爲start_urls列表,scrapy會自動幫我們發出請求,並默認用parse函數處理,還可以設置一些其它參數,詳見Document

選擇器用法

scrapy內置css選擇器和xpath選擇器,當然你也可以選擇使用其他的解析庫,比如BeautifulSoup,我們簡單用scrapy shell展示一下scrapy內置選擇器的用法,在命令行中輸入

scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html

示例代碼

<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
  </div>
 </body>
</html>
# 獲取標題
# selector可以去掉
# extract返回的是列表
response.selector.xpath('//title/text()').extract_first()
response.selector.css('title::text').extract_first()

# 獲取a標籤裏href參數內容
response.xpath('//a/@href').extract()
response.css('a::attr(href)').extract()

# 混合獲取img標籤的src屬性
response.xpath('//div[@id="images"]').css('img::attr(src)').extract()

# 獲取a標籤中包含image的href屬性
response.xpath('//a[contains(@href, "image")]/@href').extract()
response.css('a[href*=image]::attr(href)').extract()

# 使用正則表達式
response.css('a::text').re('Name\:(.*)')
response.css('a::text').re_first('Name\:(.*)')

# 添加default參數指定默認提取信息
response.css('aa').extract_first(default='')

Item Pipeline用法

通過parse處理函數返回的Item可以用Item Pipeline進行加工處理,主要是數據清洗,格式化。

# 過濾掉相同的item

class DuplicatePipeline(object):
    def __init__(self):
        self.items = set()

    def process_item(self, item, spider):
        if item['id'] in self.items:
            raise DropItem('Duplicate item found: %s' % item['id'])
        else:
            self.items.add(item['id'])
            return item

需要在settings裏的註冊一下自定義的Pipeline

ITEM_PIPELINES = {
     'tutorial.pipelines.TutorialPipeline': 300,
     'tutorial.pipelines.DuplicatePipeline': 200,
}

數字越小,優先級越高

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章