标签:
1,安装pywin32,选择对应的版本
2,安装twisted,选择对应版本
3,安装zope.interface,测试安装是否成功import zope.interface
4,安装pyopenssl,验证安装情况import OpenSSL
5,安装lxml
6,安装easytool,安装完成,将python安装目录下的Scripts
目录路径添加到系统环境变量中
7,下载scrapy,解压文件,cd
进入该目录,运行easy_install Scrapy
,输入scrapy
进行验证
创建一个新的Scrapy项目。进入工程目录,在命令行下运行
scrapy startproject tutorial
该命令将会创建tutorial
目录,这些文件分别是:
scrapy.cfg
:项目的配置文件tutorial/
:该项目的python模块,在此加入代码tutorial/items.py
:项目中的item文件tutorial/pipelines.py
:项目中的pipelines文件tutorial/setting.py
:项目的设置文件tutorial/spiders/
:放置spider代码的目录定义Item
Item是保存爬取到的数据的容器;其使用方法和python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。类似在ORM中做的一样,通过创建一个scrapy.Item
类,并定义类型为scrapy.Field
的类属性来定义一个Item。
首先根据需要从dmoz.org获取到的数据对item进行建模。需要从dmoz中获取名字、url,以及网站的描述。对此,在item中定义相应的字段。编辑tutorial
目录下的items.py
文件:
import scrapy class DmozItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field()
Spider是用户编写用于从单个网站(或一些网站)爬取数据的类。其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容,提取生成item
的方法。
创建一个Spider
,必须继承scrapy.Spider
类,且定义以下三个属性:
name
:用于区别Spider。该名字必须是唯一的,不可以为不同的Spider设定相同的名字。start_urls
:包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。parse()
是spider的一个方法。被调用时,每个初始URL完成下载后生成的Response
对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的Response
对象。以下为第一个Spider代码,保存在tutorial/spiders
目录下的dmoz_spider.py
文件中:
import scrapy class DmozSpider(scrapy.spiders.Spider): name = "dmoz" 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): filename = response.url.split("/")[-2] with open(filename, ‘wb‘) as f: f.write(response.body)
爬取
进入项目的根目录,执行下列命令启动spider,crawl dmoz
启动用于爬取dmoz.org
的spider
scrapy crawl dmoz
在PyCharm中运行配置,run --> Edit Configurations...
:
1,Script
项填入python安装目录下的C:\Python2.7\Lib\site-packages\Scrapy
2,Script parameters
填入crawl 爬虫名字
3,Working directory
填入工作目录
查看包含dmoz
的输出,可以看到输出的log中包含定义在start_urls
的初始URL,并且与spider中一一对应。在log中可以看到其没有指向其他页面(referer:None
)。除此之外,就像parse
方法所指定的,有两个包含url所对应的内容的文件被创建了:Book,Resources。
Scrapy为Spider的start_urls
属性中的每个URL创建了scrapy.Request
对象,并将parse
方法作为回调函数(callback)赋值给了Request。
Request对象经过调度,执行生成scrapy.http.Response
对象并送回给spiderparse()
方法。
提取Item
Selector选择器
Scrapy使用了一种基于Xpath和CSS表达式机制:Scrapy Selector。
Xpath表达式的例子及对应的含义:
/html/head/title
:选择HTML文档中<head>
标签内的<title>
元素/html/head/title/text()
:选择上面提到的<title>
元素的文字//td
:选择所有的<td>
元素//div[@class="mine"]
:选择所有具有class="mine"
属性的div
元素更多内容在Xpath教程
Scrapy除了提供了Selector
之外,还提供了方法来避免每次从Response中提取数据时生成Selector的麻烦。
Selector有四个基本的方法(相应方法链接到详细的API文档):
xpath()
:传入xpath表达式,返回该表达式所对应的所有节点的selector list列表。css()
:传入CSS表达式,返回该表达式所对应的所有节点的selector list列表extract()
:序列化该节点为Unicode字符串并返回listre()
:根据传入的正则表达式对数据进行提取,返回Unicode字符串list列表在Shell中尝试Selector选择器
使用内置的Scrapy shell。需要预先安装IPython(一个扩展的Python终端)
下载IPython,解压完成进入目录,在cmd中安装python setupegg.py install
,添加环境变量C:\Python27\Scripts
进入项目根目录,执行命令启动shell:
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
注意:当在终端运行Scrapy时,必须给url地址加上引号,否则包含参数的url(例如&
字符)会导致Scrapy运行失败。
当shell载入后,得到一个包含response数据的本地response
变量。输入response.body
将输出response的包体,输出response.headers
可以看到response的包头。
当输入response.selector
时,将获取到一个可以用于查询返回数据的selector(选择器),以及映射到response.selector.xpath()
、response.selector.css()
的快捷方法(shortcut):response.xpath()
和response.css()
。
同时,shell根据response提前初始化了变量sel
。该selector根据response的类型自动选择最合适的分析规则(XML vs HTML)。
提取数据
在终端中输入response.body
来观察HTML源码并确定合适的XPath表达式。可以考虑使用Firebug扩展来使得工作更为轻松。详情可参考使用Firebug进行爬取和借助Firefox进行爬取。
在查看网页的源码后,发现网站的信息被包含在第二个<ul>
元素中。
可以通过这段代码选择该页面中网站列表里所有<li>
元素:
sel.xpath(‘//ul/li‘)
网站的描述:
sel.xpath(‘//ul/li/text()‘).extract()
网站的标题:
sel.xpath(‘//ul/li/a/text()‘).extract()
网站的链接:
sel.xpath(‘//ul/li/a/@href‘).extract()
每个.xpath()
调用返回selector组成的list,因此可以拼接更多的.xpath()
来进一步获取某个节点。将在下面使用这样的特性:
for sel in response.xpath(‘//ul/li‘): title = sel.xpath(‘a/text()‘).extract() link = sel.xpath(‘a/@href‘).extract() desc = sel.xpath(‘text()‘).extract() print title,link,desc
在spider中加入这段代码:
import scrapy class DmozSpider(scrapy.Spider): ... def parse(self, response): for sel in response.xpath(‘//ul/li‘): title = sel.xpath(‘a/text()‘).extract() link = sel.xpath(‘a/@href‘).extract() desc = sel.xpath(‘text()‘).extract() print title, link, desc
尝试再次爬取dmoz.org,将看到爬取到的网站信息被成功输出
关于嵌套selector的更多详细信息,参考嵌套选择器(selector)以及选择器(Selector)文档中的使用相对XPaths部分。
使用ItemItem
对象是自定义的python字典,可以使用标准的字典语法来获取每个字段的值。(字段即用Field赋值的属性):
item = DmozItem() item[‘title‘] = ‘Example title‘ item[‘title‘]
一般来说,Spider将爬取的数据以Item
对象返回。为了将爬取的数据返回,最终的代码将是:
import scrapy from tutorial.items import DmozItem class DmozSpider(scrapy.Spider): name = "dmoz" 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 = DmozItem() item[‘title‘] = sel.xpath(‘a/text()‘).extract() item[‘link‘] = sel.xpath(‘a/@href‘).extract() item[‘desc‘] = sel.xpath(‘text()‘).extract() yield item
可以在dirbot项目中找到一个具有完整功能的spider。
对dmoz.org
进行爬取将会产生DmozItem
对象
保存数据
最简单存储爬取数据的方式是使用Feed exports
:
scrapy crawl dmoz -o items.json
该命令将采用JSON格式对数据进行序列化,生成items.json
文件。
如果需要对爬取的item做更多复杂的操作,可以编写Item Pipeline。类似于在创建项目时对Item做的,编写的tutorial/pipelines.py
也被创建。
Copyright © 吴华锦
雅致寓于高阁渔舟唱晚,古典悠然
格调外发园林绿树萦绕,馥郁清香
标签:
原文地址:http://www.cnblogs.com/hanqing/p/5479575.html