Scrapy

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

【参考文章】

  1. http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/tutorial.html
  2. http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/index.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值