炫意html5
最早CSS3和HTML5移动技术网站之一

Scrapy – 常见问题

Scrapy与BeautifulSoup或LXML相比如何?¶

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

Scrapy提供了一种用于提取数据的内置机制(称为:ref:selectors <topics-selectors>)但你可以轻松使用`BeautifulSoup`_(或`lxml`_),如果你觉得使用它们更舒服。 毕竟,他们只是解析可以从任何Python代码导入和使用的库。

换句话说,将`BeautifulSoup`_(或`lxml`_)与Scrapy进行比较就像将`jinja2`_与`Django`_进行比较。

我可以和BeautifulSoup一起使用Scrapy吗?¶

是的你可以。 如上所述:ref:above <faq-scrapy-bs-cmp>`BeautifulSoup`_可用于解析Scrapy回调中的HTML响应。 您只需将响应的主体提供给“BeautifulSoup“对象,并从中提取所需的任何数据。

下面是一个使用BeautifulSoupAPI的蜘蛛示例, 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的官方文档”,了解哪些可用。

Scrapy是否从Django“窃取”X?¶

可能吧,但我们不喜欢这个词。我们认为django_u是一个伟大的开源项目,也是一个可以效仿的例子,所以我们把它作为scrappy的灵感来源。

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

如果Scrapy能为其他项目提供灵感,我们会感到骄傲。随时从我们这里偷东西!

Scrapy与HTTP代理一起工作吗?¶

是。 通过HTTP代理下载器中间件提供对HTTP代理的支持(自Scrapy 0.8起)。 请参阅:class:~scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware

如何在不同的页面中抓取具有属性的项目?¶

向回调函数传递附加数据 .

Scrapy崩溃:importError:没有名为win32api的模块¶

