提高草率的爬虫爬行速度

时间:2019-09-07 18:30:03

标签: scrapy

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

检查How to increase Scrapy crawling speed?后,我的抓取工具仍然很慢,大约需要25个小时来抓取12000页(Google,Amazon),我使用了Crawlera,还有什么我可以做些提高速度的,以及何时{{1} }这是否意味着我有50个类似请求的线程?

2 个答案:

答案 0 :(得分:0)

很多因素都会影响您的抓取速度。但是CONCURRENT_REQUESTCONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAIN设置。尝试将它们设置为300之类的荒谬数字,然后从那里开始。

请参阅:https://docs.scrapy.org/en/latest/topics/settings.html#concurrent-requests

除此之外,请确保将AUTOTHROTTLE_ENABLED设置为False,并将DOWNLOAD_DELAY设置为0

即使由于内部行为而限制了scrapy的运行,您也可以始终启动爬行器的多个实例并以此来扩展速度。常见的原子方法是将url / id放入redisrabbitmq队列中,然后在出现多个scrapy实例的情况下弹出->爬网。

答案 1 :(得分:0)

如何运行Spider的多个实例

您的蜘蛛可以在终端中接受以下参数: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

&表示您在上一个命令之后启动命令,而不必等待上一个命令的结束。据我所知,Windows或Ubuntu中的语法符合这种特殊需求。

蜘蛛源代码

为了能够像我向您展示的那样发射,蜘蛛可能看起来像这样

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代理才能正确地在抓痒的蜘蛛中运行。 Tor将通过HTTP代理进行隧道传输,最后该代理将与Tor IP一起使用。 Crawlera可能令人感兴趣的地方是,Tor的IP被一些流量大的网站所熟知(所以很多机器人也通过它……)。这些网站可以禁止Tor的IP,因为它们检测到与同一IP对应的机器人行为。

好吧,我不知道Crawlera的工作方式,所以我不知道如何在Crawlera中打开多个端口并使用多个IP。自己看。就Polipo而言,我可以在我自己启动的多个Tor电路上运行多个实例化的隧道(polipo正在侦听tor的相应袜子端口)。每个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,因此对于网站而言,这些用户是不同的。这样,您的蜘蛛程序就可以变得更加礼貌(查看设置选项),并且整个项目更快。因此,无需通过将300设置为CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAIN来解决问题,这将使网站转动方向盘并生成不必要的事件,例如DEBUG: Retrying <GET https://www.website.com/page3000> (failed 5 times): 500 Internal Server Error

根据我的个人喜好,我喜欢为每个蜘蛛设置不同的日志文件。它避免了激增终端中的行数,并允许我在更舒适的文本文件中读取进程的事件。易于在命令-s LOG_FILE=thingy1.log中编写。如果某些网址没有按照您的意愿进行抓取,它将轻松地向您显示。

随机用户代理。

当我阅读Crawlera时,它是一个聪明的解决方案,因为它使用正确的用户代理来避免被禁止...我感到惊讶,因为实际上您可以像here一样自己动手做。单独执行此操作时,最重要的方面是选择在同一代理的大量用户中被忽略的流行用户代理。您在某些网站上有可用列表。此外,请注意并采取计算机用户代理而非移动设备之类的其他设备,因为呈现的页面(我的意思是源代码)不一定相同,并且您可能会丢失要剪贴的信息。

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