Scrapy的请求是异步调度和处理的。这意味着Scrapy不须要等待请求完成和处理,它能够在此期间发送另外一个请求或执行其余操做。这也意味着即便某些请求失败或在处理错误时发生错误,其余请求也能够继续运行。css
Scrapy是用纯Python编写的,取决于一些关键的Python包(以及其余):
lxml,一个高效的XML和HTML解析器
parsel,一个在lxml之上编写的HTML / XML数据提取库,
w3lib,一个用于处理URL和网页编码的多用途帮助程序
twisted,一个异步网络框架
cryptography和pyOpenSSL,用于处理各类网络级安全需求html
scrapy.cfg文件所在的目录称为项目根目录
Scrapy 工程结构
tutorial/
scrapy.cfg # deploy configuration filenode
tutorial/ # project's Python module, you'll import your code from here __init__.py items.py # project items definition file middlewares.py # project middlewares file pipelines.py # project pipelines file settings.py # project settings file spiders/ # a directory where you'll later put your spiders __init__.py
直接在终端运行
scrapy shell "http://quotes.toscrape.com/page/1/".会像该Url request
response.css('title') # 返回一selectorList
抽取text
response.css('title::text').extract()
response.css('title::text').extract_first()
response.css('title::text').re(r'Quotes.*')
view(response)#打开响应页面python
Selector Gadget也是一个很好的工具,能够快速找到视觉选择元素的CSS选择器,它能够在许多浏览器中使用。
除了CSS,Scrapy selectors也支持XPath扩展。XPath表达式很是强大,是Scrapy Selectors的基础。实际上,CSS选择器在底层下转换为XPath
response.xpath('//title/text()').extract_first()程序员
scrapy crawl quotes -o quotes.json //运行该脚本,并把结果保存到json文件里头正则表达式
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" start_urls = [ 'http://quotes.toscrape.com/page/1/', ] def parse(self, response): for quote in response.css('div.quote'): yield { 'text': quote.css('span.text::text').extract_first(), 'author': quote.css('span small::text').extract_first(), 'tags': quote.css('div.tags a.tag::text').extract(), } next_page = response.css('li.next a::attr(href)').extract_first() if next_page is not None: yield response.follow(next_page, callback=self.parse)
response.follow supports relative URLs directly - no need to call urljoin.shell
默认状况下,Scrapy会筛选出已访问过的URL的重复请求,从而避免因编程错误而致使服务器过多的问题。这能够经过设置进行配置 DUPEFILTER_CLASS编程
经过-a选项,咱们能够把参数传递给Scrapy
scrapy crawl quotes -o quotes-humor.json -a tag=humorjson
有两种命令,一种只能在Scrapy项目内部工做(特定于项目的命令)和那些在没有活动的Scrapy项目(全局命令)的状况下工做的命令,尽管从项目内部运行时它们可能表现略有不一样(由于他们会使用项目覆盖设置)。浏览器
Global commands:
startproject
genspider
settings
runspider
shell
fetch
view
version
Project-only commands:
crawl
check
list
edit
parse
bench
一个项目有多个spider,
使用该scrapy工具作的第一件事是建立Scrapy项目:
scrapy startproject myproject [project_dir] 这将在project_dir目录下建立一个Scrapy项目。若是project_dir没有指定,project_dir将是相同的myproject
scrapy genspider [-t template]
scrapy genspider -t crawl scrapyorg scrapy.org ,Created spider 'scrapyorg' using template 'crawl'
scrapy crawl
scrapy list
列出当前项目中的全部可用spider
scrapy edit
使用EDITOR环境变量中定义的编辑器或(若是未设置)EDITOR设置编辑给定的spider。一般不用,由于会在IDE里直接编辑
scrapy fetch
使用Scrapy下载程序下载给定的URL,并将内容写入标准输出。
scrapy vire
在浏览器中打开给定的URL,由于您的Scrapy spider会“看到”它。有时spider会看到不一样于常规用户的页面,所以能够用来检查spider“看到”的内容并确认它是您所指望的。
scrapy shell [url]
为给定的URL启动Scrapy shell(若是给定),若是没有给出URL,则为空
scrapy parse
fetch给定的url并parse(解析)
scrapy runspider <spider_file.py>
在Python文件中运行自包含的spider,而无需建立项目。
scrapy version -v
列出包的版本信息
scrapy bench
运行快速基准测试
还可使用该COMMANDS_MODULE设置添加自定义项目命令
Spider是定义如何抓取某个站点(或一组站点)的类,是您为特定站点(或者在某些状况下,一组站点)爬网和解析页面定义自定义行为的地方。
scrapy.Spider
这是最简单的spider,也是每一个其余spider必须继承的spider(包括与Scrapy捆绑在一块儿的spider,以及你本身编写的spider)。它不提供任何特殊功能。它只提供了一个默认start_requests()实现,它从start_urlsspider属性发送请求,并parse 为每一个结果响应调用spider的方法
name:一个字符串,用于定义此spider的名称。spider名称是Scrapy如何定位(并实例化)spider,所以它必须是惟一的且必需的。
allowed_domains
包含容许此爬网爬网的域的字符串的可选列表。若是OffsiteMiddleware启用,则不会遵循对不属于此列表(或其子域)中指定的域名的URL的请求
start_urls
当没有指定特定URL时,spider将会从strat_urls列表里头爬取
start_requests()
此方法必须返回一个iterable,其中包含第一个要爬网的请求;
parse(respone)
这是Scrapy在其请求未指定回调时处理下载的响应时使用的默认回调
CrawlSpider
这是用于抓取常规网站的最经常使用的蜘蛛,由于它经过定义一组规则为跟踪连接提供了便利的机制。
除了从Spider继承的属性(您必须指定)以外,此类还支持新属性:
rules
这是一个(或多个)Rule对象的列表。每一个Rule 定义用于爬网站点的特定行为
parse_start_url(response)
Crawling rules
link_extractor是一个Link Extractor对象,它定义如何从每一个已爬网页面中提取连接
XMLFeedSpider
XMLFeedSpider旨在经过按某个节点名称迭代XML feed来解析XML feed。迭代器能够选自:iternodes,xml,和html
iterator:一个字符串,它定义要使用的迭代器..
'iternodes' - 基于正则表达式的快速迭代器
'html'
'xml'
CSVFeedSpider
这个spider与XMLFeedSpider很是类似,只不过它遍历行而不是节点。在每次迭代中调用的方法是parse_row()。
在抓取网页时,您须要执行的最多见任务是从HTML源提取数据。有几个库可用于实现此目的
BeautifulSoup是Python程序员中很是流行的Web抓取库,它根据HTML代码的结构构造一个Python对象,而且合理地处理坏标记,但它有一个缺点:它很慢
lxml是一个XML解析库(也能够解析HTML),它使用基于ElementTree的pythonic API
parsel与beautifulsoup也是HTML,XML解析库
Scrapy带有本身的提取数据机制。它们被称为选择器
XPath是一种用于在XML文档中选择节点的语言,也能够与HTML一块儿使用。CSS是一种将样式应用于HTML文档的语言。它定义选择器以将这些样式与特定HTML元素相关联.Scrapy选择器是在lxml库上构建的
为了定义通用输出数据格式,Scrapy提供了Item类。 Item对象是用于收集抓取数据的简单容器。它们提供相似字典的 API,并具备用于声明其可用字段的方便语法
item loaders
Items提供了抓取数据的容器,而Item Loaders提供了填充该容器的机制。
.若是安装了IPython,Scrapy shell将使用它(而不是标准的Python控制台)。该IPython的控制台功能更强大,并提供智能自动完成和彩色输出,等等;输入scrapy shell,即进入了shell环境,该环境是以python环境为基础的。天然支持python命令
fetch(url[, redirect=True]) - 从给定的URL获取新响应并相应地更新全部相关对象。您能够选择要求HTTP 3xx重定向,而后不要传递redirect=False
fetch(request) - 从给定请求中获取新响应并相应地更新全部相关对象。
view(response) - 在本地Web浏览器中打开给定的响应,以进行检查。
from scrapy.shell import inspect_response
inspect_response(response,self)检查该响应,进入shell模式
Request参数: url callback:- 将使用此请求的响应(一旦下载)调用的函数做为其第一个参数。若是请求未指定回调,则将使用spider的 parse()方法。请注意,若是在处理期间引起异常,则会调用errback。 method:表示请求中的HTTP方法的字符串。这必须保证是大写的。例如:"GET","POST","PUT",等