scrapy框架之(CrawlSpider)
阿新 • • 發佈:2019-03-03
就是 Coding rip extra 獲得 rule back imp 轉義 ,其設計原則只是為了爬取start_url列表中網頁,而從爬取到的網頁中提取出的url進行繼續的爬取工作使用CrawlSpider更合適。
一.CrawlSpider簡介
如果想要通過爬蟲程序去爬取”糗百“全站數據新聞數據的話,有幾種實現方法?
方法一:基於Scrapy框架中的Spider的遞歸爬取進行實現(Request模塊遞歸回調parse方法)。
方法二:基於CrawlSpider的自動爬取進行實現(更加簡潔和高效)。
一.簡介
CrawlSpider其實是Spider的一個子類,除了繼承到Spider的特性和功能外,還派生除了其自己獨有的更加強大的特性和功能。其中最顯著的功能就是”LinkExtractors鏈接提取器“。Spider是所有爬蟲的基類
二.使用
1.創建scrapy工程:scrapy startproject projectName
2.創建爬蟲文件:scrapy genspider -t crawl spiderName www.xxx.com
--此指令對比以前的指令多了 "-t crawl",表示創建的爬蟲文件是基於CrawlSpider這個類的,而不再是Spider這個基類。
3.觀察生成的爬蟲文件
爬蟲文件.py
#-*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule #不再是引入spider,而是引入了crawlspider,還引入了LinkExtracor(連接提取器),Rule解析器 class ChoutiSpider(CrawlSpider): name = ‘chouti‘ #allowed_domains = [‘www.xxx.com‘] start_urls= [‘https://dig.chouti.com/r/scoff/hot/1‘]
#allow後面跟著正則匹配,用正則去匹配符合的連接
#rule規則解析器則會去把提取器提取到的連接發起請求,並把獲得的響應對象用回調函數去解析
#follow表示是否把連接解析器繼續作用到提取到的url中(是否提取全站的url) rules = ( Rule(LinkExtractor(allow=r‘Items/‘), callback=‘parse_item‘, follow=True), ) def parse_item(self, response): item = {} #item[‘domain_id‘] = response.xpath(‘//input[@id="sid"]/@value‘).get() #item[‘name‘] = response.xpath(‘//div[@id="name"]‘).get() #item[‘description‘] = response.xpath(‘//div[@id="description"]‘).get() return item
案例一:(全站提取)
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class ChoutiSpider(CrawlSpider): name = ‘chouti‘ # allowed_domains = [‘www.xxx.com‘] start_urls = [‘https://dig.chouti.com/r/scoff/hot/1‘] #把這個單獨寫比較好看 link=LinkExtractor(allow=r‘/r/scoff/hot/\d+‘) rules = ( Rule(link,callback=‘parse_item‘, follow=False), ) def parse_item(self, response): print(response)
#這樣就可以叠代提取到我們想要的所有內容,因為其起始頁的url為:https://dig.chouti.com/r/scoff/hot/1
案例二:(第一頁沒有數字編號的)
class ChoutiSpider(CrawlSpider):
name = ‘chouti‘
# allowed_domains = [‘www.xxx.com‘]
start_urls = [‘https://www.qiushibaike.com/text/‘]
#把這個單獨寫比較好看
link=LinkExtractor(allow=r‘/text/page/\d+/‘)
link1=LinkExtractor(allow=r‘/text/‘)
rules = (
Rule(link,callback=‘parse_item‘, follow=True),
Rule(link1, callback=‘parse_item‘, follow=True),
)
def parse_item(self, response):
print(response)
#註意觀察器其實url:
https://www.qiushibaike.com/text/
#第一頁沒有數字表示
案例三:(正匹配會有很多相似的,限定開頭或者結尾)
class ChoutiSpider(CrawlSpider): name = ‘chouti‘ # allowed_domains = [‘www.xxx.com‘] start_urls = [‘https://www.qiushibaike.com/pic/‘] # 把這個單獨寫比較好看
#這邊的?記得轉義\ link = LinkExtractor(allow=r‘/pic/page/\d+\?s=‘) link1 = LinkExtractor(allow=r‘/pic/$‘) #提取第一頁這個匹配會有很多其他的幹擾,這些並不是我們想要的,要限定結尾$ rules = ( Rule(link, callback=‘parse_item‘, follow=True), Rule(link1, callback=‘parse_item‘, follow=True), ) def parse_item(self, response): print(response)
註:如果allow沒有為空,那就是匹配網頁中所有的url
scrapy框架之(CrawlSpider)