如上篇文章《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完成如下:
[外链图片转存失败(img-DqFnn4aM-1568995393617)(https://img-blog.csdn.net/20170524132337705?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYzMxNTgzODY1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
但是我们翻了两页,发现有些发段子的用户是匿名用户,如图:
这样,就肯定获取不到用户的头像,昵称,性别,年龄了,所以,我们在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