分类 Scrapy 下的文章

Scrapy教程

在本教程中,我们假设您的系统上已经安装了Scrapy。 如果不是这种情况,请参阅安装指南。
我们将爬取quotes.toscrape.com,这是一个列出着名作家引用的网站。
本教程将指导您完成以下任务:

  1. 创建一个新的Scrapy项目
  2. 编写蜘蛛来抓取网站并提取数据
  3. 使用命令行导出已删除的数据
  4. 改变蜘蛛以递归方式跟随链接
  5. 使用蜘蛛参数
    Scrapy是用Python编写的。 如果您不熟悉该语言,您可能需要先了解语言是什么,以充分利用Scrapy。

如果您已经熟悉其他语言,并希望快速学习Python,我们建议您阅读Dive Into Python 3.或者,您可以按照Python教程进行操作。
如果您不熟悉编程并希望从Python开始,那么您可能会发现有用的在线书籍“学习Python困难之路”。 您还可以查看非程序员的Python资源列表。

创建一个项目

在开始抓取之前,您必须设置一个新的Scrapy项目。 输入您要存储代码的目录并运行:

scrapy startproject tutorial

这将创建一个包含以下内容的tutorial目录:

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用来从网站(或一组网站)中提取信息。 他们必须将scrapy.Spider子类化并定义要生成的初始请求,可选地如何跟踪页面中的链接,以及如何解析下载的页面内容以提取数据。
这是我们第一个蜘蛛的代码。 将它保存在项目教程/ spiders目录下名为quotes_spider.py的文件中:

import scrapy
class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

如您所见,我们的Spider子类scrapy.Spider并定义了一些属性和方法:

  • name:标识Spider。 它在项目中必须是唯一的,也就是说,您不能为不同的Spiders设置相同的名称。
  • start_requests():必须返回一个可迭代的请求(你可以返回一个请求列表或编写一个生成器函数),Spider将开始从中爬行。 后续请求将从这些初始请求中连续生成。
  • parse():将调用一个方法来处理为每个请求下载的响应。 response参数是TextResponse的一个实例,它保存页面内容并具有处理它的其他有用方法。
    parse()方法通常解析响应,提取已删除的数据作为dicts,并查找要遵循的新URL并从中创建新请求(Request)。

如何运行我们的蜘蛛

要让我们的蜘蛛工作,请转到项目的顶级目录并运行:

scrapy crawl quotes

此命令运行带有我们刚刚添加的名称quotes的spider,它将发送一些quotes.toscrape.com域的请求。 您将获得类似于此的输出:

... (omitted for brevity)
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened
2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt>; (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/>; (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/>; (referer: None)
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-2.html
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Closing spider (finished)
...
现在,检查当前目录中的文件。 您应该注意到已经创建了两个带有我们期望url内容的新文件:quotes-1.html和quotes-2.html,正如我们的解析方法所指示的那样。
⚠️注意
如果您想知道为什么我们还没有解析HTML,请继续,我们将很快介绍。

引擎盖下发生了什么?

Scrapy调度由Spider的start_requests方法返回的scrapy.Request对象。 收到每个响应后,它会实例化Response对象并调用与请求相关的回调方法(在本例中为parse方法),将响应作为参数传递。

start_requests方法的快捷方式

您可以只使用URL列表定义start_urls类属性,而不是实现从URL生成scrapy.Request对象的start_requests()方法。 然后,start_requests()的默认实现将使用此列表来创建对spider的初始请求:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
        'http://quotes.toscrape.com/page/2/',
    ]

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)

将调用parse()方法来处理这些URL的每个请求,即使我们没有明确告诉Scrapy这样做。 发生这种情况是因为parse()是Scrapy的默认回调方法,在没有明确分配回调的情况下调用请求。

提取数据

学习如何使用Scrapy提取数据的最佳方法是使用Scrapy shell尝试选择器。 运行:

scrapy shell 'http://quotes.toscrape.com/page/1/'

