Python 如何将报废项目添加到集合中,并在满足条件时执行?

Python 如何将报废项目添加到集合中,并在满足条件时执行?,python,scrapy,Python,Scrapy,这段代码需要将提取的reviewId添加到一个集合中,以便省略重复项。然后有一个检查,当设置lenth为100时,执行回调,并将带有所有ID的长url字符串传递给主提取函数 如何将从不同回调中提取的所有ID保存到同一集中,并通过内置工具或代码进一步使用它?现在的问题是,lenth check循环从未被嵌入。 使现代化我相信有两个选项——将集合作为元传递给每个回调,并以某种方式使用项。但是多诺怎么做 import scrapy from scrapy.shell import inspect_re

这段代码需要将提取的reviewId添加到一个集合中,以便省略重复项。然后有一个检查,当设置lenth为100时,执行回调,并将带有所有ID的长url字符串传递给主提取函数

如何将从不同回调中提取的所有ID保存到同一集中,并通过内置工具或代码进一步使用它?现在的问题是,lenth check循环从未被嵌入。 使现代化我相信有两个选项——将集合作为元传递给每个回调,并以某种方式使用项。但是多诺怎么做

import scrapy
from scrapy.shell import inspect_response



class QuotesSpider(scrapy.Spider):
    name = "tripad"
    list= set()

    def start_requests(self):
        url = "https://www.tripadvisor.com/Hotel_Review-g60763-d122005-Reviews-or{}-The_New_Yorker_A_Wyndham_Hotel-New_York_City_New_York.html#REVIEWS"

        for i in range(0,500,5):
            yield scrapy.Request(url=url.format(i), callback=self.parse)

    def parse(self, response):

        for result in response.xpath('//div[contains(@id,"review_")]/@id').extract():
            if "review" in result[:8]:
                QuotesSpider.list.add(result[7:] +"%2C")
            if len(QuotesSpider.list) == 100:
                url = "https://www.tripadvisor.com/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS&metaReferer=Hotel_Review&reviews="

                for i in QuotesSpider.list:
                    url+=i
                yield scrapy.Request(url=url, callback=self.parse_page)

有几种方法可以做到这一点,但我建议将蜘蛛分为两部分:

收集审查ID的Spider

class CollectorSpider(Spider): 
    name='collect_reviews'
    def parse(self, response):
        review_ids = ...
        for review_id in review_ids:
            yield {'review_id': review_id}
使用收集的审阅ID收集审阅内容的Spider

class ConsumerSpider(Spider):
    name='consume_reviews'
    def start_requests(self):
        with open(self.file, 'r') as f:
            data = json.loads(f.read())
        last = 0
        for i in range(0, len(data), 100):
            ids = data[last:i]
            ids = [i['review_id'] for i in ids]
            # make url from ids
            url = ''
            yield Request(url)

    def parse(self, response):
        # crawl 100 reviews here

您可以使用更简单的xpath表达式//div[@class=reviewSelector]/@id代替//div[contains@id,review.]/@id。它只返回id值:review.\u somenumbers谢谢。我会的。但这不是这里的问题抱歉,如果不清楚的话。你有没有理由只在列表有100长的时候才生成URL?此外,在使用scrapy时,您不应该在类或实例参数中存储任何类型的状态,因为整个系统是并发的,您将遇到很多问题,因为参数在多个位置同时被修改。在您的用例中,我建议您将spider分为两个spider。一个爬网评论ID,然后你可以把它放在一个文件中,第二个打开这个文件,自己爬网评论。还有另外一个更高级的解决方案,我可以写一个答案,但我建议使用龙龙龙,原因是tripadvicer的局限性。url可以在一个页面中返回100或150条评论,但不能返回更多。虽然现在它并不重要,因为有些评论似乎无法完全加载。很遗憾,据我所知,我对ess页面的请求越少,加载的速度就越快。谢谢。我明白逻辑。但这一过程需要自动化。当收集器完成时,第二个spider如何知道何时打开文件?我读了一些关于管道的文章,在这里你们可以做一些工作,比如检查项目的大小或者启动并运行spdier。但还没准备好实施这件事,它不会知道的。但是,您可以将这两个蜘蛛放在一个脚本中,因为蜘蛛的一次爬网将阻止另一个蜘蛛,直到爬网完成才开始爬网。看见