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, }
數字越小,優先順序越高