新手爬虫之创建第一个完整的scrapy项目

创建第一个scrapy工程-糗事百科

最近不少小伙伴儿,问我关于scrapy如何设置headers的问题,时间久了不怎么用,还真有的忘,全靠记忆去写了,为了方便大家参考,也方便我以后的查阅,这篇文章就诞生了。本章内容从实战出发让我们熟悉如何用scrapy写爬虫,本篇内容主要是实战,不讲述过多的理论性东西,因为讲多了我也不知道。

明确目标

首先,我们要明确我们的爬虫最终的目的是什么,这里我们要做的是爬取糗事百科的热门分类的前10页信息。包括发布者和内容,因为入门教程所以我们写的简单点主要是熟悉这个过程,这个如何入手呢?

分析链接的变化

一般我们会通过点击下一页,然后观察地址栏的信息来总结规律。

第一页也就是首页地址为:https://www.qiushibaike.com/

我们点击下一页可以发现第二页的的连接为:https://www.qiushibaike.com/8hr/page/2/

第三页:https://www.qiushibaike.com/8hr/page/3/

。。。以此类推第十页的连接为:https://www.qiushibaike.com/8hr/page/10/

由此我们发现规律,从第二页开始连接可以用https://www.qiushibaike.com/8hr/page/页数/来表示,有时候我比较喜欢试探,怎么说呢,我们知道这个规律是从第二页开始的,但是第一页是没有这个规律,但是我们不防试一试把第一页的https://www.qiushibaike.com/改为https://www.qiushibaike.com/8hr/page/1/。然后我们访问看看ok可以正常显示。

于是我们就确定了链接,也就是页数改为1-10就可以访问相应的页数了。

安装scrapy

我们要确保正确安装好了scrapy

针对mac和linux直接运行pip安装即可。

但是windows的坑就比较多了,关于windows的安装请参考我之前写的这篇文章

:https://www.cnblogs.com/c-x-a/p/8996716.html。这里就不多说了。

创建scrapy工程

好了下面我们开始创建工程首先我们使用scrapy的第一个命令startproject,

使用方法:scrapy startproject xxx xxx就是你的项目名,这里我们给我们的项目起名qiushibaile。

然后我们会发现了多了一个文件名为qiushibaike的文件夹

然后我们通过命令创建一个事例工程

进入qiushibaikle

然后用下面scrapy的第二个命令genspider

使用方法 scrapy genspider spider_name domain

spider_name就是爬虫的名字,每一个爬虫有一个名字这个名字是唯一的,后面运行的时候也是通过这个名字来运行的,下面的qsbk就是我们的爬虫名字,domain指定爬虫的域也就是爬虫的范围。查找网页我们发现域名为

看到以下命令证明我们成功的创建了项目。

开始编写spider文件

我们这里使用pycharm把我们的爬虫工程加载进来。

目录结构如下

(注意:run.py是我后期自己添加的一个爬虫入口文件)

修改settings.py文件

无视robots协议,将

改为

修改spider.py

我们先来看看我们访问的网页源码对不对。

把qsbk.py 改为

创建入口文件运行

在项目的根目录下创建一个run.py 来运行我们的工程

run.py的内容如下

运行以后我们发现一堆红色的信息,这些都是scrapy 的日志内容,我们注意找是否有黑色字体的内容,一般print出来的内容是黑色字体和含有error的信息,以此了解我们的爬虫哪个地方出错了,

我们找到了error关键字,可以得知我们的爬虫出错了

按照提示可以知道链接被关闭访问失败了,这种情况下我们就被反爬了,常见的应对措施是修改headers头,下面我们就通过修改中间件来修改headers。

修改中间件加入headers信息

首先修改middlewares.py

然后在settings启用我们的中间件和设定MY_USER_AGENT的值:

然后我们再次运行,run.py文件。

再次运行

我们成功获取了源码,

。然后我们就需要进行解析内容了。

解析网页中所需要的内容

因为这10页的结构是类似的我们就拿第一页为例:

在这里我们使用的解析方法为xpath,通过xpath可以解析出我们需要的内容,

打开谷歌浏览器的开发者工具,首先通过Elements模块获取当前页所有内容的大概区域我们可以写这样的一个xpath。

然后我们发现一页25个内容,然后再去在每个内容里进行查找当前的标题和内容。

在qsbk.py文件的parse方法里加入这段内容

修改scrapy的日志显示等级方便查看

前面运行过程中我们发现scrapy的日志信息非常的多,不容易找到我们想要的内容,这个时候我们可以通过修改settings.py文件通过修改log的等级,只显示指定类型的log,打开settings.py我们加上下面的一句来设定log的等级为error

也就是只有错误的时候才显示scrapy的log信息。

然后再次运行,看到了我们我们需要的内容发布者和发布内容。

得到了这些我们现在只是打印了下,下面我们就来说如何存储

保存结果到mongodb

mongodb是一个key-value型的数据库,使用起来简单,数据结构是键值对类型,在存储过程中如果表不存在就会创建一个新的表。

下面我们开始来存储我们的数据。

构造数据

因为我们需要接收一个键值对类型的数据,一般用dict,所以我们将代码改成如下形式。qsbk.py文件新增内容:

上面我们构造出了我们需要存储的数据,然后通过yield传递到存储部分,

下一步我们就要开始创建mongo连接的部分了。

创建mongo连接文件

把pipelines.py 文件改为

然后修改settings.py,首先添加mongo的几个连接参数

然后打开pipe通道

运行查看数据

我这里用的adminmongo,打开adminmogo连接数据库,可以看到我们数据已经存在了。

结语

到此为止,我们一个简单完整的scrapy小项目就完成了。 为了方便查看代码已经上传git:https://github.com/muzico425/qsbk.git

更多爬虫学习以及python技巧,请关注公众号:python学习开发。

如果您喜欢我的文章不防动动小手转发一波,谢谢。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181101G14KX600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券