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
网友评论