开源 Python 网络爬虫框架 Scrapy:http://blog.csdn.net/zbyufei/article/details/7554322

介绍

所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。不过由于一个网站的网页很多,而我们又不可能事先知道所有网页的URL地址,所以,如何保证我们抓取到了网站的所有HTML页面就是一个有待考究的问题了。

一般的方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。

上面介绍的只是爬虫的一些概念而非搜索引擎,实际上搜索引擎的话其系统是相当复杂的,爬虫只是搜索引擎的一个子系统而已。

下面介绍一个开源的爬虫框架 Scrapy。

一、概述

Scrapy是一个用 Python 写的 Crawler Framework ,简单轻巧,并且非常方便,并且官网上说已经在实际生产中在使用了,不过现在还没有 Release 版本,可以直接使用他们的 Mercurial 仓库里抓取源码进行安装。

Scrapy 使用 Twisted 这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。整体架构如下图所示:

绿线是数据流向,首先从初始 URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider 分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到 Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。

二、组件

scrapy 组件

  • 1、Scrapy Engine(Scrapy引擎):Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。
  • 2、Scheduler(调度器):调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。
  • 3、Downloader(下载器):下载器的主要职责是抓取网页并将网页内容返还给蜘蛛( Spiders)。
  • 4、Spiders(蜘蛛):蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。

         Spiders ( 蜘蛛 的整个抓取流程(周期)是这样的:

  1. 首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。
  2. 在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。
  3. 在回调函数中,你解析网站的内容,同程使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。
  4. 最后,从蜘蛛返回的项目通常会进驻到项目管道。
  • 5、Item Pipeline(项目管道):项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。他们获取了项目并执行他们的方法,同时他们还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。

项目管道通常执行的过程有:

  1. 清洗HTML数据
  2. 验证解析到的数据(检查项目是否包含必要的字段)
  3. 检查是否是重复数据(如果重复就删除)
  4. 将解析到的数据存储到数据库中
  • 6、Downloader middlewares(下载器中间件): 下载中间件是位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。它提供了一个自定义的代码的方式来拓展Scrapy的功能。下载中间器是一个处理请求和响应的钩子框架。他是轻量级的,对Scrapy尽享全局控制的底层的系统。
  • 7、Spider middlewares(蜘蛛中间件):蜘蛛中间件是介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。它提供一个自定义代码的方式来拓展Scrapy的功能。蛛中间件是一个挂接到Scrapy的蜘蛛处理机制的框架,你可以插入自定义的代码来处理发送给蜘蛛的请求和返回蜘蛛获取的响应内容和项目。
  • 8、Scheduler middlewares(调度中间件):调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是处从Scrapy引擎发送到调度的请求和响应。他提供了一个自定义的代码来拓展Scrapy的功能。

三、数据处理流程

Scrapy的整个数据处理流程有Scrapy引擎进行控制,其主要的运行方式为:

  1. 引擎打开一个域名,然后蜘蛛处理这个域名。蜘蛛获取第一个爬取的URL。
  2. 引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。
  3. 引擎从调度那获取接下来进行爬取的页面。
  4. 调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。
  5. 当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。
  6. 引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。
  7. 蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。
  8. 引擎将抓取到的项目项目管道,并向调度发送请求。
  9. 系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系。

四、安装:

Scrapy是一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

下面介绍Scrapy在windows下的安装:

首先下载windows版:Scrapy-0.15.0.2842.win32.exe,直接安装。

安装之后不能直接运行scrapy提供的test,会提示错误,因为scrapy基于其他一些python库,需要把这些库都安装才行。

Twisted:Twisted Matrix 是一种用来进行网络服务和应用程序编程的纯 Python 框架,虽然 Twisted Matrix 中有大量松散耦合的模块化组件,但该框架的中心概念还是非阻塞异步服务器这一思想。Twisted的安装也非常简单,在这里直接下载windows平台下的相应版本即可:http://pypi.python.org/packages/2.7/T/Twisted/,

zope.interface:在这里下载http://pypi.python.org/pypi/zope.interface/3.8.0#downloads。zope.interface没有提供windows平台下的exe版,只提供了windows平台下的egg包。

ez_setup:下载http://pypi.python.org/pypi/ez_setup,安装。将egg文件放置在{python安装目录}\Scripts目录下。

打开CMD并切换至scripts目录,easy_install zope.interface-3.8.0-py2.6-win32.egg安装。

w3lib:zope.interface问题解决之后还会提示缺少w3lib,下载http://pypi.python.org/pypi/w3lib后安装即可

libxml2:使用scrapy的html解析功能时,会提示你缺少libxml2,所以我们先把这个也装上,地址http://xmlsoft.org/sources/win32/python/,下载相应的版本即可。

至此就可以使用Scrapy玩spider了,大家可以根据文档写一个简单的爬虫试试,实际上使用scrapy做一个简易的爬虫甚至只需要几行代码就可以了,以后有空再详细说说使用方法,本文不做更多描述。

五、入门

本文参考Scrapy Tutorial里面的文档,翻译出来加上自己的理解,供大家学习。

在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容,这一切在Scrapy框架内实现将是很简单轻松的事情。

本教程主要内容包括一下四步:

  • 1. 创建一个新的Scrapy Project
  • 2. 定义你需要从网页中提取的元素Item
  • 3. 实现一个Spider类,通过接口完成爬取URL和提取Item的功能
  • 4. 实现一个Item PipeLine类,完成Item的存储功能

新建工程

首先,为我们的爬虫新建一个工程,首先进入一个目录(任意一个我们用来保存代码的目录),执行:

scrapy startproject Domz

最后的Domz就是项目名称。这个命令会在当前目录下创建一个新目录Domz,结构如下:

dmoz/  scrapy.cfg     dmoz/  __init__.py  items.py  pipelines.py  settings.py  spiders/  __init__.py  

scrapy.cfg: 项目配置文件
items.py: 需要提取的数据结构定义文件
pipelines.py: 管道定义,用来对items里面提取的数据做进一步处理,如保存等
settings.py: 爬虫配置文件
spiders: 放置spider的目录

定义Item

在items.py里面定义我们要抓取的数据:

from scrapy.item import Item, Field  class DmozItem(Item):  title = Field()  link = Field()  desc = Field()  

这里我们需要获取dmoz页面上的标题,链接,描述,所以定义一个对应的items结构,不像Django里面models的定义有那么多种类的Field,这里只有一种就叫Field(),再复杂就是Field可以接受一个default值。

实现Spider

spider只是一个继承字scrapy.spider.BaseSpider的Python类,有三个必需的定义的成员

name: 名字,这个spider的标识
start_urls: 一个url列表,spider从这些网页开始抓取
parse(): 一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表

所以在spiders目录下新建一个spider,dmoz_spider.py:

class DmozSpider(BaseSpider):  name = "dmoz.org"  start_urls = [  "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",  "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"  ]  def parse(self, response):  filename = response.url.split("/")[-2]  open(filename, 'wb').write(response.body)

提取Item

提取数据到Items里面,主要用到XPath提取网页数据:

scrapy有提供两个XPath选择器,HtmlXPathSelector和XmlXPathSelector,一个用于HTML,一个用于XML,XPath选择器有三个方法

select(xpath): 返回一个相对于当前选中节点的选择器列表(一个XPath可能选到多个节点)
extract(): 返回选择器(列表)对应的节点的字符串(列表)
re(regex): 返回正则表达式匹配的字符串(分组匹配)列表
一种很好的方法是在Shell里面对XPath进行测试:

scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/

现在修改parse()方法看看如何提取数据到items里面去:

def parse(self, response):  hxs = HtmlXPathSelector(response)  sites = hxs.select('//ul/li')  items = []  for site in sites:  item = DmozItem()  item['title'] = site.select('a/text()').extract()  item['link'] = site.select('a/@href').extract()  item['desc'] = site.select('text()').extract()  items.append(item)  return items  

实现PipeLine

PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。

PipeLine只有一个需要实现的方法:process_item,例如我们将Item保存到一个文件中:

def __init__(self):  self.file = open('jingdong.txt', 'wb')  def process_item(self, item, spider):  self.file.write(item['title'] + '\t'+ item['link'] + '\t' + item['desc']+'\n')  

到现在,我们就完成了一个基本的爬虫的实现,可以输入下面的命令来启动这个Spider:

scrapy crawl dmoz.org  

Scrapy之URL解析与递归爬取:

前面介绍了Scrapy如何实现一个最简单的爬虫,但是这个Demo里只是对一个页面进行了抓取。在实际应用中,爬虫一个重要功能是”发现新页面”,然后递归的让爬取操作进行下去。

发现新页面的方法很简单,我们首先定义一个爬虫的入口URL地址,比如Scrapy入门教程中的start_urls,爬虫首先将这个页面的内容抓取之后,解析其内容,将所有的链接地址提取出来。这个提取的过程是很简单的,通过一个html解析库,将这样的节点内容提取出来,href参数的值就是一个新页面的URL。获取这个URL值之后,将其加入到任务队列中,爬虫不断的从队列中取URL即可。这样,只需要为爬虫定义一个入口的URL,那么爬虫就能够自动的爬取到指定网站的绝大多数页面。

当然,在具体的实现中,我们还需要对提取的URL做进一步处理:

1. 判断URL指向网站的域名,如果指向的是外部网站,那么可以将其丢弃
2. URL去重,可以将所有爬取过的URL存入数据库中,然后查询新提取的URL在数据库中是否存在,如果存在的话,当然就无需再去爬取了。

下面介绍一下如何在Scrapy中完成上述这样的功能。

我们只需要改写spider的那个py文件即可,修改parse()方法代码如下:

from scrapy.selector import HtmlXPathSelector  def parse(self, response):  hxs = HtmlXPathSelector(response)  items = []  newurls = hxs.select('//a/@href').extract()  validurls = []  for url in newurls:  #判断URL是否合法  if true:  validurls.append(url)  items.extend([self.make_requests_from_url(url).replace(callback=self.parse) for url in validurls])  sites = hxs.select('//ul/li')  items = []  for site in sites:  item = DmozItem()  item['title'] = site.select('a/text()').extract()  item['link'] = site.select('a/@href').extract()  item['desc'] = site.select('text()').extract()  items.append(item)  return items  

开源 Python网络爬虫框架 Scrapy相关推荐

  1. Python网络爬虫框架 Scrapy简介

    Scrapy 网络爬虫框架 Scrapy的安装 cmd 执行: pip install scrapy测试安装: scrapy -h Scrapy介绍 Scrapy不是一个函数功能库,而是一个爬虫框架. ...

  2. 【Python学习系列五】Python网络爬虫框架Scrapy环境搭建

    1.网络爬虫库Scrapy 网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便.Scrap ...

  3. 网络爬虫框架Scrapy简介

    作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...

  4. 解析python网络爬虫pdf 黑马程序员_正版 解析Python网络爬虫 核心技术 Scrapy框架 分布式爬虫 黑马程序员 Python应用编程丛书 中国铁道出版社...

    商品参数 书名:Python应用编程丛书:解析Python网络爬虫:核心技术.Scrapy框架.分布式爬虫 定价:52.00元 作者:[中国]黑马程序员 出版社:中国铁道出版社 出版日期:2018-0 ...

  5. Python高级爬虫框架Scrapy简介

    2019独角兽企业重金招聘Python工程师标准>>> Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框 ...

  6. Python分布式爬虫框架Scrapy实战

    TIOBE 更新了 2021 年 10 月份编程语言指数排行榜. 榜单中共对 100 种编程语言进行了评级排名,其中 Python 成为 "20 多年来的新语言霸主",以 11.2 ...

  7. python爬虫天气实例scrapy_2017.08.04 Python网络爬虫之Scrapy爬虫实战二 天气预报...

    1.项目准备:网站地址:http://quanzhou.tianqi.com/ 2.创建编辑Scrapy爬虫: scrapy startproject weather scrapy genspider ...

  8. 网络爬虫框架——Scrapy框架解析

    一.为什么使用Scrapy框架? Scrapy是一个快速.高层次的屏幕抓取和web抓取的框架,可用于数据挖掘.监测和自动化检测,任何人都可以根据需要去进行修改. 二.Scrapy框架每个组件介绍 1. ...

  9. Python网络爬虫之scrapy爬虫的基本使用

    Scrapy爬虫的数据类型: 1. Request类:向网络上提交请求,跟requests库里的不是一个类型!2. Responce类:封装爬取内容3. ITEM:spider封装类 Responce ...

最新文章

  1. grasshop 犀牛5.0下载_新安|原创剑尊下载新版本 2020最新安卓版剑尊下载地址整理...
  2. 420一个像素多少个字节_一个Java方法能有多少个参数类型?这个好奇coder做了个实验...
  3. webpack4配置基础
  4. rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)
  5. 日语学习-多邻国-人
  6. 数据结构之顺序队列的优化
  7. MyBatis和Hibernate的优缺点对比。
  8. 添加内核驱动模块(4)(mydriver.c+ Konfig+Makefile )
  9. 粒子群算法(PSO)求解TSP问题
  10. html日期选择器小日历样式,9 款样式华丽的 jQuery 日期选择和日历控件
  11. 绿米开关如何重置_绿米智能开关评测
  12. 手机游戏公司设定的客户群体是大学生和农民工
  13. DDD与数据事务脚本
  14. win7 凭据管理无法保存
  15. 兽医外科设备的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. 使用Rosetta批量生成fasta
  17. Typora快捷输入,三步让你打出带类型代码块(前提:需搜狗输入法)
  18. 直播APP开发详细内容
  19. 10.MATLAB方差分析
  20. 响应式织梦模板婚纱照摄影类网站

热门文章

  1. 深度学习在美团配送ETA预估中的探索与实践 1
  2. 注意力机制-深度学习中的注意力机制+注意力机制在自然语言处理中的应用
  3. 2020全球工业互联网大会在沈阳召开,聚焦新业态、新模式,“新基建”促进国内国际双循环等热点
  4. Yann LeCun最新访谈:能量模型是通向自主人工智能系统的起点
  5. Tomcat:部署成功后不能正常访问local:8080,服务已经启动。
  6. 数据结构开发(3):线性表的顺序存储结构
  7. ActiveMQ 发送和接收消息
  8. python学习随笔day3
  9. 【USACO Feb 2014】Cow Decathlon
  10. 20155204 2016-2017-2《Java程序设计》课程总结