Python爬虫框架Scrapy之爬取糗事百科大量段子数据

来源:互联网 发布:网络举报工作流程 编辑:程序博客网 时间:2024/04/29 03:51

如上篇文章《Python爬虫框架之Scrapy详解》(传送门:Python爬虫框架之Scrapy详解)所述。

首先,准备scrapy环境:

  1. 安装Python,pip,使用pip安装lxml和scrapy。
  2. scrapy startproject qiubai新建一个名为qiubai的scrapy爬虫项目。

这里写图片描述

新建qiubai爬虫项目

使用PyCharm打开,项目结构如图:

这里写图片描述

定义QiubaiItem:

新建项目之后,在items.py里面定义我们需要爬取的段子数据的数据结构。

那怎么知道我们要爬取哪些数据呢?去糗事百科段子页面看一下,如图:

这里写图片描述

段子数据特征

一个糗事百科段子差不多包含了用户头像、个人主页链接、昵称、性别、年龄、段子内容、该段子的主页链接、该段子的点赞数、评论数这么9项内容。

因此,我们在items.py中定义QiubaiItem如下:

这里写图片描述

编写爬虫QiubaiSpider

定义好QiubaiSpider之后,我们就可以在spiders文件夹中编写我们的爬虫spider了。scrapy.spiders.Spider的主要方法是parse方法,主要属性有name,allowed_domains,start_urls等,所以我们创建QiubaiSpider来继承Spider,然后定义好这些属性。如下图:

这里写图片描述

由于一般的网站很可能会通过User-Agent,cookie等内容来简单的反爬虫,识别你是用户访问的还是机器访问的,所以,我们这里一般都会写上headers,在每次请求的时候都带上这个headers,这样,就可以绕过一些很简单的反爬虫程序。

但是,在scrapy中,我们一般把配置项放在settings.py中,这个文件中保存了很多scrapy运行时的配置信息,比如默认的headers,User-Agent,用户定义的pipeline等等。所以,我们把Spider中的headers转移到settings.py中。如图:

定位网页中的Item数据,编写xpath提取Item

创建好基本的QiubaiSpider之后,就可以分析网页中段子数据在网页HTML中的位置等信息,然后在QiubaiSpider的parse方法中使用选择器的xpath提取段子数据了。如图:

这里写图片描述

如上图,id为content-left的div元素中的每一个class属性为”article block untagged mb15”的div都代表了一个段子。对应的xpath的表达式就是’//div[@id=”content-left”]/div[@class=”article block untagged mb15”]’。这样,就获取到了每一个段子的选择器,然后在每一个段子的选择器上,可以继续使用xpath来继续提取段子的各种特征。特征定位如图:

这里写图片描述

上图中段子特征与我们前面定义的QiubaiItem的属性是一一对应的。

然后,就可以开始写我们的parse方法了。

提取段子的每一个特征的xpath表达式就交给读者写了,如果有哪里不懂的,可以关注后在文章中评论描述一下,我会一一解答。

最终,QiubaiSpider完成如下:

这里写图片描述

但是我们翻了两页,发现有些发段子的用户是匿名用户,如图:

这里写图片描述

这样,就肯定获取不到用户的头像,昵称,性别,年龄了,所以,我们在parse方法中要处理好这种异常情况。

最终真正完成的QiubaiSpider如下图:

这里写图片描述

但是,Spider很容易在爬取的过程中出现503 Service Unavailable。所以,这里改成继承CrawlSpider,同时,实现的parse方法改成parse_start_url方法。
@href属性不能通过extract_first()方法提取出来,只能通过extract()提取。
另外,我们也可以从段子中提取出段子在糗百中的id。

这里写图片描述

编写pipeline,保存Item

编写好QiubaiSpider后,我们就能获取到item了。

然后,我们需要在pipelines.py中编写QiubaiPipeline来保存我们的item数据。

这里,我们使用MongoDB来保存item数据。如图:

这里写图片描述

最终项目结构:

最终,我们完成了我们的qiubai的scrapy爬虫,最终的项目结构如图:

这里写图片描述

使用scrapy crawl qiubai运行完之后,MongoDB中数据如下:

这里写图片描述

感兴趣的可以关注:

github地址:https://github.com/ychenracing/Spiders

喜欢的可以关注微信公众号:

这里写图片描述

参考

  1. 我自己的头条号:Python爬虫框架Scrapy之爬取糗事百科大量段子数据
原创粉丝点击