scrapy - 提高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 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 进行侦听,因此对于网站来说,这些是不同的用户。然后你的蜘蛛可以更有礼貌(看看设置选项),你的整个项目会更快。所以不需要通过设置300
toCONCURRENT_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
.
推荐阅读
- mongoose - 如何填充存在于其他子对象中的子文档
- reactjs - 如何在 i18next 翻译字符串中的替换标签之间保留空格字符
- ruby-on-rails - 在activeadmin中编辑父记录的关系
- qt - 如何在粘贴到 TextFIeld 之前从剪贴板修改字符串?
- linux - 捕获信号时如何正确等待bash子进程完成
- r - 测试数据时间序列 - 如何合并 2 个数据集?
- powerbi - 有没有一种简单的方法可以在 Power bi 中创建具有重复目标值的列
- react-native - 尝试在环境变量中插入密钥并将它们用于 GetStream.io 提要时出现错误
- python-3.x - 降级的库在 conda 环境下不起作用
- android - 如何在相对布局中正确放置按钮