⚠️注意
记住在从命令行运行Scrapy shell时始终将URL括在引号中,否则包含参数(即。&字符)的url将不起作用。
在Windows上,请使用双引号:

scrapy shell "http://quotes.toscrape.com/page/1/"

你会看到类似的东西:

[ ... Scrapy log here ... ]
2016-09-19 12:09:27 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x7fa91d888c90>
[s]   item       {}
[s]   request    <GET http://quotes.toscrape.com/page/1/>
[s]   response   <200 http://quotes.toscrape.com/page/1/>
[s]   settings   <scrapy.settings.Settings object at 0x7fa91d888c10>
[s]   spider     <DefaultSpider 'default' at 0x7fa91c8af990>
[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
>>>

使用shell,您可以尝试使用CSS和响应对象选择元素:

>>> response.css('title')
[<Selector xpath='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]

运行response.css('title')的结果是一个名为SelectorList的类似列表的对象,它表示包含XML / HTML元素的Selector对象列表,并允许您运行更多查询以细化选择或提取 数据。
要从上面的标题中提取文本,您可以执行以下操作:

>>> response.css('title::text').extract()
['Quotes to Scrape']

这里有两点需要注意:一个是我们在CSS查询中添加了:: text,意味着我们只想在<title>元素中直接选择文本元素。 如果我们不指定:: text,我们将获得完整的title元素,包括其标签:

>>> response.css('title').extract()
['<title>Quotes to Scrape</title>']

另一件事是调用.extract()的结果是一个列表,因为我们正在处理SelectorList的一个实例。 当你知道你只想要第一个结果时,就像在这种情况下,你可以这样做:

>>> response.css('title::text').extract_first()
'Quotes to Scrape'

作为替代方案,你可以写:

>>> response.css('title::text')[0].extract()
'Quotes to Scrape'

但是,使用.extract_first()可以避免IndexError,并在找不到与选择匹配的任何元素时返回None。
这里有一个教训:对于大多数抓取代码,您希望它能够在页面上找不到任何内容时对错误具有弹性,因此即使某些部分无法被删除,您也至少可以获得一些数据。
除了extract()和extract_first()方法之外,您还可以使用re()方法使用正则表达式进行提取:

>>> response.css('title::text').re(r'Quotes.*')
['Quotes to Scrape']
>>> response.css('title::text').re(r'Q\w+')
['Quotes']
>>> response.css('title::text').re(r'(\w+) to (\w+)')
['Quotes', 'Scrape']

为了找到合适的CSS选择器,您可能会发现使用视图(响应)在Web浏览器中从shell打开响应页面非常有用。 您可以使用浏览器开发人员工具或扩展程序(如Firebug)(请参阅有关使用Firebug进行抓取和使用Firefox进行抓取的部分)。
Selector Gadget也是一个很好的工具,可以快速找到视觉选择元素的CSS选择器,它可以在许多浏览器中使用。

XPath:一个简短的介绍

除了CSS,Scrapy选择器还支持使用XPath表达式:

>>> response.xpath('//title')
[<Selector xpath='//title' data='<title>Quotes to Scrape</title>'>]
>>> response.xpath('//title/text()').extract_first()
'Quotes to Scrape'

XPath表达式非常强大,是Scrapy Selectors的基础。 实际上,CSS选择器在引擎盖下转换为XPath。 如果仔细阅读shell中选择器对象的文本表示,则可以看到。

虽然可能不像CSS选择器那样流行,但XPath表达式提供了更多功能,因为除了导航结构之外,它还可以查看内容。 使用XPath,您可以选择以下内容:选择包含文本“下一页”的链接。 这使得XPath非常适合抓取任务,我们鼓励你学习XPath,即使你已经知道如何构造CSS选择器,它也会使抓取更容易。

我们不会在这里介绍XPath的大部分内容,但您可以在此处阅读有关在Scrapy选择器中使用XPath的更多信息。 要了解有关XPath的更多信息,我们建议本教程通过示例学习XPath,本教程将学习“如何在XPath中思考”。

提取引文和作者

现在你已经了解了一些关于选择和提取的知识,让我们通过编写代码从网页中提取引号来完成我们的蜘蛛。
http://quotes.toscrape.com中的每个引用都由HTML元素表示,如下所示:

<div class="quote">
    <span class="text">“The world as we have created it is a process of our
    thinking. It cannot be changed without changing our thinking.”</span>
    <span>
        by <small class="author">Albert Einstein</small>
        <a href="/author/Albert-Einstein">(about)</a>
    </span>
    <div class="tags">
        Tags:
        <a class="tag" href="/tag/change/page/1/">change</a>
        <a class="tag" href="/tag/deep-thoughts/page/1/">deep-thoughts</a>
        <a class="tag" href="/tag/thinking/page/1/">thinking</a>
        <a class="tag" href="/tag/world/page/1/">world</a>
    </div>
</div>

让我们打开scrapy shell并运行一下以了解如何提取我们想要的数据:

$ scrapy shell 'http://quotes.toscrape.com'

我们得到了引用HTML元素的选择器列表:

>>> response.css("div.quote")

上面的查询返回的每个选择器允许我们对其子元素运行进一步的查询。 让我们将第一个选择器分配给一个变量,这样我们就可以直接在特定的引文上运行CSS选择器:

>>> quote = response.css("div.quote")[0]

现在,让我们使用我们刚刚创建的引用对象从该引用中提取标题,作者和标记:

>>> title = quote.css("span.text::text").extract_first()
>>> title
'“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”'
>>> author = quote.css("small.author::text").extract_first()
>>> author
'Albert Einstein'

鉴于标记是字符串列表,我们可以使用.extract()方法获取所有字符串:

>>> tags = quote.css("div.tags a.tag::text").extract()
>>> tags
['change', 'deep-thoughts', 'thinking', 'world']

在弄清楚如何提取每个位之后,我们现在可以迭代所有引号元素并将它们放在一起放入Python字典:

>>> for quote in response.css("div.quote"):
...     text = quote.css("span.text::text").extract_first()
...     author = quote.css("small.author::text").extract_first()
...     tags = quote.css("div.tags a.tag::text").extract()
...     print(dict(text=text, author=author, tags=tags))
{'tags': ['change', 'deep-thoughts', 'thinking', 'world'], 'author': 'Albert Einstein', 'text': '“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”'}
{'tags': ['abilities', 'choices'], 'author': 'J.K. Rowling', 'text': '“It is our choices, Harry, that show what we truly are, far more than our abilities.”'}
    ... a few more of these, omitted for brevity
>>>

在我们的蜘蛛中提取数据

让我们回到我们的蜘蛛。 到目前为止,它并没有特别提取任何数据,只是将整个HTML页面保存到本地文件中。 让我们将上面的提取逻辑集成到我们的蜘蛛中。
Scrapy蜘蛛通常会生成许多包含从页面提取的数据的字典。 为此,我们在回调中使用yield Python关键字,如下所示:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
        'http://quotes.toscrape.com/page/2/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.css('small.author::text').extract_first(),
                'tags': quote.css('div.tags a.tag::text').extract(),
            }

如果你运行这个蜘蛛,它将输出提取的数据与日志:

2016-09-19 18:57:19 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/>
{'tags': ['life', 'love'], 'author': 'André Gide', 'text': '“It is better to be hated for what you are than to be loved for what you are not.”'}
2016-09-19 18:57:19 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/>
{'tags': ['edison', 'failure', 'inspirational', 'paraphrased'], 'author': 'Thomas A. Edison', 'text': "“I have not failed. I've just found 10,000 ways that won't work.”"}

存储已抓取的数据

存储已抓取数据的最简单方法是使用Feed导出,使用以下命令:

scrapy crawl quotes -o quotes.json

安装Scrapy

Scrapy在Python 2.7和Python 3.4或更高版本运行,或者在CPython(默认Python实现)和PyPy(从PyPy 5.9开始)下运行。
如果您使用的是Anaconda或Miniconda,您可以从conda-forge通道安装该软件包,该软件包含适用于Linux,Windows和OS X的最新软件包。
要使用conda安装Scrapy,请运行:

conda install -c conda-forge scrapy

或者,如果您已经熟悉Python包的安装,则可以使用以下命令从PyPI安装Scrapy及其依赖项:

pip install Scrapy

请注意,有时这可能需要根据您的操作系统解决某些Scrapy依赖项的编译问题,因此请务必查看特定于平台的安装说明。
我们强烈建议您在专用的virtualenv中安装Scrapy,以避免与系统软件包冲突。
有关更详细和平台细节的说明,请继续阅读。

值得了解的事情

Scrapy是用纯Python编写的,取决于一些关键的Python包(以及其他):

  • lxml,一个高效的XML和HTML解析器
  • parsel,一个在lxml之上编写的HTML / XML数据提取库,
  • w3lib,一个用于处理URL和网页编码的多用途帮助程序
  • twisted,一个异步网络框架
  • cryptography和pyOpenSSL,用于处理各种网络级安全需求
    Scrapy经过测试的最小版本是:
  • Twisted 14.0
  • lxml 3.4
  • pyOpenSSL 0.14
    Scrapy可能适用于这些软件包的旧版本,但不保证它会继续工作,因为它没有针对它们进行测试。

其中一些软件包本身依赖于非Python软件包,可能需要额外的安装步骤,具体取决于您的平台。 请查看下面的平台特定指南。
如果与这些依赖关系有任何问题,请参阅各自的安装说明:

TL; DR:我们建议在所有平台上的虚拟环境中安装Scrapy。
Python包可以全局安装(a.k.a系统范围),也可以安装在用户空间中。 我们不建议安装scrapy系统。
相反,我们建议您在所谓的“虚拟环境”(virtualenv)中安装scrapy。 Virtualenvs允许您不与已安装的Python系统软件包冲突(这可能会破坏您的一些系统工具和脚本),并且仍然通常使用pip安装软件包(没有sudo等)。
要开始使用虚拟环境,请参阅virtualenv安装说明。 要全局安装它(全局安装它实际上有帮助),它应该是运行的问题:

$ [sudo] pip install virtualenv

查看本用户指南,了解如何创建virtualenv。
⚠️注意
如果你使用Linux或OS X,virtualenvwrapper是一个创建virtualenvs的便利工具。
一旦你创建了virtualenv,就可以使用pip在其中安装scrapy,就像任何其他Python包一样。 (有关您可能需要事先安装的非Python依赖项,请参阅下面的特定于平台的指南)。
可以创建Python virtualenvs以默认使用Python 2,或默认使用Python 3。

  • 如果你想用Python 3安装scrapy,请在Python 3 virtualenv中安装scrapy。
  • 如果你想用Python 2安装scrapy,请在Python 2 virtualenv中安装scrapy。

平台特定安装说明

Windows

虽然可以使用pip在Windows上安装Scrapy,但我们建议您安装Anaconda或Miniconda并使用conda-forge通道中的软件包,这样可以避免大多数安装问题。
安装Anaconda或Miniconda后,安装Scrapy:

conda install -c conda-forge scrapy

Ubuntu 14.04 或者之上版本

Scrapy目前正在使用最新版本的lxml,twisted和pyOpenSSL进行测试,并且与最近的Ubuntu发行版兼容。 但它也应该支持旧版本的Ubuntu,比如Ubuntu 14.04,尽管可能存在TLS连接问题。
不要使用Ubuntu提供的python-scrapy包,它们通常太旧而且速度慢,无法赶上最新的Scrapy。
要在Ubuntu(或基于Ubuntu)系统上安装scrapy,您需要安装这些依赖项:

sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
  • lxml需要python-dev, zlib1g-dev, libxml2-dev 和 libxslt1-dev
  • cryptography需要libssl-dev 和 libffi-dev
    如果你想在Python 3上安装scrapy,你还需要Python 3开发头:

在virtualenv中,您可以在此之后使用pip安装Scrapy:

pip install scrapy

⚠️注意
可以使用相同的非Python依赖项在Debian Jessie(8.0)及更高版本中安装Scrapy。

Mac OS X.

构建Scrapy的依赖项需要存在C编译器和开发头。 在OS X上,这通常由Apple的Xcode开发工具提供。 要安装Xcode命令行工具,请打开终端窗口并运行:

xcode-select --install

有一个已知的问题阻止了pip更新系统包。 必须解决这个问题才能成功安装Scrapy及其依赖项。 以下是一些建议的解决方案:

  • (推荐)不要使用系统python,安装一个不与系统其他部分冲突的新版本。 以下是使用自制软件包管理器的方法:

    echo "export PATH=/usr/local/bin:/usr/local/sbin:$PATH" >> ~/.bashrc

    • 重新加载.bashrc以确保发生了更改:

    source ~/.bashrc

    • 安装python

    brew install python

    • 最新版本的python与它们捆绑在一起,所以你不需要单独安装它。 如果不是这样,请升级python:

    brew update; brew upgrade python

  • (可选)在隔离的python环境中安装Scrapy。

此方法是上述OS X问题的解决方法,但它是管理依赖关系的总体良好实践,可以补充第一种方法。virtualenv是一个可以用来在python中创建虚拟环境的工具。 我们建议您阅读http://docs.python-guide.org/en/latest/dev/virtualenvs/ 等教程,以便开始使用。

在完成任何这些变通办法之后,您应该能够安装Scrapy:

pip install Scrapy

PyPy

我们建议使用最新的PyPy版本。 测试的版本是5.9.0。 对于PyPy3,仅测试了Linux安装。

大多数scrapy依赖类似物现在都有CPython的二进制轮,但不适用于PyPy。 这意味着将在安装期间构建这些依赖项。 在OS X上,您可能会遇到构建加密依赖关系的问题,此处描述了解决此问题的方法,即brew install openssl然后导出此命令建议的标志(仅在安装scrapy时需要)。 除了安装构建依赖项之外,在Linux上安装没有特殊问题。 在Windows上使用PyPy安装scrapy未经过测试。

您可以通过运行scrapy bench来检查scrapy是否已正确安装。 如果此命令产生类似TypeError的错误:...得到2个意外的关键字参数,这意味着setuptools无法获取一个特定于PyPy的依赖项。 要解决此问题,请运行pip install'PyPyDispatcher> = 2.1.0'。

Scrapy概览

Scrapy是一种用于抓取网站和提取结构化数据的应用程序框架,可用于广泛的有用应用程序,如数据挖掘,信息处理或历史存档。
尽管Scrapy最初是为网络抓取而设计的,但它也可以用于使用API(例如Amazon Associates Web Services)或作为通用网络爬虫来提取数据。

示例蜘蛛浏览

为了向您展示Scrapy带来的内容,我们将以最简单的方式运行蜘蛛,向您介绍Scrapy Spider的示例。
这是一个蜘蛛的代码,它能抓取网页 http://quotes.toscrape.com 上著名的引用:

import scrapy
class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]
    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.xpath('span/small/text()').extract_first(),
            }
        next_page = response.css('li.next a::attr("href")').extract_first()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

