Scrapy通用爬虫--CrawlSpider

2019-01-06  本文已影响0人  宁que
'''
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:
1.网页结构比较简单
2.页面大多是静态文件
'''
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

上一篇下一篇

猜你喜欢

热点阅读