刮擦混合项目字段

2024-04-25 12:54:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从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

我被这个问题困住了,它一定和请求对象的生存期有关,但是我不知道我做错了什么。你知道吗

谢谢你的帮助。你知道吗


Tags: selfurlparseresponsedefpage评论item
1条回答
网友
1楼 · 发布于 2024-04-25 12:54:38

我找到了答案

我发现请求,即使我使用MAX_CONCURRENT_REQUESTS = 1也是异步发送的,并且不是按调用顺序发送的!你知道吗

这导致self.urls在两个分页请求之间被重新定义,用另一个餐厅的页面替换要迭代的正确页面。你知道吗

我通过将类属性self.urls转换成一个正则变量来解决这个问题,我用meta函数将这个正则变量从一个请求传递到另一个请求。你知道吗

今天的课程:

  • 请记住,即使在简单的情况下,scrapy请求也往往是非常异步的
  • 处理类属性时要小心

相关问题 更多 >