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
如果我可以获取所有 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})
解决方案
推荐阅读
- docker - Docker Jenkins 插件安装失败
- asp.net - 异步操作后的 HttpContext.Current null
- google-sheets - 计算一个月内出现次数的公式
- c++ - 一个函数可以通过 const 引用来获取参数*而不*接受临时变量作为参数吗?
- python - 为什么 BigQuery API 调用需要这么长时间?
- java - 无法解析为变量 println
- google-apps-script - Google Scripts px 打印单元
- dart - 错误:编译失败。飞镖功能失败
- javascript - AXIOS:第一次调用 API 返回默认状态
- swagger - 定义具有固定和每个端点组件的全局响应结构的方法?