有关Python中Scrapy CONCURRENT_REQUESTS的信息

时间:2015-10-14 13:06:03

标签: python multithreading python-2.7 web-scraping scrapy

我正在使用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值吗?什么都不妥协? **

2 个答案:

答案 0 :(得分:1)

您的问题的答案是:。如果您增加并发请求,则最终可能会为uid设置不同的值 - 即使稍后问题相同。那是因为无法保证您的请求按顺序处理。

但是,您可以使用Request属性在meta个对象中传递信息。我会使用yield Request(...作为元标记传递ID,然后查看parse_page此属性是否可用。如果不是那么这是一个新问题,如果是,请使用此ID,因为这不是一个新问题。

您可以在此处详细了解metahttp://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 = ...

希望有所帮助。