Skip to main content

经常问的问题

Scrapy如何与BeautifulSoup或lxml比较?

BeautifulSouplxml 是用于解析HTML和XML的库。 Scrapy是一个用于编写网络蜘蛛的应用程序框架,用于抓取网站并从中提取数据。

Scrapy提供了一个用于提取数据的内置机制(称为 选择器),但是如果您感觉更舒适,可以轻松地使用 BeautifulSoup (或 lxml)。毕竟,他们只是解析库,可以从任何Python代码导入和使用。

换句话说,比较 BeautifulSoup (或 lxml)和Scrapy就像比较 jinja2Django

我可以使用Scrapy with BeautifulSoup吗?

是的你可以。如 以上 所述,BeautifulSoup 可以用于解析Scrapy回调中的HTML响应。你只需要将响应的主体提供给 BeautifulSoup 对象,并从中提取所需的任何数据。

这里有一个使用BeautifulSoup API的示例蜘蛛,用 lxml 作为HTML解析器:

from bs4 import BeautifulSoup
import scrapy


class ExampleSpider(scrapy.Spider):
    name = "example"
    allowed_domains = ["example.com"]
    start_urls = (
        'http://www.example.com/',
    )

    def parse(self, response):
        # use lxml to get decent HTML parsing speed
        soup = BeautifulSoup(response.text, 'lxml')
        yield {
            "url": response.url,
            "title": soup.h1.string
        }

注解

BeautifulSoup 支持多个HTML/XML解析器。请参阅 BeautifulSoup’s official documentation 上哪些可用。

Scrapy支持哪些Python版本?

Scrapy在Python 2.7和Python 3.3+下受支持。 Python 2.6支持从Scrapy 0.20开始删除。在Scrapy 1.1中添加了Python 3支持。

注解

Windows 3还不支持Python 3。

Scrapy“偷”X从Django?

也许,但我们不喜欢这个词。我们认为 Django 是一个伟大的开源项目和一个例子,所以我们使用它作为Scrapy的灵感。

我们相信,如果事情已经做得很好,没有必要重新发明它。这个概念除了作为开源和自由软件的基础之外,不仅适用于软件,还适用于文档,程序,政策等。因此,我们选择从这些项目中复制想法,而不是每个问题已经解决了他们,并专注于我们需要解决的真正问题。

如果Scrapy成为其他项目的灵感,我们会感到自豪。随意从我们偷窃!

Scrapy是否与HTTP代理协同工作?

是。通过HTTP代理下载中间件提供对HTTP代理的支持(自Scrapy 0.8起)。见 HttpProxyMiddleware

如何使用不同页面中的属性来抓取项目?

将附加数据传递给回调函数

Scrapy崩溃与:ImportError:没有模块名为win32api

由于 this Twisted bug,您需要安装 pywin32

如何在我的蜘蛛中模拟用户登录?

使用FormRequest.from_response()来模拟用户登录

Scrapy是否以广度优先或深度优先顺序爬行?

默认情况下,Scrapy使用 LIFO 队列来存储挂起的请求,这基本上意味着它在 DFO order 中爬行。这种顺序在大多数情况下更方便。如果您确实想要在真正的 BFO order 中抓取,您可以通过设置以下设置来进行抓取:

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

我的Scrapy爬虫有内存泄漏。我能做什么?

调试内存泄漏

此外,Python有一个内置的内存泄漏问题,在 泄漏无泄漏 中描述。

如何使Scrapy消耗更少的内存?

见上一个问题。

我可以在我的蜘蛛中使用基本HTTP身份验证吗?

是的,见 HttpAuthMiddleware

为什么Scrapy用英语而不是我的母语下载页面?

尝试通过覆盖 DEFAULT_REQUEST_HEADERS 设置更改默认 Accept-Language 请求头。

在哪里可以找到一些示例Scrapy项目?

例子

我可以运行一个蜘蛛没有创建一个项目?

是。您可以使用 runspider 命令。例如,如果你有一个蜘蛛写在一个 my_spider.py 文件,你可以运行它:

