python - 使用请求模块进行网页抓取
问题描述
我想从网站中提取评论,使用此代码我成功提取评论。
import requests
from urllib.parse import unquote
url = 'https://apicomment.detik.com/graphql'
payload = {"query":"query search($type: String!, $size: Int!,$anchor: Int!, $sort: String!, $adsLabelKanal: String, $adsEnv: String, $query: [ElasticSearchAggregation]) {\nsearch(type: $type, size: $size,page: $anchor, sort: $sort,adsLabelKanal: $adsLabelKanal, adsEnv: $adsEnv, query: $query){\npaging sorting counter counterparent profile hits {\nposisi hasAds results {\n id author content like prokontra status news create_date pilihanredaksi refer liker { id } reporter { id status_report } child { id child parent author content like prokontra status create_date pilihanredaksi refer liker { id } reporter { id status_report } authorRefer } } } }}","variables":{"type":"comment","sort":"newest","size":10,"anchor":1,"query":[{"name":"news.artikel","terms":5307853},{"name":"news.site","terms":"dtk"}],"adsLabelKanal":"detik_finance","adsEnv":"desktop"}}
while True:
r = requests.post(url,json=payload)
container = r.json()['data']['search']['hits']['results']
if not container:
break
else:
for item in container:
if not len(item['author']):continue
print(item['author']['name'],unquote(item['content']))
payload['variables']['anchor']+=1
但是,实际上我不太了解这段代码,尤其是这一行。
url = 'https://apicomment.detik.com/graphql'
payload = {"query":"query search($type: String!, $size: Int!,$anchor: Int!, $sort: String!, $adsLabelKanal: String, $adsEnv: String, $query: [ElasticSearchAggregation]) {\nsearch(type: $type, size: $size,page: $anchor, sort: $sort,adsLabelKanal: $adsLabelKanal, adsEnv: $adsEnv, query: $query){\npaging sorting counter counterparent profile hits {\nposisi hasAds results {\n id author content like prokontra status news create_date pilihanredaksi refer liker { id } reporter { id status_report } child { id child parent author content like prokontra status create_date pilihanredaksi refer liker { id } reporter { id status_report } authorRefer } } } }}","variables":{"type":"comment","sort":"newest","size":10,"anchor":1,"query":[{"name":"news.artikel","terms":5307853},{"name":"news.site","terms":"dtk"}],"adsLabelKanal":"detik_finance","adsEnv":"desktop"}}
网址不同。但是,输出正是我真正想要的。有人可以向我解释一下并给我一些参考吗?
解决方案
URL 不同,因为它不是您从中提取评论的网站本身,而是评论 API。该 api 提供了一种简单的方法来搜索评论,而无需对网站进行反向工程。
paylod 是你告诉 api 你在寻找什么的方式。可能有一些文档说明您的有效负载必须如何针对这个确切的 api 进行格式化。
推荐阅读
- java - 无法解析封装在 TSV 文件中的 JSON 文档
- sql - 如何让 ActiveRecord 将中间表中的附加值映射到包含的模型中?
- php - 如何在 laravel 中使用这个包 FriendsOfPHP/PHP-CS-Fixer 格式化 .json 文件?
- reactjs - Material-UI 自动完成总是显示指定的项目
- confluence - Confluence 自动化的电子邮件附件
- google-apps-script - Session.getActiveUser().getEmail() 在创建侧边栏和从模板化 html 调用 appscript 方法时给出两个值
- html - 为什么换行符 \n 在 Angular 中不起作用?
- reactjs - 在项目中找不到 React native-env 文件
- c# - 我们可以在 asp.net 核心网络应用程序中使用 Gmail Api 服务帐户来重置密码服务吗?
- javascript - webpack 5:为什么 webpack 复制通过背景添加的图像:url (./ ....); 到根目录,而其他复制到资产文件夹?