Scrapy 提高刮痧爬虫的爬行速度

Scrapy 提高刮痧爬虫的爬行速度,scrapy,Scrapy,检查后,我的scraper仍然很慢,大约需要25个小时才能抓取12000页(谷歌、亚马逊),我使用Crawlera,我还可以做些什么来提高速度,当并发请求=50时,这是否意味着我有50个线程式请求?有很多事情会影响你的爬虫速度。但是并发请求和并发请求和每个域的并发请求设置。试着将它们设置为一些非常难的数字,比如300,然后从那里开始 见: 除此之外,请确保已启用自动锁定设置为False,下载延迟设置为0 即使scrapy受到其内部行为的限制,您也可以随时启动爬虫的多个实例,并以此来扩展您的速度。

检查后,我的scraper仍然很慢,大约需要25个小时才能抓取12000页(谷歌、亚马逊),我使用Crawlera,我还可以做些什么来提高速度,当并发请求=50时,这是否意味着我有50个线程式请求?

有很多事情会影响你的爬虫速度。但是
并发请求
并发请求
每个域的并发请求
设置。试着将它们设置为一些非常难的数字,比如
300
,然后从那里开始

见:

除此之外,请确保已启用
自动锁定
设置为
False
下载延迟
设置为
0

即使scrapy受到其内部行为的限制,您也可以随时启动爬虫的多个实例,并以此来扩展您的速度。常见的原子方法是将URL/ID放入
redis
rabbitmq
队列,然后在多个碎片实例中对其进行抓取。

\

您的爬行器可以在终端中采用以下参数:
scrapy crawl spider-a arg=value

让我们假设您想要开始10个实例,因为我猜您是从10个URL开始的(引用:输入通常是10个URL)。命令可以如下所示:

CONCURRENT_REQUESTS = 50
CONCURRENT_REQUESTS_PER_DOMAIN = 50
AUTOTHROTTLE_ENABLED = False
DOWNLOAD_DELAY= 0
其中,
&
表示在前一个命令之后启动命令,而不等待前一个命令的结束。据我所知,对于这个特殊的需求,Windows或Ubuntu中的语法是相同的

##蜘蛛源代码 为了能够像我展示给你的那样发射,蜘蛛可以看起来像这样

scrapy crawl spider -a arg=url1 &
scrapy crawl spider -a arg=url2 &
...
scrapy crawl spider -a arg=url3
#避免被禁止 据我所知,你用的是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实例都有自己的侦听端口。然后,对于每个蜘蛛,我可以运行以下命令

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
在这里,每个端口将使用不同的IP侦听,因此对于网站而言,这些是不同的用户。然后你的蜘蛛会更有礼貌(看看设置选项),你的整个项目会更快。因此,无需将
300
设置为
CONCURRENT\u REQUESTS
CONCURRENT\u REQUESTS\u PER\u DOMAIN
,这将使网站转动方向盘,并生成不必要的事件,如
调试:重试(失败5次):500内部服务器错误

在我个人的偏好中,我喜欢为每个蜘蛛设置不同的日志文件。它避免了在终端中爆炸行的数量,并允许我在一个更舒适的文本文件中读取进程的事件。易于在命令
-s LOG\u FILE=thingy1.LOG
中编写。它会很容易地告诉你,如果一些网址没有刮到你想要的

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


我的解决方案的主要缺点是它会消耗您的计算机资源。因此,实例数量的选择将取决于您的计算机容量(RAM、CPU…)以及路由器容量。就我个人而言,我仍然在使用ADSL,正如我告诉你的,在20-30分钟内完成了6000个请求。。。但我的解决方案所消耗的带宽并不比在
并发\u请求上设置一个疯狂的数量要多

对于我来说,您增加
并发\u请求的次数越多
您就越有可能被禁止。就我个人而言,我和你面临着同样的问题。因此,我使用tor和polipo proxy一次运行同一个爬行器好几次,我所有的爬行器都在不同的电路和端口上侦听。对于6000个URL,大约需要20-30分钟。如果你对它感兴趣,这将是一个很长的答案,我可以做。。。所以告诉我。@AvyWam我很感兴趣,请分享你看到了吗?链接是由蜘蛛生成的,我的意思是输入通常是10个URL,然后蜘蛛会根据它们找到其余的10k个URL。您还提到了300个并发Crawlera计划提供最多50个,这会影响流程吗?@Piggydog如果Crawlera只提供50个,那么您会受到限制。这可能是你的瓶颈——要么放弃crawlera,选择其他解决方案,要么升级你的计划。
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 &