将它放在一个文本文件中,将其命名为quotes_spider.py并使用runspider命令运行spider:

scrapy runspider quotes_spider.py -o quotes.json

完成后,您将在quotes.json文件中得到包含JSON格式的引文列表,其中包含文本和作者,如下所示(为了更好的可读性,此处重新格式化):

[{
    "author": "Jane Austen",
    "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
},
{
    "author": "Groucho Marx",
    "text": "\u201cOutside of a dog, a book is man's best friend. Inside of a dog it's too dark to read.\u201d"
},
{
    "author": "Steve Martin",
    "text": "\u201cA day without sunshine is like, you know, night.\u201d"
},
...]

刚刚发生了什么?

当您运行命令scrapy runspider quotes_spider.py时,Scrapy在其中查找Spider定义并通过其爬虫引擎运行它。
通过向start_urls属性中定义的URL发出请求(在这种情况下,只是幽默类别中的引号的URL)并且调用默认回调方法解析,将响应对象作为参数传递。在解析回调中,我们使用CSS Selector循环遍历quote元素,然后使用提取的引用文本和作者生成Python dict,查找指向下一页的链接,并使用与回调相同的parse方法继续另一个请求。
在这里,您会注意到Scrapy的一个主要优点:请求是异步调度和处理的。这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。这也意味着即使某些请求失败或在处理错误时发生错误,其他请求也可以继续运行。
虽然这使您能够进行非常快速的爬网页(以容错方式同时发送多个并发请求),但Scrapy还可以通过一些设置控制爬网页爬的礼貌些。您可以执行以下操作:在每个请求之间设置下载延迟,限制每个域或每个IP的并发请求数量,甚至使用自动限制扩展来尝试自动计算这些请求。
⚠️注意
这是使用feed导出生成JSON文件,您可以轻松更改导出格式(例如XML或CSV)或存储后端(例如FTP或Amazon S3)。 您还可以编写项目管道以将项目存储在数据库中。

