Python中的Scrapy并发_请求信息
我正在使用Scrapy,我在文档上读到关于设置“并发请求”的内容。 他谈到“Scrapy downloader将执行的最大并发(即同时)请求数。” 我创建了一个蜘蛛,以便从问答网站上获取问题和答案,所以我想知道是否有可能运行多个并发请求。 现在我将该值设置为1,因为我不想丢失某些项或覆盖某些项。 主要疑问是我有一个全局ID idQuestion(用于生成idQuestion.idAnswer)用于任何项目,我不知道发出多个请求是否都可能是一团混乱,并丢失一些项目以设置错误的ID 这是一段代码:Python中的Scrapy并发_请求信息,python,multithreading,python-2.7,web-scraping,scrapy,Python,Multithreading,Python 2.7,Web Scraping,Scrapy,我正在使用Scrapy,我在文档上读到关于设置“并发请求”的内容。 他谈到“Scrapy downloader将执行的最大并发(即同时)请求数。” 我创建了一个蜘蛛,以便从问答网站上获取问题和答案,所以我想知道是否有可能运行多个并发请求。 现在我将该值设置为1,因为我不想丢失某些项或覆盖某些项。 主要疑问是我有一个全局ID idQuestion(用于生成idQuestion.idAnswer)用于任何项目,我不知道发出多个请求是否都可能是一团混乱,并丢失一些项目以设置错误的ID 这是一段代码:
class Scraper(scrapy.Spider):
uid = 1
def parse_page(self, response):
# Scraping a single question
item = ScrapeItem()
hxs = HtmlXPathSelector(response)
#item['date_time'] = response.meta['data']
item['type'] = "Question"
item['uid'] = str(self.uid)
item['url'] = response.url
#Do some scraping.
ans_uid = ans_uid + 1
item['uid'] = str(str(self.uid) + (":" + str(ans_uid)))
yield item
#Call recusivly the method on other page.
print("NEXT -> "+str(composed_string))
yield scrapy.Request(composed_string, callback=self.parse_page)
这是我的代码的框架。
我用uid来记忆单个问题的id,用ANSU uid来记忆答案。
例:
1) 问题:
1.1)问题1的答案1
1.2)问题1的Ans 2
1.3)问题1的答案3
**我可以简单地增加并发_请求值吗?没有任何妥协** 你的问题的答案是:不。如果增加并发请求,则可能会导致
uid
的值不同,即使以后的问题是相同的。这是因为不能保证您的请求得到有序处理
但是,您可以使用meta
属性沿请求
对象传递信息。我会将ID和yield Request(…
作为元标记传递,然后在parse_页面中查看此属性是否可用。如果不可用,则为新问题,如果是,则使用此ID,因为这不是新问题
你可以在这里阅读更多关于meta
:Scrapy不是一个多线程环境,而是使用一个事件循环驱动的异步架构(Twisted,有点像python的node.js)
从这个意义上讲,它是完全线程安全的。
实际上,您对请求对象的引用是response->response.request,其中包含response.request.url以及发送的referer头和response.request.meta,因此您可以将答案映射回内置的问题。(类似于某种referer头)如果您是从一页的问题或答案列表中阅读,您可以保证这些问题和答案将按顺序阅读
您可以执行以下操作:
class mySpider(Spider):
def parse_answer(self, response):
question_url = response.request.headers.get('Referer', None)
yield Answer(question_url = ..., answerinfo = ... )
class Answer(item):
answer = ....
question_url = ...
希望对您有所帮助。ans\u uid
未初始化