我的情况:
我大约有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})