还有什么

您已经了解了如何使用Scrapy从网站中提取和存储项目,但这只是表面。 Scrapy提供了许多强大的功能,可以轻松高效地进行抓取,例如:

  • 内置支持使用扩展的CSS选择器和XPath表达式从HTML / XML源中选择和提取数据,并使用正则表达式提取辅助方法。
  • 一个交互式shell控制台(支持IPython),用于尝试使用CSS和XPath表达式来抓取数据,在编写或调试蜘蛛时非常有用。
  • 内置支持以多种格式(JSON,CSV,XML)生成Feed导出并将其存储在多个后端(FTP,S3,本地文件系统)中。
  • 强大的编码支持和自动检测,用于处理外部,非标准和损坏的编码声明。
  • 强大的可扩展性支持,允许您使用信号和定义良好的API(中间件,扩展和管道)插入您自己的功能。
  • 广泛的内置扩展和中间件用于处理:

    • cookie和会话处理
    • HTTP功能,如压缩,身份验证,缓存
    • 用户代理欺骗
    • robots.txt
    • 爬行深度限制
    • 更多
  • 一个Telnet控制台,用于连接到Scrapy进程内部运行的Python控制台,以内省和调试您的爬虫
  • 还有其他好东西,比如可重复使用的蜘蛛,可以从Sitemaps和XML / CSV Feed中抓取网站,自动下载与抓取项目相关联的图像(或任何其他媒体)的媒体管道,缓存DNS解析器等等!

下一步是什么?

接下来的步骤是安装Scrapy,按照教程学习如何创建一个完整的Scrapy项目并加入社区。 感谢您的关注!

因为是自己翻译的,难免有错漏和不足,希望大家理解和支持。

第一步(FIRST STEPS)

-Scrapy概览(scrapy at a glance)

-安装向导(installation guide)

-Scrapy手册(scrapy tutorial)

-示例(examples)

基本概念(BASIC CONCEPTS)

-命令行工具(command line tool)

-爬虫(spiders)

-选择器(selectors)

-项目(items)

-项目加载器(item loaders)

-scrapy shell

-项目管道(items pipeline)

-(feed exports)

-请求和响应(requests和respones)

-链接提取器(link extractor)

-设置(settings)

-异常(exceptions)

内置服务(BUILT-IN SERVICE)

-日志(logging)

-状态回收(status collections)

-发送邮件(sending e-mail)

-telnet控制台(telnet console)

-web服务(web service)

解决具体问题

扩展Scrapy

所有其它