Frequently Asked Questions

How does Scrapy compare to BeautifulSoup or lxml?

BeautifulSouplxml是用于解析HTML和XML的库. Scrapy是一个用于编写Web爬虫的应用程序框架,该爬虫对网站进行爬网并从中提取数据.

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

换句话说,将BeautifulSoup (或lxml )与Scrapy进行比较就像将jinja2Django进行比较.

Can I use 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
        }

Note

BeautifulSoup支持多个HTML / XML解析器. 请参阅BeautifulSoup的官方文档 ,其中有哪些可用.

What Python versions does Scrapy support?

Scrapy在Python 2.7和CPython(默认Python实现)和PyPy(从PyPy 5.9开始)下受支持. 从Scrapy 0.20开始删除了对Python 2.6的支持. Scrapy 1.1中增加了对Python 3的支持. 在Scrapy 1.4中添加了PyPy支持,在Scrapy 1.5中添加了PyPy3支持.

Note

对于Windows上的Python 3支持,建议使用安装指南中概述的 Anaconda / Miniconda.

Did Scrapy “steal” X from Django?

Probably, but we don’t like that word. We think Django is a great open source project and an example to follow, so we’ve used it as an inspiration for Scrapy.

我们相信,如果已经做好了某些工作,则无需重新发明它. 这个概念不仅是开源和自由软件的基础之一,不仅适用于软件,还适用于文档,过程,策略等.因此,我们选择自己从这些项目中复制想法,而不是自己研究每个问题.已经正确解决了这些问题,并专注于我们需要解决的实际问题.

如果Scrapy能够为其他项目提供灵感,我们将感到自豪. 随时从我们这里偷钱!

Does Scrapy work with HTTP proxies?

是. (从Scrapy 0.8开始)通过HTTP代理下载器中间件提供对HTTP代理的支持. 请参阅HttpProxyMiddleware .

How can I scrape an item with attributes in different pages?

See Passing additional data to callback functions.

Scrapy crashes with: ImportError: No module named win32api

由于此Twisted错误,您需要安装pywin32 .

How can I simulate a user login in my spider?

See Using FormRequest.from_response() to simulate a user login.

Does Scrapy crawl in breadth-first or depth-first order?

默认情况下,Scrapy使用LIFO队列存储未决请求,这基本上意味着它以DFO顺序进行爬网. 在大多数情况下,此命令更方便.

If you do want to crawl in true BFO order, you can do it by setting the following settings:

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

当挂起的请求低于CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_DOMAIN的配置值时,这些请求将同时发送. 结果,爬网的前几个请求很少遵循所需的顺序. 将这些设置降低为1强制执行所需的顺序,但会显着降低整个爬网的速度.

My Scrapy crawler has memory leaks. What can I do?

See Debugging memory leaks.

而且,Python有一个内置的内存泄漏问题,在无泄漏的泄漏中描述.

How can I make Scrapy consume less memory?

参见上一个问题.

Can I use Basic HTTP Authentication in my spiders?

是的,请参见HttpAuthMiddleware .

Why does Scrapy download pages in English instead of my native language?

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

Where can I find some example Scrapy projects?

See Examples.

Can I run a spider without creating a project?

是. 您可以使用runspider命令. 例如,如果您在my_spider.py文件中编写了蜘蛛,则可以使用my_spider.py命令运行它:

scrapy runspider my_spider.py

有关更多信息,请参见runspider命令.

I get “Filtered offsite request” messages. How can I fix them?

这些消息(使用DEBUG级别记录)不一定表示存在问题,因此您可能不需要修复它们.

这些消息由Offsite Spider中间件抛出,Offsite Spider中间件是蜘蛛中间件(默认情况下已启用),其目的是过滤对蜘蛛所涵盖的域之外的域的请求.

有关更多信息,请参见: OffsiteMiddleware .

Can I use JSON for large exports?

这将取决于您的输出量. 请参阅JsonItemExporter文档中的此警告 .

Can I return (Twisted) deferreds from signal handlers?

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

What does the response status code 999 means?

999是Yahoo网站用来限制请求的自定义响应状态代码. 尝试通过在Spider中使用2 (或更高)的下载延迟来降低抓取速度:

class MySpider(CrawlSpider):

    name = 'myspider'

    download_delay = 2

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

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

Can I call pdb.set_trace() from my spiders to debug them?

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

有关更多信息,请参见从蜘蛛调用外壳以检查响应 .

Simplest way to dump all my scraped items into a JSON/CSV/XML file?

要将其转储到JSON文件中:

scrapy crawl myspider -o items.json

要将其转储到CSV文件中:

scrapy crawl myspider -o items.csv

要将其转储到XML文件中:

scrapy crawl myspider -o items.xml

有关更多信息,请参见Feed导出

What’s this huge cryptic __VIEWSTATE parameter used in some forms?

__VIEWSTATE参数在使用ASP.NET/VB.NET构建的网站中使用. 有关其工作原理的更多信息,请参见此页面 . 另外,这是一个示例蜘蛛 ,它抓取了这些站点之一.

What’s the best way to parse big XML/CSV data feeds?

使用XPath选择器解析大型feed可能会遇到问题,因为它们需要在内存中构建整个feed的DOM,这可能会很慢并且会占用大量内存.

为了避免在内存中一次解析所有提要,可以使用scrapy.utils.iterators模块中的xmlitercsviter函数. 实际上,这就是饲料蜘蛛(请参见蜘蛛 )在盖子下面使用的功能.

Does Scrapy manage cookies automatically?

是的,Scrapy接收并跟踪服务器发送的cookie,并像任何常规的网络浏览器一样,将它们发送回后续的请求.

有关更多信息,请参见请求和响应以及CookiesMiddleware .

How can I see the cookies being sent and received from Scrapy?

启用COOKIES_DEBUG设置.

How can I instruct a spider to stop itself?

从回调CloseSpider异常. 有关更多信息,请参见: CloseSpider .

How can I prevent my Scrapy bot from getting banned?

See Avoiding getting banned.

Should I use spider arguments or settings to configure my spider?

蜘蛛参数设置均可用于配置蜘蛛. 没有严格的规则强制使用一个或另一个,但是设置更适合于设置后就不会有太大变化的参数,而蜘蛛参数要更频繁地更改,即使在每次运行蜘蛛时,有时也会蜘蛛程序必须完全运行(例如,设置蜘蛛程序的起始网址).

为了举例说明,假设您有一个蜘蛛,该蜘蛛需要登录到站点才能刮取数据,而您只想从站点的特定部分刮取数据(每次都不同). 在这种情况下,登录凭据将是设置,而要抓取的部分的网址将是蜘蛛参数.

I’m scraping a XML document and my XPath selector doesn’t return any items

您可能需要删除名称空间. 请参阅删除名称空间 .

How to split an item into multiple items in an item pipeline?

项目流水线不能为每个输入项目产生多个项目. 而是创建一个蜘蛛中间件 ,并为此目的使用其process_spider_output()方法. 例如:

from copy import deepcopy

from scrapy.item import BaseItem


class MultiplyItemsMiddleware:

    def process_spider_output(self, response, result, spider):
        for item in result:
            if isinstance(item, (BaseItem, dict)):
                for _ in range(item['multiply_by']):
                    yield deepcopy(item)