如何提高一台计算机上的Scrapy爬行速度?

时间:2019-05-05 10:12:42

标签: python scrapy

我的情况:

我大约有4000万页面要爬网,并且所有反蜘蛛措施都被破解了。

现在,我使用scrapy只能在一台计算机上爬行60至100页一分钟。 (该网站具有足够的性能,并且我的带宽和CPU都很好)

如何提高爬行速度?

我的start_urls只有一个网址。所有下一个url由上一个响应创建。 我认为这可能是我遇到的问题。

一些设置:

RETRY_ENABLED = 1 
RETRY_TIMES = 2
DOWNLOAD_TIMEOUT = 15
DOWNLOAD_DELAY = 0 
CONCURRENT_REQUESTS = 100 
CONCURRENT_REQUESTS_PER_DOMAIN = 100 
CONCURRENT_REQUESTS_PER_IP = 100

如果我可以获取所有4,000万个页面URL,该如何提高爬网速度? (我真的确定我可以得到。)

将所有url都放置到start_urls并将并发请求设置为30或更大?

我想过的一种方法是将所有4,000万个页面URL放入redis数据库,并创建10个或更多线程来同时获取URL和爬网。

所以我可以设置线程以同时从redis获取url。 所有这些都应该在一台计算机上。

如何在一台计算机上提高Scrapy的爬行速度?

部分代码

def start_requests(self):

    url =  'https://www.xxxx.com/map_searchByLocation'

    longitude, latitude = get_next_coordinate(self.points, self.start_longitude, self.start_latitude, self.radius)

    data = get_form(longitude, latitude, self.radius)
    proxy = 'http://' + get_proxy()
    yield FormRequest(url, method='POST', formdata=data, callback=self.parse, dont_filter=True, meta={'proxy':proxy,'download_timeout':3,'longitude':data['longitude'], 'latitude':data['latitude'], 'data':data})

def parse(self, response):
    info_list = json.loads(response.text)
    if info_list['listCount']:
        for item in info_list['list']:
            item_loader = QiyeItemloader(item=QiyeItem())
            item_loader.add_value('hash', item['KeyNo'])
            item_loader.add_value('name', item['Name'])
            item_loader.add_value('longitude', response.meta['longitude'])
            item_loader.add_value('latitude', response.meta['latitude'])
            qiye_item= item_loader.load_item()
            yield qiye_item
    longitude, latitude = get_next_coordinate(self.points, response.meta['longitude'], response.meta['latitude'], self.radius)
    next_data = get_form(longitude, latitude, self.radius)
    yield FormRequest(response.url, method='POST', formdata = next_data, callback=self.parse, dont_filter=True, meta={'proxy':response.meta['proxy'],'download_timeout':3,'longitude':next_data['longitude'], 'latitude':next_data['latitude'], 'data':next_data})

0 个答案:

没有答案