Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Scrapy并发_请求信息_Python_Multithreading_Python 2.7_Web Scraping_Scrapy - Fatal编程技术网

Python中的Scrapy并发_请求信息

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 这是一段代码:

我正在使用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
未初始化