美文网首页
Scrapy通用爬虫--CrawlSpider

Scrapy通用爬虫--CrawlSpider

作者: 牛耀 | 来源:发表于2019-01-06 00:39 被阅读0次
    • 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
    

    相关文章

      网友评论

          本文标题:Scrapy通用爬虫--CrawlSpider

          本文链接:https://www.haomeiwen.com/subject/gmsjrqtx.html