Scrapy精华教程(六)——自动爬取网页之II(CrawlSpider)

一.目的。

在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构,

在pipelines.py中实现获得数据的过滤以及保存。

但是以上述方法只能爬取start_url列表中的网页,而网络爬虫如google等搜索引擎爬虫实现的就是对整个互联网的爬取,所以在本教程中研究使用scrapy自动实现多网页爬取功能。

在教程(五)(http://blog.csdn.net/u012150179/article/details/34486677)中已经编写继承自spider的类实现爬虫,实现了自动多网页爬取,这里引出CrawlSpider类,使用更简单方式实现自动爬取。

二.热身。

    1.CrawlSpider

    (1)概念与作用:

    它是Spider的派生类,首先在说下Spider,它是所有爬虫的基类,对于它的设计原则是只爬取start_url列表中的网页,而从爬取的网页中获取link并继续爬取的工作CrawlSpider类更适合。

    (2)使用:

    它与Spider类的最大不同是多了一个rules参数,其作用是定义提取动作。在rules中包含一个或多个Rule对象,Rule类与CrawlSpider类都位于scrapy.contrib.spiders模块中。

    class scrapy.contrib.spiders.Rule (
    link_extractor, callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None )

                     其中:

link_extractorLinkExtractor,用于定义需要提取的链接。

callback参数:当link_extractor获取到链接时参数所指定的值作为回调函数。

                      callback参数使用注意:

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

follow:指定了根据该规则从response提取的链接是否需要跟进。当callback为None,默认值为true

process_links:主要用来过滤由link_extractor获取到的链接。

process_request:主要用来过滤在rule中提取到的request

2.LinkExtractor

(1)概念:

顾名思义,链接提取器。

(2) 作用:

response对象中获取链接,并且该链接会被接下来爬取。

(3) 使用:

通过SmglLinkExtractor提取希望获取的链接。

classscrapy.contrib.linkextractors.sgml.SgmlLinkExtractor(
allow=(),deny=(),allow_domains=(),deny_domains=(),deny_extensions=None,restrict_xpaths=(),tags=('a','area'),attrs=('href'),canonicalize=True,unique=True,process_value=None)

主要参数:

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

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

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

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

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

三.RUN!

  1. shell中验证

    开始编写代码之前,使用scrapyshell查看使用SmglLinkExtractor在网页中获取到的链接:

    scrapy shell http://blog.csdn.net/u012150179/article/details/11749017

    继续import相关模块:

    fromscrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

    现在使用SgmlLinkExtractor查看在当前网页中获得的链接:

    item=SgmlLinkExtractor(allow=('/u012150179/article/details')).extract_links(response)

    其中item为包含Link()对象的列表,现在显示其中的text元素(就是获取到的文章链接对应的文章标题):

    for i in item:
        print i.text

    部分结果截图:

    对照网页可以得到此时获取的是当前网页中所有满足allow条件的链接,不仅包含“下一篇”的链接,还有网页侧边栏“阅读排行“、”评论排行“中的文章链接。为了只获得”下一篇“文章链接,这就要进行所有链接的筛选,引入参数restrict_xpaths,继续:

    item= SgmlLinkExtractor(allow=('/u012150179/article/details'),restrict_xpaths=('//li[@class="next_article"]')).extract_links(response)

    这是在如上查看结果,便提取出了“下一篇”文章链接。

    注意:在shell中并不对提取到的link进行跟进。

    在这里不得不提的就是scrapy shell是对调试、验证很有用的交互工具。应该掌握。

    在shell中进行了验证后进入写代码阶段。

  2. 编写代码

    (1)items.py和pipelines.py以及settings.py与之前教程类似,不详细描述。

    (2)爬虫编写。

    上码:

    # -*- coding:utf-8 -*-
    
    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import Selector
    from CSDNBlogCrawlSpider.items import CsdnblogcrawlspiderItem
    
    class CSDNBlogCrawlSpider(CrawlSpider):
    
        """继承自CrawlSpider,实现自动爬取的爬虫。"""
    
        name = "CSDNBlogCrawlSpider"
        #设置下载延时
        download_delay = 2
        allowed_domains = ['blog.csdn.net']
        #第一篇文章地址
        start_urls = ['http://blog.csdn.net/u012150179/article/details/11749017']
    
        #rules编写法一,官方文档方式
        #rules = [
        #    #提取“下一篇”的链接并**跟进**,若不使用restrict_xpaths参数限制,会将页面中所有
        #    #符合allow链接全部抓取
        #    Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'),
        #                          restrict_xpaths=('//li[@class="next_article"]')),
        #         follow=True)
        #
        #    #提取“下一篇”链接并执行**处理**
        #    #Rule(SgmlLinkExtractor(allow=('/u012150179/article/details')),
        #    #     callback='parse_item',
        #    #     follow=False),
        #]
    
        #rules编写法二,更推荐的方式(自己测验,使用法一时经常出现爬到中间就finish情况,并且无错误码)
        rules = [
            Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'),
                                  restrict_xpaths=('//li[@class="next_article"]')),
                 callback='parse_item',
                 follow=True)
        ]
    
        def parse_item(self, response):
    
            #print "parse_item>>>>>>"
            item = CsdnblogcrawlspiderItem()
            sel = Selector(response)
            blog_url = str(response.url)
            blog_name = sel.xpath('//div[@id="article_details"]/div/h1/span/a/text()').extract()
    
            item['blog_name'] = [n.encode('utf-8') for n in blog_name]
            item['blog_url'] = blog_url.encode('utf-8')
    
            yield item
    

    运行:

    scrapy crawl CSDNBlogCrawlSpider

    得到的效果如教程(五)一致。

    其中指出和教程(五)所编写爬虫方法的差异:

    首先,基类CrawlSpider提供了更完善的自动多网页爬取机制,只需要我们配置的就是rules,通过Rule对象实现链接的提取与跟进,恩,对,没了。。。就这样。详细的注释也都在程序中。

    进行到这里,就将本篇文章主题讲述完毕,核心是CrawlSpider,主要方法是rules。

