Python 如何将报废项目添加到集合中,并在满足条件时执行?
这段代码需要将提取的reviewId添加到一个集合中,以便省略重复项。然后有一个检查,当设置lenth为100时,执行回调,并将带有所有ID的长url字符串传递给主提取函数 如何将从不同回调中提取的所有ID保存到同一集中,并通过内置工具或代码进一步使用它?现在的问题是,lenth check循环从未被嵌入。 使现代化我相信有两个选项——将集合作为元传递给每个回调,并以某种方式使用项。但是多诺怎么做Python 如何将报废项目添加到集合中,并在满足条件时执行?,python,scrapy,Python,Scrapy,这段代码需要将提取的reviewId添加到一个集合中,以便省略重复项。然后有一个检查,当设置lenth为100时,执行回调,并将带有所有ID的长url字符串传递给主提取函数 如何将从不同回调中提取的所有ID保存到同一集中,并通过内置工具或代码进一步使用它?现在的问题是,lenth check循环从未被嵌入。 使现代化我相信有两个选项——将集合作为元传递给每个回调,并以某种方式使用项。但是多诺怎么做 import scrapy from scrapy.shell import inspect_re
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。但还没准备好实施这件事,它不会知道的。但是,您可以将这两个蜘蛛放在一个脚本中,因为蜘蛛的一次爬网将阻止另一个蜘蛛,直到爬网完成才开始爬网。看见