您需要安装 pywin32 因为这个 Twisted bug`_ .

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

使用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'

当挂起的请求低于配置的值时 CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP ,这些请求同时发送。因此,前几个爬行请求很少遵循所需的顺序。将这些设置降低到 1 强制执行所需的顺序,但它会显著降低整体爬行速度。

我可怜的爬虫有记忆漏洞。我能做什么?¶

调试内存泄漏 .

此外,Python有一个内置的内存泄漏问题,在下面描述:ref:topics-leaks-without-leaks

我怎么能让 Scrapy 消耗更少的记忆?¶

请参阅前面的问题。

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

是的,请参阅:class:~scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware

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

尝试更改默认值 Accept-Language request header by overriding the DEFAULT_REQUEST_HEADERS 设置。

我在哪里可以找到一些零碎项目的例子?¶

实例 .

我可以在不创建项目的情况下运行蜘蛛吗?¶

对。你可以使用 runspider 命令。例如,如果有一个蜘蛛用 my_spider.py 您可以用以下方式运行它的文件:

scrapy runspider my_spider.py

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

我收到“Filtered offsite request”消息。 我该如何解决这些问题?¶

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

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

有关详细信息,请参阅: OffsiteMiddleware .

在生产中,建议采用什么方式部署 Scrapy ?¶

部署蜘蛛 .

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

这取决于你的输出有多大。 请参阅:ref:this warning <json-with-large-data>`in:class:`~scrapy.exporters.JsonItemExporter documentation。

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

一些信号支持从其处理程序返回延迟,而另一些则不支持。请参见 内置信号参考 以了解哪些。

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

999是雅虎网站用来限制请求的自定义响应状态代码。尝试使用下载延迟来降低爬行速度 2 (或更高)在你的蜘蛛:

class MySpider(CrawlSpider):
name = 'myspider'
download_delay = 2
# [ ... rest of the spider code ... ]

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

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

是的,但是您也可以使用scriby shell,它允许您快速分析(甚至修改)您的spider正在处理的响应,这通常比普通的老版本更有用。 pdb.set_trace() .

有关详细信息,请参阅 从spiders调用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

有关详细信息,请参阅 Feed 导出

在某些形式中使用的这个巨大的神秘“__VIEWSTATE“参数是什么?¶

这个 __VIEWSTATE 参数用于使用ASP.NET/VB.NET生成的网站。有关其工作方式的详细信息,请参见 this page . 还有,这里有一个 example spider 会爬取其中一个站点。

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

使用xpath选择器解析大型提要可能会有问题,因为它们需要在内存中构建整个提要的DOM,这可能会非常慢,并且会消耗大量内存。

为了避免在内存中一次分析所有提要,可以使用函数 xmlitercsviterscrapy.utils.iterators 模块。事实上,这就是食性蜘蛛(参见 蜘蛛 )在封面下的用法。

Scrapy是否自动管理cookies?¶

是的,Scrapy接收并跟踪服务器发送的cookie,并像任何普通的Web浏览器一样,在随后的请求中发送它们。

有关详细信息,请参阅 请求和响应CookiesMiddleware .

我如何才能看到从Scrapy发送和接收的cookies?¶

启用 COOKIES_DEBUG 设置。

我怎样才能指示蜘蛛停止自己呢?¶

从回调中提出:exc:~scrapy.exceptions.CloseSpider`异常。 有关详细信息,请参阅:: exc:`~scrapy.exceptions.CloseSpider

如何防止我的Scrapy机器人被禁止?¶

避免被禁止 .

我应该使用蜘蛛参数或设置来配置我的蜘蛛吗?¶

两个 spider argumentssettings 可以用来配置蜘蛛。没有严格的规则要求使用其中一个或另一个,但是设置更适合于参数,一旦设置,就不会改变太多,而spider参数的更改更频繁,甚至在每次spider运行时,有时甚至需要spider运行(例如,设置spider的起始URL)。

举个例子来说明,假设您有一个蜘蛛需要登录到一个站点来获取数据,并且您只想从站点的某个部分(每次都不同)获取数据。在这种情况下,登录的凭证将是设置,而要擦除的部分的URL将是spider参数。

我正在抓取一个XML文档,而我的xpath选择器没有返回任何项¶

可能需要删除命名空间。见 正在删除命名空间 .

如何在项目管道中将项目拆分为多个项目?¶

Item pipelines 无法为每个输入项生成多个项。 Create a spider middleware 而是使用它 process_spider_output() 方法。例如::

from copy import deepcopy
from itemadapter import is_item, ItemAdapter
class MultiplyItemsMiddleware:
def process_spider_output(self, response, result, spider):
for item in result:
if is_item(item):
adapter = ItemAdapter(item)
for _ in range(adapter['multiply_by']):
yield deepcopy(item)

Scrapy支持IPv6地址吗?¶

是的,通过设置 DNS_RESOLVERscrapy.resolver.CachingHostnameResolver . 注意,这样做,您就失去了为DNS请求设置特定超时的能力( DNS_TIMEOUT 设置被忽略)。

如何处理 <class 'ValueError'>: filedescriptor out of range in select() 例外情况?¶

本期 has been reported 在macOS中运行broad crawls时出现,默认的Twisted reactor是 twisted.internet.selectreactor.SelectReactor . 通过使用 TWISTED_REACTOR 设置。

如何取消对给定响应的下载?¶

在某些情况下,停止下载某个响应可能会很有用。例如,如果您只需要大型响应的第一部分,并且希望通过避免下载整个正文来节省资源。在这种情况下,可以将处理程序附加到 bytes_received 发出信号并升起 StopDownload 例外情况。请参考 停止下载响应 主题以获取更多信息和示例。

Scrapy与BeautifulSoup或LXML相比如何?¶

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

Scrapy提供了一种用于提取数据的内置机制(称为:ref:selectors <topics-selectors>)但你可以轻松使用`BeautifulSoup`_(或`lxml`_),如果你觉得使用它们更舒服。 毕竟,他们只是解析可以从任何Python代码导入和使用的库。

换句话说,将`BeautifulSoup`_(或`lxml`_)与Scrapy进行比较就像将`jinja2`_与`Django`_进行比较。

我可以和BeautifulSoup一起使用Scrapy吗?¶

是的你可以。 如上所述:ref:above <faq-scrapy-bs-cmp>`BeautifulSoup`_可用于解析Scrapy回调中的HTML响应。 您只需将响应的主体提供给“BeautifulSoup“对象,并从中提取所需的任何数据。

下面是一个使用BeautifulSoupAPI的蜘蛛示例, 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的官方文档”,了解哪些可用。

Scrapy是否从Django“窃取”X?¶

可能吧,但我们不喜欢这个词。我们认为django_u是一个伟大的开源项目,也是一个可以效仿的例子,所以我们把它作为scrappy的灵感来源。

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

如果Scrapy能为其他项目提供灵感,我们会感到骄傲。随时从我们这里偷东西!

Scrapy与HTTP代理一起工作吗?¶

是。 通过HTTP代理下载器中间件提供对HTTP代理的支持(自Scrapy 0.8起)。 请参阅:class:~scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware

如何在不同的页面中抓取具有属性的项目?¶

向回调函数传递附加数据 .

Scrapy崩溃:importError:没有名为win32api的模块¶

您需要安装 pywin32 因为这个 Twisted bug`_ .

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

使用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'

当挂起的请求低于配置的值时 CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP ,这些请求同时发送。因此,前几个爬行请求很少遵循所需的顺序。将这些设置降低到 1 强制执行所需的顺序,但它会显著降低整体爬行速度。

我可怜的爬虫有记忆漏洞。我能做什么?¶

调试内存泄漏 .

此外,Python有一个内置的内存泄漏问题,在下面描述:ref:topics-leaks-without-leaks

我怎么能让 Scrapy 消耗更少的记忆?¶

请参阅前面的问题。

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

是的,请参阅:class:~scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware

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

尝试更改默认值 Accept-Language request header by overriding the DEFAULT_REQUEST_HEADERS 设置。

我在哪里可以找到一些零碎项目的例子?¶

