Scrapy框架的學習(9.Scrapy中的CrawlSpider類的作用以及使用,實現優化的翻頁爬蟲)
1.CrawlSpider類通過一些規則(rules),使對於連結(網頁)的爬取更具有通用性,
換句話說,CrawlSpider爬蟲為通用性的爬蟲,
而Spider爬蟲更像是為一些特殊網站制定的爬蟲。它基於Spider並有一些獨特屬性
rules: 是Rule物件的集合,用於匹配目標網站並排除干擾
parse_start_url: 用於爬取起始響應,必須要返回Item
2. Scrapy中的爬蟲方法繼承四種類來建立我們的scrapy爬蟲,
他們是:Spider類,CrawlSpider類, CSVFeedSpider類和XMLFeedSpider類
3. 通過命令的方式生成一個CrawlSpider類的模板
scrapy genspider -t crawl 爬蟲 域名
4. 通過爬取這個網站http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm 來使用CrawlSpider類進行爬蟲
(1)建立好專案後,建立爬蟲(加入了-t crawl
) scrapy genspider -t crawl punish bxjg.circ.gov.cn(2) 可以使用rules規則,就可以不用再寫一個專門針對於下一頁的請求函數了
rules = ( Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'), Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True), )
LinkExtractor 連線提取器,提取url
引數:
url allow : 可以寫入正則表示式
callback: 提取出來的url地址的response交給callback處理 ,需要時再用,一般對應的網站詳情頁面要使用
follow: 表示當前的url地址的響應是否重新經過rules來提取url地址,需要時再用
(3) 然後 編寫爬蟲的程式碼
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule import re '''繼承spider的crawlspider類''' class PunishSpider(CrawlSpider): name = 'punish' allowed_domains = ['bxjg.circ.gov.cn'] start_urls = ['http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm'] ''' 可以定義提取url地址的規則 LinkExtractor 連線提取器,提取url allow : 可以寫入正則表示式 callback: 提取出來的url地址的response交給callback處理 follow: 表示當前的url地址的響應是否重新經過rules來提取url地址 ''' rules = ( Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'), Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True), ) '''與Spider類不同,CrawlSpider類中的parse函式有特殊功能,不能定義''' def parse_item(self, response): item = {} item['title'] = re.findall("<!--TitleStart-->(.*?)<!--TitleEnd-->",response.body.decode())[0] item['publish_date'] = re.findall("釋出時間:(20\d{2}-\d{2}-\d{2})",response.body.decode())[0] print(item)
(4) 在setting.py裡面設定 LOG_LEVEL = "WARNING" 以及開啟並設定 USER_AGENT,然後在終端執行程式
scrapy crawl punish
(5) LinKExtractor更多常見的引數:
5. 再請求詳情頁的時候,我們也可以使用在Spider類中一樣,
通過 yield scrapy.Request() 方法也可以實現,但是程式碼會寫的比使用Crawlspider類中的多