scrapy

Scrapy的请求是异步调度和处理的。这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。这也意味着即使某些请求失败或在处理错误时发生错误,其他请求也可以继续运行。

Scrapy是用纯Python编写的,取决于一些关键的Python包(以及其他):
lxml,一个高效的XML和HTML解析器
parsel,一个在lxml之上编写的HTML / XML数据提取库,
w3lib,一个用于处理URL和网页编码的多用途帮助程序
twisted,一个异步网络框架
cryptography和pyOpenSSL,用于处理各种网络级安全需求

scrapy.cfg文件所在的目录称为项目根目录
Scrapy 工程结构
tutorial/
scrapy.cfg # deploy configuration file

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)#打开响应页面

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.

默认情况下,Scrapy会筛选出已访问过的URL的重复请求,从而避免因编程错误而导致服务器过多的问题。这可以通过设置进行配置 DUPEFILTER_CLASS

通过-a选项,我们可以把参数传递给Scrapy
scrapy crawl quotes -o quotes-humor.json -a tag=humor

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",等

posted @ 2018-11-29 19:59  blog_hfg  阅读(228)  评论(0)    收藏  举报