scrapy

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

Command line tool

有两种命令,一种只能在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] 生成spider,表现上就是生成一个.py文件
scrapy genspider -t crawl scrapyorg scrapy.org ,Created spider 'scrapyorg' using template 'crawl'

scrapy crawl 使用spider开始抓取

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 [options]
fetch给定的url并parse(解析)

scrapy runspider <spider_file.py>
在Python文件中运行自包含的spider,而无需建立项目。

scrapy version -v
列出包的版本信息

scrapy bench
运行快速基准测试

还可使用该COMMANDS_MODULE设置添加自定义项目命令

Spiders

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()。

Selectors

在抓取网页时,您须要执行的最多见任务是从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库上构建的

Items

为了定义通用输出数据格式,Scrapy提供了Item类。 Item对象是用于收集抓取数据的简单容器。它们提供相似字典的 API,并具备用于声明其可用字段的方便语法

item loaders
Items提供了抓取数据的容器,而Item Loaders提供了填充该容器的机制。

Shell

.若是安装了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模式

Requests and Responses

Request参数: url callback:- 将使用此请求的响应(一旦下载)调用的函数做为其第一个参数。若是请求未指定回调,则将使用spider的 parse()方法。请注意,若是在处理期间引起异常,则会调用errback。 method:表示请求中的HTTP方法的字符串。这必须保证是大写的。例如:"GET","POST","PUT",等

相关文章
相关标签/搜索