我正在使用Scrapy,我在有关设置“CONCURRENT_REQUESTS”的文档上阅读。 他谈到“Scrapy下载程序将执行的最大并发(即同时)请求数”。
我创建了一个蜘蛛,以便从Q& A网站上获取问题和答案,所以我想知道是否有可能运行多个并发请求。 现在我已将此值设置为1,因为我不想丢失某个项目或覆盖某个人。 主要怀疑是我有任何项目的全局ID idQuestion(用于制作idQuestion.idAnswer)我不知道如果发出多个请求都可能是一团糟而且松散一些项目o set错误的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和ans_uid的答案。 例如:
1)问题
1.1)问题1的答案1
1.2)问题1的答案2
1.3)问题1的答案3
**我可以简单地增加CONCURRENT_REQUESTS值吗?什么都不妥协? **
答案 0 :(得分:1)
您的问题的答案是:否。如果您增加并发请求,则最终可能会为uid
设置不同的值 - 即使稍后问题相同。那是因为无法保证您的请求按顺序处理。
但是,您可以使用Request
属性在meta
个对象中传递信息。我会使用yield Request(...
作为元标记传递ID,然后查看parse_page
此属性是否可用。如果不是那么这是一个新问题,如果是,请使用此ID,因为这不是一个新问题。
您可以在此处详细了解meta
:http://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request.meta
答案 1 :(得分:0)
Scrapy 不是多线程环境,而是使用事件循环驱动的异步架构(Twisted,有点像node.js for python < /强>)。
从这个意义上说,它完全是线程安全的。
您实际上有一个对请求对象的引用作为响应 - &gt; response.request,它有response.request.url,以及发送的referer标头,以及response.request.meta,所以如果你正在阅读,你可以将答案映射回内置的问题。(如引用者的标题)从单个页面的问题或答案列表中,您可以保证按顺序阅读这些问题和答案。
您可以执行以下操作:
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 = ...
希望有所帮助。