首页 > 解决方案 > 提高scrapy crawlera的爬行速度

问题描述

CONCURRENT_REQUESTS = 50
CONCURRENT_REQUESTS_PER_DOMAIN = 50
AUTOTHROTTLE_ENABLED = False
DOWNLOAD_DELAY= 0

检查后如何提高 Scrapy 爬行速度?,我的刮刀仍然很慢,大约需要 25 小时才能刮掉 12000 个页面(谷歌,亚马逊),我使用 Crawlera,我可以做更多的事情来提高速度CONCURRENT_REQUESTS =50吗?这意味着我什么时候有 50 个线程之类的请求?

标签: scrapy

解决方案


#如何运行多个蜘蛛实例

您的蜘蛛可以在终端中接受一些参数,如下所示scrapy crawl spider -a arg=value

假设您想启动 10 个实例,因为我猜您从 10 个 url 开始(引用:输入通常是 10 个 url)。命令可能是这样的:

scrapy crawl spider -a arg=url1 &
scrapy crawl spider -a arg=url2 &
...
scrapy crawl spider -a arg=url3

where&表示您在前一个命令之后启动命令,而无需等待前一个命令的结束。据我所知,在 Windows 或 Ubuntu 中,这种特殊需求的语法是一样的。

##Spider 源代码 为了能够像我展示的那样启动,spider 可以看起来像这样

class spiderExample(scrapy.Spiper):
    def __init__(arg): #all args in here are able to be entered in terminal with -a
        self.arg = arg #or self.start_urls = [arg] , because it can answer your problematic
        ... #any instructions you want, to initialize variables you need in the proccess 
            #by calling them with self.correspondingVariable in any method of the spider.
    def parse(self,response):#will start with start_urls
        ... #any instructions you want to in the current parsing method

#为了避免被禁止据我所知,你使用 Crawlera。就个人而言,我从未使用过这个。我从来不需要为此使用付费服务。

##每个蜘蛛一个IP 这里的目标很明确。正如我在评论中告诉你的那样,我使用 Tor 和 Polipo。Tor 需要像 Polipo 或 Privoxy 这样的 HTTP 代理才能在 scrapy spider 中正确运行。Tor 将与 HTTP 代理建立隧道,最后代理将与 Tor IP 一起工作。Crawlera 有趣的地方在于 Tor 的 IP 被一些流量很大的网站所熟知(所以很多机器人也通过它......)。这些网站可以禁止 Tor 的 IP,因为它们检测到与相同 IP 对应的机器人行为。

好吧,我不知道 Crawlera 是如何工作的,所以我不知道如何在 Crawlera 中打开多个端口并使用多个 IP。自己看吧。在我使用 Polipo 的情况下,我可以在我自己启动的几个 Tor 电路上运行几个隧道实例(polipo 正在监听 tor 的相应 socks 端口)。每个 Polipo 实例都有自己的监听端口。然后对于每个蜘蛛我可以运行以下

scrapy crawl spider -a arg=url1 -s HTTP_PROXY:127.0.0.1:30001 &
scrapy crawl spider -a arg=url2 -s HTTP_PROXY:127.0.0.1:30002 &
...
scrapy crawl spider -a arg=url10 -s HTTP_PROXY:127.0.0.1:30010 &

在这里,每个端口将使用不同的 IP 进行侦听,因此对于网站来说,这些是不同的用户。然后你的蜘蛛可以更有礼貌(看看设置选项),你的整个项目会更快。所以不需要通过设置300toCONCURRENT_REQUESTS或to来翻天覆地CONCURRENT_REQUESTS_PER_DOMAIN,它会使网站转动轮子并产生不必要的事件,例如 DEBUG: Retrying <GET https://www.website.com/page3000> (failed 5 times): 500 Internal Server Error

在我的个人喜好中,我喜欢为每个蜘蛛设置不同的日志文件。它避免了终端中的行数爆炸,并允许我在更舒适的文本文件中读取进程的事件。容易写在命令里-s LOG_FILE=thingy1.log。如果某些 url 没有按照你的意愿被抓取,它会很容易地告诉你。

##随机用户代理。当我读到 Crawlera 是一个聪明的解决方案时,因为它使用正确的用户代理来避免被禁止......我很惊讶,因为实际上你可以像这里一样自己做。当你自己做时,最重要的方面是选择流行的用户代理,在同一代理的大量用户中被忽略。您在某些网站上有可用的列表。此外,请小心使用计算机用户代理,而不是移动设备等其他设备,因为呈现的页面(我的意思是源代码)不一定相同,您可能会丢失要抓取的信息。

我的解决方案的主要缺点是它消耗您的计算机资源。因此,您选择的实例数量将取决于您的计算机容量(RAM、CPU ...)和路由器容量。就我个人而言,我仍在使用 ADSL,正如我告诉你的那样,在 20-30 分钟内完成了 6000 个请求......但我的解决方案并不比在CONCURRENT_REQUESTS.


推荐阅读