首页 > 解决方案 > 如何在单台电脑上提高 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

如果我可以获取所有 4000 万个页面 url,我应该如何提高爬取速度?(我真的很确定我能得到这个。)

将所有 url 放入 start_urls 并将 concurrent_requests 设置为 30 或更大?

我想到的一种方法是将所有 4000 万个页面 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})

标签: pythonscrapy

解决方案


推荐阅读