我试图从TripAdvisor用scrapy刮餐厅评论。在不同的网页(分页)上共享单个餐厅的评论。我把评论刮下来,然后将结果保存在JSON文件或mongoDB中。你知道吗
问题是,当我检查在控制台中刮下的项目时,评论是混合的,例如餐厅A将有它的评论和餐厅B的一些评论,餐厅B将有这些评论丢失。你知道吗
我试图更改设置中的最大并发请求数,但这并不影响结果。你知道吗
这是你的名字蜘蛛.py代码
class TripAdvisorItemSpider(scrapy.Spider):
name = 'tripadvisor'
custom_settings = {
'COLLECTION_NAME' : 'tripadvisor'
}
def __init__(self, depth="1", *args, **kwargs):
super(TripAdvisorItemSpider, self).__init__(*args, **kwargs)
self.start_urls = get_start_urls()
self.depth = int(depth)
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url = url, callback = self.parse, meta = {'item' : Place.Place()})
def parse_review_page(self, response):
#On ajoute les reviews de la page actuelle à celle de la page précèdente
item = response.meta['item']
item['reviews'] += get_page_reviews(response)
if(len(self.urls) > 0):
yield scrapy.Request(url= self.urls.pop(0), callback = self.parse_review_page, meta = {'item' : item})
else:
yield item
def parse(self, response):
if (self.depth > 1):
self.urls = create_pagination_urls(response.request.url, self.depth)
item = response.meta['item']
item['place'] = response.css("h1::text").extract_first()
item['content'] = get_content(response)
item['reviews'] = get_page_reviews(response)
if(self.depth > 1):
yield scrapy.Request(url=self.urls.pop(0), callback=self.parse_review_page, meta = {'item' : item})
else:
yield item
我被这个问题困住了,它一定和请求对象的生存期有关,但是我不知道我做错了什么。你知道吗
谢谢你的帮助。你知道吗
我找到了答案
我发现请求,即使我使用
MAX_CONCURRENT_REQUESTS = 1
也是异步发送的,并且不是按调用顺序发送的!你知道吗这导致
self.urls
在两个分页请求之间被重新定义,用另一个餐厅的页面替换要迭代的正确页面。你知道吗我通过将类属性
self.urls
转换成一个正则变量来解决这个问题,我用meta函数将这个正则变量从一个请求传递到另一个请求。你知道吗今天的课程:
相关问题 更多 >
编程相关推荐