CrawlSpider它是Spider的派生類,Spider類的設計原則是只爬取start_url列表中的網頁,而CrawlSpider類定義了一些規則Rule來提供跟進鏈接的方便的機制,從爬取的網頁結果中獲取鏈接并繼續爬取的工作.
創建爬蟲文件的方式
scrapy genspider -t crawl 爬蟲文件 域
爬蟲文件繼承的類
rule:里面存放的是Rule對象(元祖或列表)
Rule:自定義提取規則,提取到的url會自動構建Request對象
設置回調函數解析響應結果,設置是否需要跟進(進一步提取url)
process_links:攔截Rule規則提取的url,返回的是一個列表列表里面存放的是link對象
LinkExtractor:是一個對象,設置提取正則的url規則
- 注意:在Rule中沒有設置callback回調,follow默認為True
- 注意:一定不要去實現parse方法
- 注意:要想處理起始url的響應結果,我們需要重寫parse_start_url的方法
什么時候適合使用crawlspider:
- 網頁結構比較簡單
- 頁面大多是靜態文件
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from chinazcrawlspider.items import ChinazcrawlspiderItem
class ChinazSpider(CrawlSpider):
name = 'chinaz'
allowed_domains = ['chinaz.com']
start_urls = ['http://top.chinaz.com/hangyemap.html']
# 存放定制的獲取連接規則對象(是一個列表或元祖)
# 根據規則提取到所有的url,由crawlspider構建Request對象并交給引擎
"""
LinkExtractor: 提取連接的規則(正則)
# 常用
allow = ():設置允許提取的目標url
deny=():設置不允許提取的目標url(優先級比allow高)
allow_domains=():設置允許提取的url的域
deny_domains =():不允許提取的url的域(優先級比allow_domains高)
restrict_xpaths=(): 根據xpath語法,定位到某一標簽提取目標url
unique=True:如果存在多個相同的url,只會保留一個
restrict_css=(): 根據css語法,定位到某一標簽提取目標url
strip=True:
"""
"""
Rule
link_extractor: Linkextractor對象
callback=None:設置回調函數
follow=None:是否設置跟進(下一頁滿足條件跟進)
process_links:可設置回調函數,
對request對象攔截(標簽下無法直接獲取的url,拼接url錨點)
"""
rules = (
# Rule規則對象
# 分頁地址
Rule(
LinkExtractor(
allow=r'http://top.chinaz.com/hangye/index_.*?.html', # 正則匹配URL
restrict_xpaths=('//div[@class="Taright"]',# 匹配分類地址
'//div[@class="ListPageWrap"]')# 匹配分頁地址
), # xpath可設置范圍,即在哪里匹配符合正則的url
callback='parse_item',
follow=True # 下一頁頁滿足allow條件
),
)
# 在crawlspider中一定不要出現parse()方法
def parse_start_url(self,response):
"""
如果想要對起始url的響應結果做處理的話,就需要回調這個方法
:param response:
:return:
"""
self.parse_item
def parse_item(self, response):
"""
解析分頁的網頁數據
:param response:
:return:
"""
webInfos = response.xpath('//ul[@class="listCentent"]/li')
for webInfo in webInfos:
web_item = ChinazcrawlspiderItem()
# 封面圖片
web_item['coverImage'] = webInfo.xpath('.//div[@class="leftImg"]/a/img/@src').extract_first('')
# 標題
web_item['title'] = webInfo.xpath('.//h3[@class="rightTxtHead"]/a/text()').extract_first('')
# 域名
web_item['domenis'] = webInfo.xpath(
'.//h3[@class="rightTxtHead"]/span[@class="col-gray"]/text()').extract_first('')
# 周排名
web_item['weekRank'] = webInfo.xpath('.//div[@class="RtCPart clearfix"]/p[1]/a/text()').extract_first('')
# 反連接數
web_item['ulink'] = webInfo.xpath('.//div[@class="RtCPart clearfix"]/p[4]/a/text()').extract_first('')
# 網站簡介
web_item['info'] = webInfo.xpath('.//p[@class="RtCInfo"]/text()').extract_first('')
# 得分
web_item['score'] = webInfo.xpath('.//div[@class="RtCRateCent"]/span/text()').re('\d+')[0]
# 排名
web_item['rank'] = webInfo.xpath('.//div[@class="RtCRateCent"]/strong/text()').extract_first('')
print(web_item)
yield web_item