【问题标题】:requests - fetch data from api-based websiterequests - 从基于 api 的网站获取数据
【发布时间】:2017-02-03 19:23:35
【问题描述】:

我想得到this site的所有评论。

一开始,我使用这个代码:

import requests
from bs4 import BeautifulSoup

r = requests.get(
    "https://www.traveloka.com/hotel/singapore/mandarin-orchard-singapore-10602")

data = r.content
soup = BeautifulSoup(data, "html.parser")
reviews = soup.find_all("div", {"class": "reviewText"})

for i in range(len(reviews)):
    print(reviews[i].get_text())

但是这样,我只能从第一页获得评论。

有人说我可以使用相同的requests 模块为此使用api。我找到了https://api.traveloka.com/v1/hotel/hotelReviewAggregate的api,但我无法读取参数,因为我不知道如何使用使用request payload方式的api。

所以我希望代码可以使用python或api的参数来获取所有评论,以获取所有或特定页面中特定酒店的评论。

【问题讨论】:

  • 您是否查看了浏览器开发人员工具的网络选项卡以了解网站如何调用 API?然后用请求复制它。

标签: python python-2.7 api python-requests


【解决方案1】:

在网络选项卡中查看请求负载。有一部分是skip:8 和top:8,当您单击右箭头以获取下一页评论时,您会看到这些数字增加了 8。

您可以复制该请求并以相同的方式抓取结果

编辑:

用 chrome 打开你的页面并点击f12。转到Network 标签,在页面底部向下滚动,您可以在其中前进到下一批评论。只要您点击右箭头,就会填充网络选项卡。找到第二个hotelReviewAggregate 并单击它。在标题选项卡下,您将找到Request Payload。打开data 字典并找到skip 和top。推进下一批评论,看看这些数字是如何变化的。您可以模拟此行为以访问其他页面。

然后您需要做的是准备您的有效负载,您可以在其中增加值并发出GET 请求并使用response objects 通过 BeautifulSoup 抓取数据。

请求here

教程中的快速示例:

payload = {'key1': 'value1', 'key2': 'value2'} r = requests.get('http://httpbin.org/get', params=payload)

我不知道为什么人们决定在没有解释的情况下对我的答案给出负面评价。但是哦,好吧,如果您觉得这很有用并回答了您的问题,请接受它。

【讨论】:

  • 介意展示示例吗?我对请求了解不多
  • @EternityNeet,我添加了edit 部分。希望它能回答你的问题
  • 对不起,我还是不明白,我应该在payload里放什么?我尝试将payload = {"data": ... "desktop"}(从dev tools 复制)和r = requests.get('https://api.traveloka.com/v1/hotel/hotelReview‌​Aggregate', params=payload) 放在下一行,但仍然出现错误
  • 你能举个例子来得到一个像this这样的json吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2013-01-28
相关资源
最近更新 更多