zoukankan      html  css  js  c++  java
  • crawlspider

    Scrapy中CrawSpider

    回头看:

    之前的代码中,我们有很大一部分时间在寻找下一页的url地址或者是内容的url地址或者是内容的url地址上面,这个过程能更简单一些么?
    

    思路:

    1. 从response中提取所有的a标签对应的url地址     
    2. 自动的构造自己requests请求,发送给引擎  
    

    上面的功能可以做的更好:

    满足某个条件的url地址,我们才发送给引擎,同时能够指定callback函数

    需求:爬取csdn上面所有的博客专家及其文章

    url地址:http://blog.csdn.net/experts.html
    

    生产crawlspider的命令:

    scrapy genspider -t crawl csdn 'csdn.cn'
    
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    
    class CsdnspiderSpider(CrawlSpider):  # 继承自spiders的crawspider类
        name = 'csdnspider'
        allowed_domains = ['blog.csdn.net']
        start_urls = ['http://blog.csdn.net/peoplelist.html?channelid=0&page=1']  # 第一次请求的url,如果对这个url有特殊的需求,可以定义一个parse_start_url函数专门处理所有对应的响应
        
        rules = (
            Rule(LinkExtractor(allow=r"http://blog.csdn.net/w+$"), fllow=True),  # 能够找到所有作者的博客地址并且请求,$符号加上表示已w结尾,否则会匹配上w+'/abc/def'等内容
            Rule(LinkExtractor(allow=r"peoplelist.html?channelid=d+&page=d+$), follow=True),  #找到所有的翻页地址并且请求,$符合同理
            Rule(LinkExtractor(allow=r'/article/details/d+$'), callback="parse_article", follow=True),  # 找到所有的文章的url地址,并且请求,调用parase_article函数处理response
            Rule(LinkExtractor(allow=r'/article/list/d+$'), follow=True)
        )
    

    注意点:

    1. 用命令创建一个crawlspider模块:scrapy genspider -t crawl <爬虫名字> <all_domain>,也可以手动创建
    2. CrawlSpider中不能再有以parse为名字的数据提取方法,这个方法被CrawlSpider用来实现基础url提取等功能
    3. 一个Rule对象接收很多参数,首先第一个是包含url规则的LinkExtractor对象,常用的还有callback(制定满足规则的url的解析函数的字符串)和follow(response中提取的链接是否需要跟进)
    4. 不指定callback函数的请求下,如果follow为True,满足该rule的url还会继续被请求
    5. 如果多个Rule都满足某一个url,会从rules中选择第一个满足的进行操作

    CrawlSpider补充(了解)

    LinkExtractor更多常见参数:

    allow:满足括号中“正则表达式”的URL会被提取,如果为空,则全部匹配。
    deny:满足括号中“正则表达式”的URL一定不提取(优先级高于allow)
    allow_domains:会被提取的链接的domains。
    deny_domains:一定不会被提取链接的domains。
    restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接,级xpath满足范围内的url地址会被提取
    
    spiders.Rule常见参数:
    link_extractor:是一个LinkExtractor对象,用于定义需要提取的链接。
    callback:从linkExtractor中每获取链接时,参数所指定的值作为回调函数。
    follow:是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。如果callback为None,follow默认设置为True,否则默认为False。
    process_links:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数,该方法主要用来过滤url。
    process_request:指定该spider中哪个的函数将会被调用,该规则提取每个request时都会调用该函数,用来过滤request
  • 相关阅读:
    【坑】提答题
    Google Code Jam 2014 Round2
    湖北省队互测Week1
    [xyz模拟题]动态维护树的直径
    音乐会的等待【单调栈】
    51nod1202【DP-树状数组维护】
    51nod1113【矩阵快速幂】
    51nod1255【贪心-栈的应用】
    Lightoj1059【最小生成树】
    SPOJ IAPCR2F 【并查集】
  • 原文地址:https://www.cnblogs.com/colden/p/9863776.html
Copyright © 2011-2022 走看看