Python爬虫框架Scrapy之爬取糗事百科大量段子数据
来源:互联网 发布:网络举报工作流程 编辑:程序博客网 时间:2024/04/29 03:51
如上篇文章《Python爬虫框架之Scrapy详解》(传送门:Python爬虫框架之Scrapy详解)所述。
首先,准备scrapy环境:
- 安装Python,pip,使用pip安装lxml和scrapy。
- 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
喜欢的可以关注微信公众号:
参考
- 我自己的头条号:Python爬虫框架Scrapy之爬取糗事百科大量段子数据
- Python爬虫框架Scrapy之爬取糗事百科大量段子数据
- python 爬虫 爬取糗事百科段子
- Python爬虫 爬取糗事百科段子
- Python爬虫爬取糗事百科段子
- Python爬虫 爬取糗事百科段子
- Python爬虫实战一之爬取糗事百科段子
- Python爬虫实战一之爬取糗事百科段子
- Python爬虫实战一之爬取糗事百科段子
- Python爬虫实战一之爬取糗事百科段子
- Python爬虫实战之爬取糗事百科段子
- Python爬虫实战一之爬取糗事百科段子
- Python爬虫实战一之爬取糗事百科段子
- 利用Scrapy爬取糗事百科段子
- [Scrapy]爬取糗事百科段子
- Python爬虫实战(1):爬取糗事百科段子
- Python爬虫实战(1):爬取糗事百科段子
- Python 爬虫 简单实例 爬取糗事百科段子
- python爬虫小项目:爬取糗事百科段子
- 单机版 solr服务器安装到linux环境
- C# 简单小例子:显示输入数字最大值、水仙花数、continue用法
- 二叉树最近公共父节点
- 移动测试领域遇到的MCC是什么意思?
- LeetCode题解–143. Reorder List
- Python爬虫框架Scrapy之爬取糗事百科大量段子数据
- CKEditor实现图片上传
- 插入排序(INSERTION-SORT) PYTHON实现
- 关于Java.List 下的subList
- JSP 文件上传
- 非线性方程组
- selenium与firefox、 chrome版本对应关系
- 安卓串口通信 CH340 341
- Swift 3.0 集成信鸽推送