美文网首页python学习get√Python
Python爬虫框架Scrapy快速入门

Python爬虫框架Scrapy快速入门

作者: 向右奔跑 | 来源:发表于2016-05-17 22:04 被阅读14459次

    一、Scrapy是什么?

    先看官网上的说明,http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

    其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

    Scrapy是一个非常好用的爬虫框架,它不仅提供了一些开箱即用的基础组件,还提供了强大的自定义功能。

    框架学习的规律就是修改配置文件,填充代码就可以了。复杂之处就是一开始代码很多,不同的功能模块,scrapy也是这样的吗?

    二、Scrapy安装

    看了一个网上的文章,说windows下安装的比较多,Scrapy前置需要安装很多包,也有各种各样的问题,我是在mac下安装的,安装了两次都比较顺利。(python的版本是2.7.10 系统自带)

        pip install scrapy
    

    提示six 需要升级,用命令升级失败,提示一个文件夹没有权限,修改文件夹权限后仍然不行,查看是一个临时文件。想卸载后six再安装也行。直接去下载six源码安装,就好了。再 pip install scrapy ,顺利!

    pip 安装 scrapy

    三、Scrapy创建项目

    Scrapy 提供了一个命令来创建项目 scrapy 命令,在命令行上运行:

         scrapy startproject jianshu
    

    我们创建一个项目jianshu用来爬取简书首页热门文章的所有信息。

    jianshu/
        scrapy.cfg
        jianshu/
            __init__.py
            items.py
            pipelines.py
            settings.py
            spiders/
                __init__.py
                ...
    

    spiders文件夹下就是你要实现爬虫功能(具体如何爬取数据的代码),爬虫的核心。在spiders文件夹下自己创建一个spider,用于爬取简书首页热门文章。
    scrapy.cfg是项目的配置文件。
    settings.py用于设置请求的参数,使用代理,爬取数据后文件保存等。

    四、Scrapy爬取简书首页热门文章

    1)新建jianshuSpider
    class Jianshu(CrawlSpider):
        name='jianshu'   # 运行时这个爬虫的名字
        start_urls=['http://www.jianshu.com']
        url = 'http://www.jianshu.com'
    
        def parse(self, response):
            selector = Selector(response)
            #.... 
            # response就是返回的网页数据
            # 处理好的数据放在items中,在items.py设置好你要处理哪些数据字段,这里我们抓取文章标题,url,作者,阅读数,喜欢,打赏数
            ## 解析处理数据的地方,用xpath解析处理数据
    
    

    要解析处理哪些数据,在items.py中定义好,相当于Java中的实体类:

    from scrapy.item import Item,Field
    
    class JianshuItem(Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        title = Field()
        author = Field()
        url = Field()
        readNum = Field()
        commentNum = Field()
        likeNum = Field()
    
    2)xpath的数据解析:
    articles = selector.xpath('//ul[@class="article-list thumbnails"]/li')
    
            for article in articles:
                title = article.xpath('div/h4/a/text()').extract()
                url = article.xpath('div/h4/a/@href').extract()
                author = article.xpath('div/p/a/text()').extract()
    
    

    解析的数据保存:

                item['title'] = title
                item['url'] = 'http://www.jianshu.com/'+url[0]
                item['author'] = author
    

    这时数据经解析处理好了,还有最重要一步,提交:

                yield item
    

    OK! 万事俱备,数据保存在哪里,以什么格式?
    在settings.py中加入两行代码:

    FEED_URI=u'/Users/apple/Documents/jianshu-hot.csv'
    FEED_FORMAT='CSV'
    

    如何运行这个爬虫?命令行:

         scrapy crawl jianshu
    

    是不是把简书首页上的文章信息都爬取到本地的csv文件里来了。

    等等还有一个问题,首页热门还有更多文章,点击“点击查看更多”就可以加载。怎样才能一网打尽把所有信息都爬取下来呢?就是要递归调用parse()方法。

    第一步,找到“点击查看更多”对应的url

            next_link = selector.xpath('//*[@id="list-container"]/div/button/@data-url').extract()[0]
    
    

    第二步,递归调用,将新的url传给parse方法,直到最后一页为止。

            if next_link :
                next_link = self.url+ str(next_link)
                print next_link
                yield Request(next_link,callback=self.parse)  #递归调用并提交数据
    

    大功告成,来看看成果。

    首页热门文章

    PS:
    1、增加所有文章的缩略图下载。一行代码:

                    urllib.urlretrieve(image[0], '/Users/apple/Documents/images/%s-%s.jpg' %(author[0],title[0]))
    

    注意:1)此处取出来的作者、标题还是集合,需要加上索引。2)有些文章是没有缩略图的。

    下载的热门文章图片

    2、提供源码下载
    https://github.com/ppy2790/jianshu.git

    相关文章

      网友评论

      • 62b4c5c61a04:好文章
      • yuyangkobe:学习
      • 漫步深渊的阿尔特留斯:楼主你爬出来的数据表格有经过自己排版吗?怎么这么美观.....为什么我生成的csv文件用excel打开很难看:pensive:
        JCYDSHANKS:2017-10-17 05:40:13 [boto] ERROR: Unable to read instance data, giving up
        2017-10-17 05:40:13 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
        2017-10-17 05:40:13 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
        2017-10-17 05:40:13 [scrapy] INFO: Enabled item pipelines:
        总报错这个 求楼主解答:blush:
        漫步深渊的阿尔特留斯:@向右奔跑 很感谢, 刚试了下果然很简明直观 Excel果然很难用
        向右奔跑: @Werther_198f 我用的Mac的Numbers打开的,用Excel打开看起来是不太好
      • dswd:Traceback (most recent call last):
        File "E:/pycharm project/jianshu-master/jianshu/main.py", line 1, in <module>
        from scrapy import cmdline
        File "C:\Python27\lib\site-packages\scrapy-1.3.3-py2.7.egg\scrapy\__init__.py", line 27, in <module>
        from . import _monkeypatches
        File "C:\Python27\lib\site-packages\scrapy-1.3.3-py2.7.egg\scrapy\_monkeypatches.py", line 2, in <module>
        from six.moves import copyreg
        ImportError: No module named six.moves
        我的一运行就报这个错误
        向右奔跑:@dswd 有一个库没有安装 six
      • 来世不做友人A:数据存到csv后每条数据后都有一个空行怎么解决
        右象限:2017-03-17 18:21:03 [scrapy.core.engine] DEBUG: Crawled (403) <GET http://www.jianshu.com/robots.txt&gt; (referer: None)
        2017-03-17 18:21:03 [scrapy.core.engine] DEBUG: Crawled (403) <GET http://www.jianshu.com/trending/monthly&gt; (referer: None)
        2017-03-17 18:21:03 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <403 http://www.jianshu.com/trending/monthly&gt;: HTTP status code is not handled or not allowed
        不知道为什么简书总是爬不了,是不是反扒了?
        向右奔跑:@来世不做友人A http://www.jianshu.com/p/efa80ef9ebd0
        向右奔跑:没有遇到过你说的问题,你再检查一下
      • 撵规:你的代码也是这个错 我以前的scrapy代码没错的 现在也报这个错 :persevere:
      • 撵规:你好 为什么一直AttributeError: TelnetConsole instance has no attribute 'port'报这个错啊
      • c57dddf3b833:安装six错误的解决方法:sudo pip install --ignore-installed six,然后再:sudo pip install scrapy
        向右奔跑:@c57dd 谢谢~
      • JRlu:我在anaconda下的spyder运行楼主的程序,为啥跑着跑着就console就死了。。。
        向右奔跑:@JRlu 晚上帮你看一下,好像是middlewares的问题
        JRlu:@向右奔跑 2016-08-18 10:55:07 [scrapy] INFO: Scrapy 1.1.1 started (bot: jianshu)
        2016-08-18 10:55:07 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'jianshu.spiders', 'FEED_URI': u'/Users/apple/Documents/jianshu-monthly.csv', 'SPIDER_MODULES': ['jianshu.spiders'], 'BOT_NAME': 'jianshu', 'ROBOTSTXT_OBEY': True, 'FEED_FORMAT': 'CSV'}
        2016-08-18 10:55:07 [scrapy] INFO: Enabled extensions:
        ['scrapy.extensions.feedexport.FeedExporter',
        'scrapy.extensions.logstats.LogStats',
        'scrapy.extensions.telnet.TelnetConsole',
        'scrapy.extensions.corestats.CoreStats']
        2016-08-18 10:55:08 [scrapy] INFO: Enabled downloader middlewares:
        ['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
        'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
        'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
        'scrapy.downloadermiddlewares.retry.RetryMiddleware',
        'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
        'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
        'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
        'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
        'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware',
        'scrapy.downloadermiddlewares.stats.DownloaderStats']
        2016-08-18 10:55:08 [scrapy] INFO: Enabled spider middlewares:
        ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
        'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
        'scrapy.spidermiddlewares.referer.RefererMiddleware',
        'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
        'scrapy.spidermiddlewares.depth.DepthMiddleware']
        2016-08-18 10:55:08 [scrapy] INFO: Enabled item pipelines:
        []
        2016-08-18 10:55:08 [scrapy] INFO: Spider opened
        2016-08-18 10:55:08 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
        2016-08-18
        向右奔跑:@JRlu 有什么提示信息吗?
      • 6b0d516492ce:出现Ignoring response <403 http://www.jianshu.com/top/monthly&gt;: HTTP status code is not handled or not allowed
        Hondsome:关闭代理,在settings.py下添加

        DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
        }
        1797d2076af3:@6b0d516492ce 添加header
      • xinxingzhao:我在获取下一页信息时,只是提取了两条数据。
        向右奔跑:@xinxingzhao 看一下控制台的信息或debug一下
      • a65347049626:学习~
        向右奔跑:@O_OWei 加油!
      • whatbeg:lz有无完整代码分享呢?
        whatbeg:不过为什么递归只能爬6页?
        whatbeg:@向右奔跑 多谢~
        向右奔跑:@whatbeg http://pan.baidu.com/s/1dFqIGfR ab5j

      本文标题:Python爬虫框架Scrapy快速入门

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