常见问题

Scrapy相BeautifulSoup或lxml比较,如何呢?

BeautifulSouplxml 是HTML和XML的分析库。 Scrapy则是 编写爬虫,爬取网页并获取数据的应用框架(application framework)。

Scrapy提供了内置的机制来提取数据(叫做selectors), 但如果您觉得使用更为方便,也可以使用 BeautifulSoup(或 lxml)。 总之,它们仅仅是分析库,可以在任何Python代码中被导入及使用。

换句话说,拿Scrapy与 BeautifulSoup(或 lxml) 比较就好像是拿 jinja2Django相比。

可以用BeautifulSoup使用Scrapy吗?

可以。 所述,BeautifulSoup可用于在Scrapy回调中解析HTML响应。您只需将响应的正文填充到BeautifulSoup对象中,并从中提取所需的任何数据。

下面是一个使用BeautifulSoup API的示例Spider,用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支持那些Python版本?

Scrapy仅仅支持Python 2.7和Python 3.3+。从Scrapy 0.20开始取消对Python 2.6的支持。Python 3的支持在Scrapy 1.1中添加。

Python 3在Windows上尚不支持。

Scrapy是否从Django中”剽窃”了X呢

也许吧,不过我们不喜欢这个词。 我们认为 Django是一个很好的开源项目,同时也是 一个很好的参考对象,所以我们把其作为Scrapy的启发对象。

我们坚信,如果有些事情已经做得很好了,那就没必要再重复制造轮子。 这个想法,作为 开源项目及免费软件的基石之一,不仅仅针对软件,也包括文档,过程,政策等等。 所以,与其自行解决每个问题,我们选择从其他已经很好地解决问题的项目中复制想法(copy idea) ,并把注意力放在真正需要解决的问题上。

如果Scrapy能启发其他的项目,我们将为此而自豪。 欢迎来抄(steal)我们!

Scrapy支持HTTP代理么?

是的。 (从Scrapy 0.8开始)通过HTTP代理下载中间件对HTTP代理提供了支持。 See HttpProxyMiddleware.

如何爬取属性在不同页面的item呢?

See Passing additional data to callback functions.

Scrapy退出,ImportError: Nomodule named win32api?

由于Twisted的这个bug,你需要安装pywin32

我要如何在spider里模拟用户登录呢?

参考 使用FormRequest.from_response()方法模拟用户登录.

Scrapy是以广度优先还是深度优先进行爬取的呢?

默认情况下,Scrapy使用 LIFO队列来存储等待的请求,简单的说,就是DFO顺序 深度优先对大多数情况下是更方便的。 如果您想以BFO 顺序进行爬取,你可以设置以下的设定:

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

我的Scrapy爬虫有内存泄露。我该做什么?

参考 调试内存溢出.

另外,Python自己也有内存泄露,在 Leaks without leaks 有所描述。

如何让Scrapy减少内存消耗?

参考上一个问题

我能在spider中使用基本HTTP认证么?

Yes, see HttpAuthMiddleware.

为什么Scrapy下载了英文的页面,而不是我的本国语言?

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

我能在哪里找到Scrapy项目的例子?

参考 例子.

我能在不创建Scrapy项目的情况下运行一个爬虫(spider)么?

是的。 您可以使用 runspider 命令。 例如,如果您有个 spider写在 my_spider.py 文件中,您可以运行:

scrapy runspider my_spider.py

详情请参考 runspider 命令。

我收到了 “Filtered offsite request” 消息。 如何修复?

这些消息(以 DEBUG 所记录)并不意味着有问题,所以你可以不修复它们。

该(默认启用的)中间件筛选出了不属于当前spider的站点请求。

For more info see: OffsiteMiddleware.

我能对大数据(large exports)使用JSON么?

这取决于您的输出有多大。 See this warning in JsonItemExporter documentation.

我能在信号处理器(signal handler)中返回(Twisted)引用么?

有些信号支持从处理器中返回引用,有些不行。 参考 内置信号参考手册(Built-in signals reference) 来了解详情。

reponse返回的状态值999代表了什么?

999是雅虎用来控制请求量所定义的返回值。 试着减慢爬取速度,将spider的下载延迟改为 2 或更高:

class MySpider(CrawlSpider):

    name = 'myspider'

    download_delay = 2

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

或在 DOWNLOAD_DELAY 中设置项目的全局下载延迟。

我能在spider中调用pdb.set_trace()来调试么?

可以,但你也可以使用Scrapy终端。这能让你快速分析(甚至修改) spider处理返回的返回(response),通常来说,比老旧的pdb.set_trace()有用多了。

更多详情请参考 在spider中启动shell来查看response.

将所有爬取到的item转存(dump)到JSON/CSV/XML文件的最简单的方法?

dump到JSON文件:

scrapy crawl myspider -o items.json

dump到CSV文件:

scrapy crawl myspider -o items.csv

dump到XML文件:

scrapy crawl myspider -o items.xml

For more information see Feed exports

在某些表单中巨大神秘的 __VIEWSTATE参数是什么?

__VIEWSTATE 参数存在于ASP.NET/VB.NET建立的站点中。 关于这个参数的作用请参考 这篇文章Also, here’s an example spider which scrapes one of these sites.

分析大XML/CSV数据源的最好方法是?

选择器需要在内存中对数据建立完整的 DOM树,这过程速度很慢且消耗大量内存。

为了避免一次性读取整个数据源,您可以使用 scrapy.utils.iterators 中的 xmlitercsviter 方法。 实际上,这也是feed spider(参考 Spiders)中的处理方法。

Scrapy自动管理cookies么?

是的,Scrapy接收并保持服务器返回来的cookies,在之后的请求会发送回去,就像正常的网页浏览器做的那样。

更多详情请参考 Requests and ResponsesCookiesMiddleware

如何才能看到Scrapy发出及接收到的Cookies呢?

启用 COOKIES_DEBUG 选项。

要怎么停止爬虫呢?

在回调函数中raise CloseSpider 异常。 更多详情请参见: CloseSpider

如何避免我的Scrapy机器人(bot)被禁止(ban)呢?

参考 避免被禁止(ban).

我应该使用spider参数还是设置来配置spider呢?

spider参数设置(settings) 都可以用来配置您的spider。 没有什么强制的规则来限定要使用哪个,但设置(settings)更适合那些一旦设置就不怎么会修改的参数, 而spider参数则意味着修改更为频繁,在每次spider运行都有修改,甚至是spider运行所必须的元素 (例如,设置spider的起始url)。

假设您有一个spider需要登录某个网站来 爬取数据,并且仅仅想爬取特定网站的特定部分(每次都不一定相同)。 在这个情况下,认证的信息将写在设置中,而爬取的特定部分的url将是spider参数。

我爬取了一个XML文档但是XPath选择器不返回任何的item

也许您需要移除命名空间(namespace)。 参见 移除命名空间.