【问题标题】:Scrapy/requests simulate XHRScrapy/requests 模拟 XHR
【发布时间】:2017-03-28 18:15:07
【问题描述】:

我正在尝试从 https://www.tripadvisor.com/Hotel_Review-g60763-d2173604-Reviews-Dream_Downtown-New_York_City_New_York.html 获取评论,当您单击更多评论时我需要的 AJAX 请求似乎是 https://www.tripadvisor.com/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS&metaReferer=Hotel_Review。如何获取 xhr 发布请求,以便正确解析所有数据?这是我的代码:

# -*- coding: utf-8 -*-
import scrapy

def parse(self, response):
    url = 'https://www.tripadvisor.com/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS&metaReferer=Hotel_Review'
    headers = {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
                'Accept-Encoding':'gzip, deflate, br',
                'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
                'X-Requested-With':'XMLHttpRequest'}
    req = scrapy.Request(url,method='POST',body='{"filters": []}',headers=headers,callback=self.parse_me)
    yield req
def parse_me(self,response):
    print(response.body) 

我还注意到这仅包含具有“更多”选项的列表,因此要获得所有评论,我最好的选择是执行以下操作:

if 'more' is present:
     do xhr request
else:
   pass

如果可能的话,我也想要 requests 的解决方案,因为我是 scrapy 的新手,但仍然没有找到我非常熟悉的 requests 模块的相应答案。我总是求助于使用我想摆脱的硒。谢谢。

【问题讨论】:

  • 您的具体问题是什么?
  • @PeterHenell 我试图弄清楚如何引入 xhr 发布请求,以便我可以从那里获取评论数据,而不是使用 selenium 单击更多然后从页面源中读取。我不完全确定如何做到这一点,当前的标题给了我 404

标签: python-3.x scrapy python-requests scrapy-spider


【解决方案1】:

所以我是从this URL开始的吧?

据我所知,每条评论都有一个可点击的标题;它有一个网址,可以引导您进行全面审查。例如,点击“现代、干净、优秀的员工!”我得到了网址:

https://www.tripadvisor.com/ShowUserReviews-g60763-d224214-r470551868-The_Bryant_Park_Hotel-New_York_City_New_York.html#CHECK_RATES_CONT

因此,您也可以简单地循环包装以获取每个评论标题的 URL。

这是一种方式。


另一种方法是,当我点击“更多”并在 Network > XHR 中检查时,我会得到这个 URL:

https://www.tripadvisor.com/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS&metaReferer=Hotel_Review&reviews=470551868,470078957,469616995,469417970

请注意,这有不止一个评论 - 请注意最后的数字。我们可以拥有一个或多个。例如,仅保留一个数字即可获得与上述相同的评论:

https://www.tripadvisor.com/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS&metaReferer=Hotel_Review&reviews=470551868

好的,现在的问题是我们从哪里可以得到最后一个数字?您可以在属性data-reviewid中找到它,您甚至可以通过第一种方式在上面的URL中找到它。

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多