【问题标题】:My code returns one correct review and NULL instead of the other reviews我的代码返回一个正确的评论和 NULL 而不是其他评论
【发布时间】:2021-07-03 21:06:50
【问题描述】:

这是代码

import scrapy
   

class YelpscrapeSpider(scrapy.Spider):
    name = 'yelpscrape'
    start_urls = ['https://www.yelp.com/biz/beretta-san-francisco?osq=Restaurants']

    def parse(self, response):

        for review in response.css('ul.undefined.list__373c0__3GI_T'):
            item = {
                
                'review': review.css('p.comment__373c0__1M-px.css-n6i4z7 span').get()
            }
            
            yield item

这是它返回的内容

[
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": "Correct review"},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null},
{"review": null}
]

我只是不太明白要更改什么,所以它会正确返回。我到处玩,得到了 18 份相同的评论,这也不是我想要的。你们能帮我解决这个问题吗?

【问题讨论】:

  • 检索 review: 值对时,该值基于“p.comment__373c0__1M-px.css-n6i4z7 span”css 选择器。问题可能是由于不同的评论具有不同的 CSS 值,而不是您输入的值。唯一具有该值的评论是第 9 条,即有效的评论。

标签: python scrapy screen-scraping scrape


【解决方案1】:

如果您在浏览器中查看该页面,并在记录浏览器的网络流量时点击评论页面,您将看到每次点击查看其他页面时都会向 REST API 发出 XHR HTTP GET 请求评论。 API 的响应是 JSON,它一次包含十条评论的信息。您所要做的就是模仿该请求 - 要获得更多评论,您必须向同一个 API 端点发出多个请求,但使用不同的查询字符串参数("start" 键值对在params字典从"0"开始,然后上升到"10""20"等):

def get_reviews(restaurant_id):
    import requests

    url = "https://www.yelp.com/biz/{}/review_feed".format(restaurant_id)

    params = {
        "rl": "en",
        "q": "",
        "sort_by": "relevance_desc",
        "start": "0"
    }

    headers = {
        "accept": "application/json",
        "accept-encoding": "gzip, deflate",
        "user-agent": "Mozilla/5.0",
        "x-requested-by-react": "true",
        "x-requested-with": "XMLHttpRequest"
    }

    response = requests.get(url, params=params, headers=headers)
    response.raise_for_status()

    yield from (review["comment"]["text"] for review in response.json()["reviews"])
    

def main():

    for review in get_reviews("4KfQnlcSu4bbTqnvGdGptw"):
        print(review, "\n")
    
    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

【讨论】:

  • 所以我无法通过常规循环获得所有评论,需要检查 API 并使用它给我的东西,对吧?
  • 是的,我会使用循环。 API 的响应甚至包含评论总数,因此您可以使用它来计算您需要多少次迭代。
猜你喜欢
  • 2018-11-06
  • 2021-03-17
  • 2014-12-11
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多