Python 爬虫6——Scrapy的安装和使用
前面我们简述了使用Python自带的urllib和urllib2库完成的一下爬取网页数据的操作,但其实能完成的功能都很简单,假如要进行复制的数据匹配和高效的操作,可以引入第三方的框架,例如Scrapy便是比较常用的爬虫框架。
一、Scrapy的安装:
1.最简单的安装方式:
根据官方主页的指导:http://www.scrapy.org/
使用pip来安装python相关插件其实都很简单,当然用这个办法安装Scrapy也是最为简单的安装方式,仅需在命令行窗口输入:
pip install scrapy
检验是否安装成功,通过在命令行中输入:scrapy,即可查看当前scrapy的版本为Scrapy 1.1.1:
也有可能在使用pip安装scrapy的时候出现错误,我就是出现了lxml插件和PyDispatcher插件找不到的问题,缺啥就装啥,就这么简单。遇到这样的情况的话可以单独下载这两个插件安装完成之后再重新安装scrapy即可:
lxml下载地址:https://pypi.python.org/pypi/lxml/3.3.1
PyDispatcher下载地址:https://pypi.python.org/pypi/PyDispatcher/
二、使用步骤:
1.创建一个Scrapy项目:
使用Scrapy提供的模板来创建一个工程,在命令行中定位到保存测试工程的目录下,使用创建指令创建工程:
scrapy startproject MyTest
最后MyTest是工程文件名,然后在资源管理中可以看到指定目录下已经多了一个项目文件夹,项目的结果树如下:
每个文件的作用:
- scrapy.cfg: 项目配置文件
- MyTest/: 项目python模块, 呆会代码将从这里导入
- MyTest/items.py: 项目items文件
- MyTest/pipelines.py: 项目管道文件
- MyTest/settings.py: 项目配置文件
- MyTest/spiders: 放置spider的目录
2.定义要提取的Item:
Item其实就是用来保存装载从网页上爬去数据的容器,就像是Python中的一个字典或者是其他语言中的一个结构体,但它提供更多的保护,比如:对未定义的字段填充以防止拼写错误。
为了方便模块化管理,scrapy模板中把所有的自定义Item类都在items.py中定义,我们打开上面创建的MyTest项目中的items.py即可看到模板样例:
# -*- coding: utf-8 -*- import scrapy class MytestItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
如上述代码,定义一个类,该类需要继承自scrapy.Item类,而类中的属性则是scrapy.Field类型。假设我们要爬去某个站点的名称、链接地址和描述这三个数据,我们可以在items.py中定义一个类InfoItem:
3.定义一个Spider来爬行站点,并提取Items:
完成了Item的定义之后,接下来我们就需要定义一个Spider类,它就像是一只用来爬去指定url或者是url组(多个url)的网站内容的爬虫,为我们爬取信息。
在Scrapy中定义一个Spider类,需要继承自scrapy.spider.BaseSpider类,并且有三个必须重写的属性,分别是:
- name:当前定义的爬虫的别名,也是它的唯一标识,所以定义的每个Spider类的name属性都必须是唯一的;
- start_urls:爬虫开始爬取数据的URL列表,爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些URLS开始。其他子URL将会从这些起始URL中继承性生成;
- parse():爬虫的方法,调用时传入从每一个URL传回的Response对象作为参数,response将会是parse方法的唯一的一个参数。这个方法负责解析返回的数据、匹配抓取的数据(解析为item)并跟踪更多的URL。
scrapy crawl lsh
上述指令的最后一个参数,其实就是我们定义爬虫是给name属性所赋的值,这就是为什么每个爬虫的name属性都必须不重复,因为启动时会出现冲突。
运行指令scrapy crawl lsh,发现运行结束后再项目根目录下多出了两个文件Books和Resources,这两个文件里面就是strat_urls中URL对应的页面内容:
4.定义一个Item Pipeline用于存储提取的Items:
a.提取Item:
选择器:其实从网页中提取信息的方法有很多,在scrapy中采用的方法是一种叫做XPath selector的机制。下面列举几个简单的XPath参数表达式例子:
- /html/head/title: 选择HTML文档<head>元素下面的<title> 标签。
- /html/head/title/text(): 选择前面提到的<title> 元素下面的文本内容
- //td: 选择所有 <td> 元素
- //div[@class="mine"]: 选择所有包含 class="mine" 属性的div 标签元素
由于Selector对象展示了文档的节点结构,所以第一个被实例化的selector必定与根节点或者整个项目有关。
Selector类为我们提供了几个常用的方法:
- path():返回selectors列表,每个selector表示一个xpath参数表达式选择的节点;
- extract():返回一个Unicode字符串,该字符串是XPath返回的数据;
- re():返回Unicode字符串列表,字符串作为参数由正则表达式提取出来
scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/
这里我们可以得到一下结果:
得到的数据中包含了:crawler、item、request、response、setting和spider这六项数据,但其实我们需要用到的只是response中的数据,因为里面存放着URL页面的响应数据,其中response.body存放的是html源码。response中有几个常用的方法:xpath()就是选择器,而extract()方法则会返回html标签之间的unicode内容,re()则是调用正则的接口(我恨正则)。
>>> response.xpath('//title')[0].xpath('text()').extract()
[u'DMOZ - Computers: Programming: Languages: Python: Books']
b.定义Item Pipeline:
通过上述操作,我们清楚了如何使用XPath()来解析response返回的URL页面结果,那么我们接下来需要做的就是把这些数据存放到先前定义好的Item结构中,接下来我们需要查看response.body的页面源码,确定我们所需要内容在源码中的节点位置:
我们需要的数据在一个 <ul>元素中,而且是第二个<ul>,我们可以通过如下命令选择每个在网站中的<li>元素:
response.xpath('//ul/li')
获取网站描述:
获取网站标题:
获取网站链接:
response.xpath('//ul/li/a/@href').extract()
根据上述分析,我们可以改写我们之前定义的TestSpider爬虫的parse()方法的内容:
def parse(self,response):
for sel in response.xpath('//ul/li'):
item = InfoItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
print item['title'],item['link'],item['desc']
使用之前在items.py中定义的InfoItem类创建的Item对象来保存爬取的结果,并打印出来,当然使用items.py的内容需要将其import到当前脚本中,修改后的TestSpider类如下:
# -*- coding: utf-8 -*- from scrapy import Spider
from MyTest import items class TestSpider(Spider):
name = "lsh"
allowed_domains = ["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):
for sel in response.xpath('//ul/li'):
item = items.InfoItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
print item['title'],item['link'],item['desc']
在命令行中输入“scrapy crawl lsh”进行一次爬取操作,得到的输出结果如下:
由于response.xpath('//ul/li')得到的是selectors列表,所以每个selector对应一个InfoItem数据,多个数据其实可以用一个数组来保存,如下改造:
def parse(self,response):
item_list = []
for sel in response.xpath('//ul/li'):
item = items.InfoItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
#print item['title'],item['link'],item['desc']
item_list.append(item)
return item_list
c.保存爬取结果:
之前的处理,我们最后爬取到的关键数据就是item_list中的数据,假如我们希望把这份数据保存下来,在运行爬虫爬取数据的时候在输入以下指令取代原来的“scrapy crawl lsh”:
scrapy crawl lsh -o item_list.json -t json
这样,item_list中的数据将以json的格式保存在当前目录下面的一个新生成的.json文件中:
查看该文件中的内容,即为爬虫所得数据。
Python 爬虫6——Scrapy的安装和使用的更多相关文章
- Linux 安装python爬虫框架 scrapy
Linux 安装python爬虫框架 scrapy http://scrapy.org/ Scrapy是python最好用的一个爬虫框架.要求: python2.7.x. 1. Ubuntu14.04 ...
- 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scr ...
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- 0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)
目录 0.0.Scrapy基础 0.1.Scrapy 框架图 0.2.Scrapy主要包括了以下组件: 0.3.Scrapy简单示例如下: 0.4.Scrapy运行流程如下: 0.5.还有什么? 0. ...
- Python爬虫框架Scrapy实例(三)数据存储到MongoDB
Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...
- 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码
下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...
- Python爬虫框架Scrapy教程(1)—入门
最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...
- 《精通Python爬虫框架Scrapy》学习资料
<精通Python爬虫框架Scrapy>学习资料 百度网盘:https://pan.baidu.com/s/1ACOYulLLpp9J7Q7src2rVA
- Python爬虫框架Scrapy安装使用步骤
一.爬虫框架Scarpy简介Scrapy 是一个快速的高层次的屏幕抓取和网页爬虫框架,爬取网站,从网站页面得到结构化的数据,它有着广泛的用途,从数据挖掘到监测和自动测试,Scrapy完全用Python ...
随机推荐
- 在CentOS 7 中 安装 VSFTP
在线安装:yum install -y vsftpd 使用yum 进行卸载:yum -y remove vsftpd 编辑配置:vi /etc/vsftpd/vsftpd.conf 查看FTP进程是否 ...
- Google Code Jam 2016 Round 1C C
题意:三种物品分别有a b c个(a<=b<=c),现在每种物品各选一个进行组合.要求每种最和最多出现一次.且要求任意两个物品的组合在所有三个物品组合中的出现总次数不能超过n. 要求给出一 ...
- PHP生成日历数组,减少分页
2016年11月14日 20:45:41 星期一 情景, 每个用户设置定投, app的屏幕比较小, 觉得常规的线性分页下拉不是很方便 吧列表改为日历格式的会更方便执行, 每年12个月, 总过12个页面 ...
- CentOS 安装Paramiko模块
转自:http://www.cnblogs.com/hyli/p/3910585.html 1.下载安装包: https://pypi.python.org/packages/source/p/par ...
- js获取系统时间时自动补齐日期带零
最近在开发中发现有日期不规范的问题,正常规则应该是yy-mm-dd,而在输出时候却变成yy-mm-d,这是js的date()方法在作怪 解决思路是若在10号前,则自动给它补齐一个0,下面给出解决方法, ...
- HTML5 绘制简单圆形 loading. . . .
现在有很多的 loading 组件 什么js 等等 闲来没事就写一个 H5的 loading 有很多的Loading 是一张张图片 js 控制的 有了 canvas的 出现 你就可以体验不同之处了 ...
- 利用html5、websocket和opencv实现人脸检测
最近学习人脸识别相关的东西,在MFC下使用OpenCV做了一个简单的应用.训练需要较多的数据,windows应用程序终究还是不方便,于是想着做成CS模式:检测识别都放在服务器端,视频获取和显示都放在网 ...
- 聊一聊log4j2配置文件log4j2.xml
一.背景 最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2.x 的版本,那随之而来的slf4j整合log4j的配置(使用Slf4j集成Log4j2构建项目日志系统的完美解决方 ...
- angularjs $broadcast $emit $on 事件触发controller间的值传递
如何在作用域之间通信呢? 1.创建一个单例服务,然后通过这个服务处理所有子作用域的通信. 2.通过作用域中的事件处理通信.但是这种方法有一些限制:例如,你并不能广泛的将事件传播到所有监控的作用域中.你 ...
- octave手册
GNU OCTAVE是一种高级语言,主要用于数值计算.它提供交互式命令行窗口,用于求解线性和非线性问题并计算出数值,并可以进行其它数值实验,还可以用来作为一个批量数据处理语言 运行Ocatve: oc ...