1.安装Scrapy
$ pip install Scrapy
$ easy_install lxml
$ scrapy -v
2.创建项目
$scrapy startproject weather
└─weather
│ scrapy.cfg
└─weather
│ items.py
│ pipelines.py
│ settings.py
│ __init__.py
└─ spiders
localweather.py
__init__.py
- scrapy.cfg: 项目的配置文件
- weather/: 该项目的python模块。之后将在此加入代码
- weather/items.py: 项目中的item文件
- weather/pipelines.py: 项目中的pipelines文件 weather/settings.py: 项目的设置文件
- weather/spiders/: 放置spider代码的目录
3.定义Item
Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。
4.编写爬虫(Spider)
$ scrapy genspider [-t template] <name> <domain>
$ scrapy genspider -l
Available templates:
basic
crawl
csvfeed
xmlfeed
$ scrapy genspider -d basic
import scrapy
class$classname(scrapy.Spider):
name ="$name"
allowed_domains = ["$domain"]
start_urls = ('http://www.$domain/',)
def parse(self, response):
pass
$ scrapy genspider -t basic example example.com
Created spider 'example' using template 'basic'in module:
mybot.spiders.example
$ scrapy list
Spider
是用户编写用于从单个网站(或者一些网站)爬取数据的类。
其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容,提取生成 item
的方法。
为了创建一个Spider,必须继承 scrapy.Spider
类, 且定义以下三个属性:
- name:
用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。 start_urls:
包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。parse() :
spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response
对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response
data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
5.数据验证
$ scrapy crawl spidername
# 以Json格式保存数据
$ scrapy crawl myweather -o weather.json
6.提取Items
(1) Selectors选择器简介
从网页中提取数据有很多方法。Scrapy使用了一种基于 XPath 和 CSS 表达式机制: Scrapy Selectors。
这里给出XPath表达式的例子及对应的含义:
/html/head/title
: 选择HTML文档中<head>
标签内的<title>
元素;/html/head/title/text()
: 选择上面提到的 元素的文字;//td
: 选择所有的 元素;//div[@class="mine"]
: 选择所有具有class="mine"
属性的div
元素;
(2) 在Shell中尝试选择器
$ scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
当在终端运行Scrapy时,请一定记得给url地址加上引号,否则包含参数的url(例如 & 字符)会导致Scrapy运行失败。
2016-02-15 11:20:20+0800[dmoz] DEBUG: Crawled (200)
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: None)
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x0000000005613FD0>
[s] item {}
[s] request <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] response <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] settings <scrapy.settings.Settings object at 0x0000000003C7CF98>
[s] spider <DmozSpider 'dmoz' at 0x5a63198>
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
7.保存数据
$ scrapy crawl dmoz -o items.json
当Item在Spider中被收集之后,它将会被传递到Item Pipeline中,一些组件会按照一定的顺序执行对Item的处理。
每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。
他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
Item pipeline的典型应用有:
- 清理HTML数据
- 验证爬取的数据(检查item包含某些字段)
- 查重(并丢弃)
- 将爬取结果保存到文件或数据库中
每个item pipeline组件都需要调用 process_item
方法,这个方法必须返回一个 Item (或任何继承类)对象,或是抛出 DropItem
异常,被丢弃的item将不会被之后的pipeline组件所处理。
FAQs
1.No module named win32api
ImportError: Error loading object 'scrapy.core.downloader.handlers.s3.S3DownloadHandler':
No module named win32api
[解决办法]
easy_install <\path\to\downloaded_file>\pywin32-219.win32-py2.7.exe
2.Scrapy_architecture