实时文章采集(如何利用Python编写的异步爬虫框架(图)实例 )

优采云 发布时间: 2022-02-01 17:10

  实时文章采集(如何利用Python编写的异步爬虫框架(图)实例

)

  一、scrapy简介

  scrapy 是一个用 Python 编写的异步爬虫框架。它基于 Twisted 实现,运行在 Linux/Windows/MacOS 等各种环境中。具有速度快、扩展性强、使用方便等特点。即使是新手也能快速掌握并编写所需的爬虫程序。 scrapy 可以在本地运行或部署到云端 (scrapyd) 以获取真正的生产级数据采集系统。

  我们通过一个示例来学习如何使用scrapy 来采集来自网络的数据。 《博客园》是一篇综合性的技术资料网站,这次我们的任务是采集网站MySQL类下所有文章的标题、摘要和发布日期,读数的数量,共4个字段。最终结果是一个收录所有 4 个字段的文本文件。如图:

  

  最终得到的数据如下,每条记录有四行,分别是标题、阅读次数、发表时间和文章摘要:

  

  二、安装scrapy

  让我们看看如何安装scrapy。首先,您的系统中必须有 Python 和 pip。本文以最常见的 Python2.7.5 版本为例。 pip 是 Python 的包管理工具,一般 Linux 系统默认安装。在命令行输入以下命令并执行:

  sudo pip install scrapy -i http://pypi.douban.com/simple –trusted-host=pypi.douban.com

  pip会从豆瓣的软件源下载安装scrapy,所有依赖包都会自动下载安装。 “sudo”表示以超级用户权限执行此命令。所有进度条完成后,如果提示类似“Successfully installed Twisted, scrapy ...”,则安装成功。

  三、scrapy 交互环境

  scrapy 还提供了一个交互式 shell,可以让我们轻松地测试解析规则。 scrapy安装成功后,在命令行输入scrapy shell,启动scrapy的交互环境。 scrapy shell的提示符是三个大于号>>>,表示可以接收命令。我们首先使用 fetch() 方法获取首页内容:

  >>> fetch( “https://www.cnblogs.com/cate/mysql/” )

  如果屏幕显示如下输出,则表示已获取网页内容。

  2017-09-04 07:46:55 [scrapy.core.engine] INFO: Spider opened

2017-09-04 07:46:55 [scrapy.core.engine] DEBUG: Crawled (200)

(referer: None)

  得到的响应会保存在响应对象中。该对象的status属性表示HTTP响应状态,一般为200。

  >>> print response.status

200

  text属性表示返回的内容数据,从中可以解析出想要的内容。

  >>> print response.text

u'\r\n\r\n\r\n

\r\n

\r\n

\r\n

MySQL – \u7f51\u7ad9\u5206\u7c7b – \u535a\u5ba2\u56ed\r\n

  可以看出是乱七八糟的HTML代码,无法直观的找到我们需要的数据。这时候我们可以通过浏览器的“开发者工具”获取指定数据的DOM路径。用浏览器打开网页后,按F12键启动开发者工具,快速定位到指定内容。

  

  可以看到我们需要的4个字段在/body/div(id=”wrapper”)/div(id=”main”)/div(id=”post_list”)/div(class=”post_item ”) / div(class=”post_item_body”) / ,每个“post_item_body”收录一篇文章文章的标题、摘要、发表日期和阅读次数。我们先得到所有的“post_item_body”,然后从中解析出每个文章的4个字段。

  >>> post_item_body = response.xpath( “//div[@id=’wrapper’]/div[@id=’main’]/div[@id=’post_list’]/div[@class=’post_item’]/div[@class=’post_item_body’]” )

>>> len( post_item_body )

  20

  响应的xpath方法可以使用xpath解析器来获取DOM数据。 xpath的语法请参考官网文档。您可以看到我们在首页上获得了所有 20 篇 文章 文章的 post_item_body。那么如何提取每个文章的这4个字段呢?

  我们以第一篇文章为例。先取第一个 post_item_body:

  >>> first_article = post_item_body[ 0 ]

  标题在 post_item_body 节点下的 h3/a 中。 xpath方法中text()的作用是取当前节点的文本,而extract_first()和strip()提取xpath表达式中的节点,过滤掉前后空格和回车:

  >>> article_title = first_article.xpath( “h3/a/text()” ).extract_first().strip()

>>> print article_title

  Mysql表操作和索引操作

  然后以类似的方式提取文章摘要:

  >>> article_summary = first_article.xpath( “p[@class=’post_item_summary’]/text()” ).extract_first().strip()

>>> print article_summary

  表操作:1.表创建:如果不存在则创建表 table_name(字段定义);示例:如果不存在则创建表 user(id int auto_increment, uname varchar(20), address varch ...

  在提取post_item_foot的时候,发现提取了两组内容,第一组是空内容,第二组是文字“Posted on XXX”。我们提取第二组内容,过滤掉“published on”这个词:

  >>> post_date = first_article.xpath( “div[@class=’post_item_foot’]/text()” ).extract()[ 1 ].split( “发布于” )[ 1 ].strip()

>>> print post_date

2017-09-03 18:13

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线