介绍
Scrapy是用Python开发的一个快速,高层次的web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
概述及其组件
引擎: 用来处理整个系统的数据流处理,触发事务。
调度器: 用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。
下载器: 用于下载网页内容,并将网页内容返回给蜘蛛。
蜘蛛: 蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。
项目管道: 负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
下载器中间件: 位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
蜘蛛中间件: 介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。
调度中间件: 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
start
**Command**
**fetch** Fetch a URL using the Scrapy downloader
**runspider** Run a self-contained spider (without creating a project)
**settings** Get settings values
**shell** Interactive scraping console
**startproject** Create new project
**version** Print Scrapy version
**view** Open URL in browser, as seen by Scrapy
scrapy shell 工具使用
[s] Available Scrapy objects
[s] item {}
s] request <GET http://www.jyeoo.com/math/ques/search>
[s] response <200 http://www.jyeoo.com/math/ques/search>
[s] sel <Selector xpath=None data=u'<html lang="zh-cn"><head><meta http-equi'>
[s] settings <CrawlerSettings module=None>
[s] spider <BaseSpider 'default' at 0x2d1ebd0>
[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
fetch:
scrapy.http import Request(url)
view(response)
spiders
xpath
Define the data you want
from scrapy.item import Item, Field
class TorrentItem(Item):
url = Field()
name = Field()
description = Field()
size = Field()
Downloader Middlewares http://doc.scrapy.org/en/latest/topics/downloader-middleware.html
CookiesMiddleware:是否向web server发送cookie
DefaultHeadersMiddleware:将所有request的头设置为默认模式
DownloadTimeoutMiddleware:设置request的timeout
HttpAuthMiddleware:对来自特定spider的request授权
HttpCacheMiddleware:给request&response设置缓存策略
HttpProxyMiddleware:给所有request设置http代理
RedirectMiddleware:处理request的重定向
MetaRefreshMiddleware:根据meta-refresh html tag处理重定向
RetryMiddleware:失败重试策略
RobotsTxtMiddleware:robots封禁处理
UserAgentMiddleware:支持user agent重写
Logging
CRITICAL - for critical errors
ERROR - for regular errors
WARNING - for warning messages
INFO - for informational messages
DEBUG - for debugging messages
self.log('msg',level=log.INFO)
如何增量
目前没有官方方案,介绍两个非官方的方法:
(1). 在pipeline的open_spider时读取所有item里面的url,做成一个parsed_urls的list,在rule的process_link中过滤掉这些已经下载的url。
(2)在item中增加Url字段。item['Url'] = response.url,然后在数据端把储存url的column设置成unique。之后在python代码中捕获数据库commit时返回的异常,忽略掉或者转入log中都可以。(适合小规模的爬虫)
note
https://github.com/jacklcz/scrapy
scrapy crawl myspider -a category=electronics
Spiders receive arguments in their constructors:
class MySpider(Spider):
name = 'myspider'
def __init__(self, category=None, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.start_urls = ['http://www.example.com/categories/%s' % category]
chrome xpath工具: https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl
python -m SimpleHTTPServer 8787
//a[contains(@href,"ques/detail")]'