scrapy runspider my_spider.py

有关详细信息,请参阅 runspider 命令。

我得到“过滤的异地请求”消息。如何解决它们?

这些消息(以 DEBUG 级别记录)不一定意味着有问题,因此您可能不需要修复它们。

这些消息由非现场蜘蛛中间件抛出,它是一个蜘蛛中间件(默认情况下已启用),其目的是过滤出对蜘蛛所覆盖域以外的域的请求。

详情请参阅:OffsiteMiddleware

我可以使用JSON进行大型导出吗?

这取决于你的输出有多大。请参阅 JsonItemExporter 文档中的 这个警告

我可以从信号处理程序返回(扭转)延迟吗?

一些信号支持从处理程序返回延迟,其他信号不支持。见 内置信号参考 知道哪些。

响应状态代码999是什么意思?

999是Yahoo网站用于限制请求的自定义响应状态代码。尝试通过在蜘蛛中使用 2 (或更高版本)的下载延迟来减慢爬行速度:

class MySpider(CrawlSpider):

    name = 'myspider'

    download_delay = 2

    # [ ... rest of the spider code ... ]

或者通过使用 DOWNLOAD_DELAY 设置在项目中设置全局下载延迟。

我可以从我的蜘蛛调用 pdb.set_trace() 来调试它们吗?

是的,但你也可以使用Scrapy shell,它允许你快速分析(甚至修改)你的蜘蛛正在处理的响应,这通常比纯旧的 pdb.set_trace() 更有用。

更多信息请参阅 从蜘蛛调用shell检查响应

最简单的方法是将所有已删除的项目转储为JSON/CSV/XML文件?

转储到JSON文件:

scrapy crawl myspider -o items.json

转储到CSV文件:

scrapy crawl myspider -o items.csv

转储到XML文件:

scrapy crawl myspider -o items.xml

有关更多信息,请参阅 饲料出口

在一些形式中使用的是什么巨大的神秘的 __VIEWSTATE 参数?

__VIEWSTATE 参数用于使用ASP.NET/VB.NET构建的站点。有关如何工作的更多信息查看 this page。此外,这里有一个 example spider,其中一个这样的网站。

解析大型XML/CSV数据Feed的最佳方法是什么?

使用XPath选择器解析大源文件可能会有问题,因为它们需要在内存中构建整个源文件的DOM,这可能相当缓慢并消耗大量内存。

为了避免在内存中同时解析所有Feed,您可以使用 scrapy.utils.iterators 模块中的 xmlitercsviter 函数。事实上,这是饲料蜘蛛(见 蜘蛛)在盖下使用。

Scrapy是否自动管理Cookie?

是的,Scrapy接收并跟踪服务器发送的Cookie,并将其发送回后续请求,就像任何常规的网络浏览器。

有关更多信息,请参阅 请求和响应Cookie中间件

如何查看从Scrapy发送和接收的Cookie?

启用 COOKIES_DEBUG 设置。

我如何指示蜘蛛停止自己?

从回调中提高 CloseSpider 异常。详情请参阅:CloseSpider

如何防止我的Scrapy bot被禁止?

避免被禁止

我应该使用蜘蛛参数还是设置来配置我的蜘蛛?

蜘蛛参数设置 都可用于配置您的蜘蛛。没有严格的规则要求使用一个或另一个,但设置更适合参数,一旦设置,不会改变太多,而蜘蛛的参数意味着更频繁地更改,即使在每个蜘蛛运行,有时是需要蜘蛛完全运行(例如,设置蜘蛛的开始URL)。

为了说明一个例子,假设你有一个蜘蛛需要登录到一个网站抓取数据,而你只想从网站的某一部分(每次变化)抓取数据。在这种情况下,登录的凭据将是设置,而要刮除的部分的URL将是一个蜘蛛参数。

我正在抓一个XML文档,我的XPath选择器不返回任何项目

您可能需要删除命名空间。见 删除名称空间