zl程序教程

您现在的位置是:首页 >  其他

当前栏目

009:博客类爬虫项目实战

2023-03-15 22:05:03 时间

爬虫项目开发的第一步,首先需要对我们想要实现的爬虫项目的功能进行定位和分析,即进行需求分析工作。

项目分析:

在今天的项目中,我们建立的爬虫需要实现的功能有: 1、爬取博客中任意一个用户的所有博文信息。 2、将博文的文章名、文章URL、文章点击数、文章评论数等信息提取出来。 3、将提取出来的数据写入Mysql数据库中。

可以发现,该爬虫项目额主要目的是将博客中用户所有博文的相关信息提取出来并储存到数据库中。

该项目的难点有: 1、如何提取文章点击数,文章评论数等信息。 2、如何通过循环爬取某个用户的所有博文信息。 3、pipelines.py 中对信息的进一步处理。 4、Xpath 表达式与正则表达式的配合使用。 5、在Scrapy中模拟浏览器进行爬取。

实现思路:

该项目中,主要的实现有:

  • 1、使用Urllib模块手动编写响应爬虫实现。
  • 2、使用Scrapy框架编写响应爬虫项目实现。

但是考虑到Scrapy框架实现起来相对来说更方便,我们这里是使用Scrapy方法来编写。 使用框架的思路有两种:

  • 1、使用基于basic爬虫模板的爬虫实现
  • 2、使用基于crawl爬虫模板的自动爬虫实现。

在本项目中,我们将使用基于basic爬虫模板的爬虫实现,如果大家想尝试基于crawl爬虫模板的自动爬虫实现,可以关注专栏,后面的文章会写到。

实战编写:

接下来为大家逐步分析并实现本爬虫项目的编写。 首先,我们需要设计好本项目中需要用到的Mysql数据库,用来储存文章名,文章Url,文章点击数评论数等信息。 本项目中的Mysql数据库表结构如下图所示,其中数据库名字为hexun。表名为myhexum。

设计好数据库后,我们可以通过SQL语句建立设计好的数据库。 首先我们应该创建数据库hexun,

create database hexun

创建数据库之后,需要选择该数据库并在该数据库下创建对应的表格,SQL语句如下所示:

use hexum
create table myhexun(id int(10) auto_increment primary key not null,name varchar(30), url varchar(100),hits int(15),comment int(15));

创建表格后,我们可以通过show tables 来查看我们刚刚创建的表格是否成功。

可以看到,此时数据库hexun下的表已经有了他自己字段。 我们需要基于Scrapy框架编写我们的爬虫项目。 首先,可以在cmd命令行中创建对应的爬虫项目hexunpjt。如下图所示:

创建好爬虫项目之后,我们可以通过编辑器先编写爬虫项目中的items.py文件。将文件修改为如下所示:

编写好items.py文件之后,还需要编写pipelines.py 文件对爬取到的信息进一步处理,我们将pipelines.py文件修改为如下所示,关键部分已注释。

接下来我们还需要编写settings.py文件进行响应的配置。 首先我们需要开启ITEM_PIPELINES,将设置文件中的ITEM_PIPELINES修改为如下:

开始了ITEM_PIPELINES之后,为了避免爬虫被对方服务器通过我们的Cookie信息识别从而将我们的爬虫禁止,我们可以关闭使用Cookie,将设置文件中的COOKIES_ENABLED信息修改为如下所示:

随后,为了避免对方服务器的robots.txt文件对我们的爬虫进行限制,可以在文件中设置不遵循robots协议进行爬取。我们将设置文件中的ROBOTSTXT_OBEY部分设置为如下所示:

设置好配置文件之后,我们可以在本项目中创建一个爬虫。在cmd命令行中使用下面指令进行创建:(cd到项目中)

在此我们基于basic模板闯进一个名为myhexunspd的爬虫。接下来,我们需要编写该爬虫实现网页的爬取: 首先我们分析一下如何编写该爬虫: 我们打开某博客中任意一个用户的博文列表页。比如我们打开网址是: http://fjrs168.blog.hexun.com/ 打开后:

出现上图界面。 我们需要对这个页面中要提取的信息进行分析。

所以我们的Xpath表达式可以为:

"//span[@class='ArticleTitleText']/a/text()"

文章URL的Xpath表达式为:

"//span[@class='ArticleTitleText']/a/@href"

可以看到,源代码中没有包含文章的点击数和阅读数等信息。 因为这些信息是通过javascrapt脚本动态获取的。此时我们可以使用Fiddler工具进行分析。

通过分析我们会发现,所示click108659235对应的值就是我们所查看的博文列表当前阅读数。click108641909对应的是第二篇。comment108641909对应的是评论数。

我们可以在该网页中通过正则表达式将对应的博文阅读数评论数提取出来。 阅读数: "clickd*?’,’(d*?)’ " 评论数: "commentd*?’,’(d*?)’ "

通过fiddler分析出来他对应的网址: 通过正则表达式将储存评论数和阅读数的网址信息提取出来:

''
</code></pre> 
<p>接下来我们要:<br> 1、获取对应的点击数和评论数的网址<br> 2、通过urllib.request爬取对应储存博文的点击数和评论数的网址中的数据<br> 3、使用正则表达式将博文的点击数和评论数提取出来</p> 
<p>我们先实现获取任意一个用户的所以博文:<br> 将爬虫文件myhexunspd.py修改为如下所示:<br> <img src="https://img-blog.csdnimg.cn/20190127210427491.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br> <img src="https://img-blog.csdnimg.cn/20190127210445844.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br> <img src="https://img-blog.csdnimg.cn/20190127210505315.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br> <img src="https://img-blog.csdnimg.cn/2019012721051680.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br> <img src="https://img-blog.csdnimg.cn/20190127210527497.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br> 比如我们要修改其他用户的信息,只需要更改爬虫文件中的uid即可。<br> 比如,我们首先找一个博客网址如下:<br> <a href="http://shihanbingblog.blog.hexun.com/">http://shihanbingblog.blog.hexun.com/</a></p> 
<p>将uid = “19940007”<br> 修改为uid = “shihanbingblog”<br> 即可以实现爬取另一个用户的博文信息。</p> 
<h2><a id="_128"></a>调试与运行:</h2> 
<p>编写好对应的爬虫项目之后,<a href="http://xn--myhexunspd-5i2px5fucwgm90f5k7cqkmyo9cba353tt5bj28mea156i4twbjxno7c.py">我们可以运行该爬虫项目下的爬虫文件myhexunspd.py</a>。如下所示:</p> 
<pre><code>scrapy crawl myhexunspd --nolog
</code></pre> 
<p>基本上完了。有点仓促。<br> 过几天再做修改。</p>