Scrapy精华教程(六)——自动爬取网页之II(CrawlSpider),布布扣,bubuko.com

时间: 2024-07-31 07:23:36

Scrapy精华教程(六)——自动爬取网页之II(CrawlSpider)的相关文章

【转】 Scrapy研究探索(六)——自动爬取网页之II(CrawlSpider)

转自http://blog.csdn.net/u012150179/article/details/34913315 一.目的. 在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构, 在pipelines.py中实现获得数据的过滤以及保存. 但是以上述方法只能爬取start_url列表中的网页,而网络爬虫如googl

Scrapy研究探索(六)——自己主动爬取网页之II(CrawlSpider)

原创,转载注明:http://blog.csdn.net/u012150179/article/details/34913315 一.目的. 在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构, 在pipelines.py中实现获得数据的过滤以及保存. 可是以上述方法仅仅能爬取start_url列表中的网页.而网络爬

python网络爬虫之使用scrapy自动爬取多个网页

前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面章节的网页,可以看到增加了上一页 对应的网页代码: 通过对比上面的网页代码可以看到. 上一页,目录,下一页的网页代码都在<div>下的<a>元素的href里面.不同的是第一章只有2个<a>元素,从二章开始就有3个<a>元素.因此我们可以通过<div>

[python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

[python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pythonpython爬虫正则表达式html知识总结 2016-04-07 06:13 3615人阅读 评论(4) 收藏 举报  分类: Python爬虫(23)  Python基础知识(17)  版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ 这篇文章主要是介绍Pytho

python--输入检索词自动爬取百度搜索页标题信息

背景:在百度每次输入关键词检索后,会出现很多的检索页,不利于有效阅读,为更方便收集检索信息,编写了一个可以收集每个检索页与检索词相关的十条检索信息(百度在每个检索页放置十条检索标题信息).可以根据需要选择爬取多少检索页,通过修改main()函数的depth变量 1 import urllib.request 2 import re 3 4 def get_html_text(url,data_lst,depth): 5 7 for i in range(depth): 8 9 # 根据分析构造网

python爬虫——爬取网页数据和解析数据

1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序.只要浏览器能够做的事情,原则上,爬虫都能够做到. 2.网络爬虫的功能   图2 网络爬虫可以代替手工做很多事情,比如可以用于做搜索引擎,也可以爬取网站上面的图片,比如有些朋友将某些网站上的图片全部爬取下来,集中进行浏览,同时,网络爬虫也可以用于金融投资领域,比如可以自动爬取一些金融信息,并进行投资分析等. 有时,我们比较喜欢的新闻网站可能有几个,每次

Python爬取网页信息

Python爬取网页信息的步骤 以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例. 1.确认网址 在浏览器中输入初始网址,逐层查找链接,直到找到需要获取的内容. 在打开的界面中,点击鼠标右键,在弹出的对话框中,选择“检查”,则在界面会显示该网页的源代码,在具体内容处点击查找,可以定位到需要查找的内容的源码. 注意:代码显示的方式与浏览器有关,有些浏览器不支持显示源代码功能(360浏览器,谷歌浏览器,火狐浏览器等

用puppeteer爬取网页数据初体验

用puppeteer爬取网页数据 业务需求,页面需要显示很多链接列表,像这样的. 我问项目经理要字典表,他笑咪咪地拍着我的肩膀说:"这边有点忙,要不按照这个自己抄一下吧". emmm- 我看了一下,数据大概有七八百条,一个一个录入,那不得搞到地老天荒.海枯石烂. 心口一股燥热,差点就要口吐莲花,舌吐芬芳了- 转念一想,做人要儒雅随和,念在平时没少蹭吃蹭喝的份上,咱先弄一下吧. 可是怎么弄呢? 一个一个输入是不可能的,我们需要录入每个组的标题.标题下的名称和链接,这是需要看网页源码,效率

一个咸鱼的Python爬虫之路(三):爬取网页图片

学完Requests库与Beautifulsoup库我们今天来实战一波,爬取网页图片.依照现在所学只能爬取图片在html页面的而不能爬取由JavaScript生成的图.所以我找了这个网站http://www.ivsky.com 网站里面有很多的图集,我们就找你的名字这个图集来爬取 http://www.ivsky.com/bizhi/yourname_v39947/ 来看看这个页面的源代码: 可以看到我们想抓取的图片信息在<li> 里面然后图片地址在img里面那么我们这里可以用Beautifu