zoukankan      html  css  js  c++  java
  • scrapy(网络爬虫)———CrawlSpider(规则爬虫)

    CrawlSpider(规则爬虫)

    一 .简介:它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。

    二.创建爬虫命令:

    1.前提是已经创建好爬虫项目了,若没有创建好项目,请使用 scrapy startproject 项目名

    进入项目目录

    2.在项目目录下执行创建规则爬虫:scrapy genspider -t crawl 爬虫名称 爬取域名

    三.在pycharm中编写规则爬虫文件

    1.爬虫文件中导入的Link Extractors:

    class scrapy.linkextractors.LinkExtractor

    作用是:

    每个LinkExtractor有唯一的公共方法是 extract_links(),它接收一个 Response 对象,类中定义了Response中的链接的提取规则,并返回一个 scrapy.link.Link 对象,返回的是符合链接匹配对象的列表

    Link Extractors要实例化一次,并且extract_links 方法会根据不同的 response 调用多次提取链接。

    2.Link Extractors 中的主要参数:

    allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。(使用最多)

    deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。

    allow_domains:会被提取的链接的domains。

    deny_domains:一定不会被提取链接的domains。

    restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。

    3.rules

    在rules中包含一个或多个Rule对象,每个Rule对爬取网站的动作定义了特定操作。如果多个rule匹配了相同的链接,则根据规则在本集合中被定义的顺序,第一个会被使用

    
    class scrapy.spiders.Rule(
            link_extractor, 
            callback = None, 
            cb_kwargs = None, 
            follow = None, 
            process_links = None, 
            process_request = None
    
    
    解释一下以上参数:
    • link_extractor:是一个Link Extractor对象,用于定义需要提取的链接。

    • callback: 从link_extractor中每获取到链接时,参数所指定的值作为回调函数,该回调函数接受一个response作为其第一个参数。

      注意:当编写爬虫规则时,避免使用parse作为回调函数由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了 parse方法,crawl spider将会运行失败。

    • follow:是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果callback为None,follow 默认设置为True ,否则默认为False。

    • process_links:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。

    • process_request:指定该spider中哪个的函数将会被调用, 该规则提取到每个request时都会调用该函数。 (用来过滤request)

    callback对应的函数

     

    不要写parse

    不要写parse!!!

     

    四、以腾讯社招为例,编写crawlspider规则爬虫文件
    # -*- coding: utf-8 -*-
    import scrapy
    from tencentpro.items import TencentproItem
    from scrapy.spider import CrawlSpider,Rule
    # 导入链接匹配规则,用来提取符合规则的链接
    from scrapy.linkextractors import LinkExtractor
    
    class TencentdataSpider(CrawlSpider):
        name = 'tencentdata'
    allowed_domains = ['hr.tencent.com']
        start_urls = ['https://hr.tencent.com/position.php?&start=0#a']
    
        rules = (
            # 先去匹配列表页链接
    Rule(LinkExtractor(allow=r'start=d+'), follow=True),
            # 匹配详情页数据
    Rule(LinkExtractor(allow=r'id=d+'), callback='parse_item',follow=False),
        )
    
        def parse_item(self, response):
            # 处理详情页数据
    item=TencentproItem()
            positionname=response.xpath('//td[@class="l2 bold size16"]/text()').extract()[0]
            positionaddress=response.xpath('//tr[@class="c bottomline"]/td[1]/text()').extract()[0]
            content=response.xpath('//ul[@class="squareli"]/li/text()').extract()
            content="".join(content)
            item['positionname']=positionname
            item['positionaddress']=positionaddress
            item['content']=content
            print(content)
            yield item
    然后编写pipeline文件,运行程序,即可

    更多见:https://blog.csdn.net/qq_42281826/article/details/81021280
  • 相关阅读:
    获取文字宽高
    jni中的参数含义
    jni开发中的常见错误
    指针只需要记住一点
    Eclipse web项目引用其它项目时的部署问题
    关于JAVA日志
    去掉Mybatis Generator生成的一堆 example
    怎样给Eclipse添加一个Xml模板
    Junit很少出现的一个问题 No tests found matching ...
    出现异常:Unsupported major.minor version
  • 原文地址:https://www.cnblogs.com/Dark-fire-liehuo/p/10024936.html
Copyright © 2011-2022 走看看