实例 .

我可以在不创建项目的情况下运行蜘蛛吗?¶

对。你可以使用 runspider 命令。例如,如果有一个蜘蛛用 my_spider.py 您可以用以下方式运行它的文件:

scrapy runspider my_spider.py

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

我收到“Filtered offsite request”消息。 我该如何解决这些问题?¶

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

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

有关详细信息,请参阅: OffsiteMiddleware .

在生产中,建议采用什么方式部署 Scrapy ?¶

部署蜘蛛 .

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

这取决于你的输出有多大。 请参阅:ref:this warning <json-with-large-data>`in:class:`~scrapy.exporters.JsonItemExporter documentation。

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

一些信号支持从其处理程序返回延迟,而另一些则不支持。请参见 内置信号参考 以了解哪些。

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

999是雅虎网站用来限制请求的自定义响应状态代码。尝试使用下载延迟来降低爬行速度 2 (或更高)在你的蜘蛛:

class MySpider(CrawlSpider):
name = 'myspider'
download_delay = 2
# [ ... rest of the spider code ... ]

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

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

是的,但是您也可以使用scriby shell,它允许您快速分析(甚至修改)您的spider正在处理的响应,这通常比普通的老版本更有用。 pdb.set_trace() .

有关详细信息,请参阅 从spiders调用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

有关详细信息,请参阅 Feed 导出

在某些形式中使用的这个巨大的神秘“__VIEWSTATE“参数是什么?¶

这个 __VIEWSTATE 参数用于使用ASP.NET/VB.NET生成的网站。有关其工作方式的详细信息,请参见 this page . 还有,这里有一个 example spider 会爬取其中一个站点。

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

使用xpath选择器解析大型提要可能会有问题,因为它们需要在内存中构建整个提要的DOM,这可能会非常慢,并且会消耗大量内存。

为了避免在内存中一次分析所有提要,可以使用函数 xmlitercsviterscrapy.utils.iterators 模块。事实上,这就是食性蜘蛛(参见 蜘蛛 )在封面下的用法。

Scrapy是否自动管理cookies?¶

是的,Scrapy接收并跟踪服务器发送的cookie,并像任何普通的Web浏览器一样,在随后的请求中发送它们。

有关详细信息,请参阅 请求和响应CookiesMiddleware .

我如何才能看到从Scrapy发送和接收的cookies?¶

启用 COOKIES_DEBUG 设置。

我怎样才能指示蜘蛛停止自己呢?¶

从回调中提出:exc:~scrapy.exceptions.CloseSpider`异常。 有关详细信息,请参阅:: exc:`~scrapy.exceptions.CloseSpider

如何防止我的Scrapy机器人被禁止?¶

避免被禁止 .

我应该使用蜘蛛参数或设置来配置我的蜘蛛吗?¶

两个 spider argumentssettings 可以用来配置蜘蛛。没有严格的规则要求使用其中一个或另一个,但是设置更适合于参数,一旦设置,就不会改变太多,而spider参数的更改更频繁,甚至在每次spider运行时,有时甚至需要spider运行(例如,设置spider的起始URL)。

举个例子来说明,假设您有一个蜘蛛需要登录到一个站点来获取数据,并且您只想从站点的某个部分(每次都不同)获取数据。在这种情况下,登录的凭证将是设置,而要擦除的部分的URL将是spider参数。

我正在抓取一个XML文档,而我的xpath选择器没有返回任何项¶

可能需要删除命名空间。见 正在删除命名空间 .

如何在项目管道中将项目拆分为多个项目?¶

Item pipelines 无法为每个输入项生成多个项。 Create a spider middleware 而是使用它 process_spider_output() 方法。例如::

from copy import deepcopy
from itemadapter import is_item, ItemAdapter
class MultiplyItemsMiddleware:
def process_spider_output(self, response, result, spider):
for item in result:
if is_item(item):
adapter = ItemAdapter(item)
for _ in range(adapter['multiply_by']):
yield deepcopy(item)

Scrapy支持IPv6地址吗?¶

是的,通过设置 DNS_RESOLVERscrapy.resolver.CachingHostnameResolver . 注意,这样做,您就失去了为DNS请求设置特定超时的能力( DNS_TIMEOUT 设置被忽略)。

如何处理 <class 'ValueError'>: filedescriptor out of range in select() 例外情况?¶

本期 has been reported 在macOS中运行broad crawls时出现,默认的Twisted reactor是 twisted.internet.selectreactor.SelectReactor . 通过使用 TWISTED_REACTOR 设置。

如何取消对给定响应的下载?¶

在某些情况下,停止下载某个响应可能会很有用。例如,如果您只需要大型响应的第一部分,并且希望通过避免下载整个正文来节省资源。在这种情况下,可以将处理程序附加到 bytes_received 发出信号并升起 StopDownload 例外情况。请参考 停止下载响应 主题以获取更多信息和示例。

炫意HTML5 » Scrapy – 常见问题

Java基础教程Android基础教程