我测试了它的瓶颈。它来自中间人的选择查询。
class CheckDuplicatesFromDB(object):
def process_request(self, request, spider):
# url_list is a just python list. some urls in there.
if (request.url not in url_list):
self.crawled_urls = dict()
connection = pymysql.connect(host='123',
user='123',
password='1234',
db='123',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# Read a single record
sql = "SELECT `url` FROM `url` WHERE `url`=%s"
cursor.execute(sql, request.url)
self.crawled_urls = cursor.fetchone()
connection.commit()
finally:
connection.close()
if(self.crawled_urls is None):
return None
else:
if (request.url == self.crawled_urls['url']):
raise IgnoreRequest()
else:
return None
else:
return None
如果我在DOWNLOADER_MIDDLEWEARS
中停用了setting.py
,则scrapy抓取速度也不错。
禁用前:
scrapy.extensions.logstats]信息:抓取4页(每分钟0页),抓4件(每件2件/分)
禁用后:
[scrapy.extensions.logstats]信息:抓取55页(每页55页),抓取0项(每0分钟一次)
我猜选择查询是个问题。所以,我想选择一次查询并获取一个url数据来放置请求finger_prints
。
我正在使用CrawlerProcess:蜘蛛越多,抓取页面/分钟越少。
示例:
我想做的是:
finger_prints
我该怎么做?
答案 0 :(得分:0)
一个主要问题是,每次响应/调用process_request
时,都要打开与sql数据库的新连接。而是打开连接一次并保持打开状态。
虽然这会导致重大加速,但我怀疑还有其他瓶颈,一旦修复就会出现这种瓶颈。