gpt4 book ai didi

python - 使用请求 python 抓取网页上的 AJAX 内容

转载 作者:太空宇宙 更新时间:2023-11-03 21:32:21 24 4
gpt4 key购买 nike

我正在尝试抓取网页上的 AJAX 加载部分而不执行 JavaScript。通过使用 Chrome 开发工具,我发现 AJAX 容器通过 POST 请求从 URL 中提取内容,因此我想使用 python requests 包复制该请求。但奇怪的是,通过使用 Chrome 提供的 Headers 信息,我总是收到 400 错误,并且从 Chrome 复制的 curl 命令也会发生同样的情况。所以我想知道是否有人可以分享一些见解。

我感兴趣的网站是 here 。使用 Chrome:ctrl-shift-I、网络、XHR,我想要的部分是“内容”。我正在使用的脚本是:

headers = {"authority": "cafe.bithumb.com",
"path": "/boards/43/contents",
"method": "POST",
"origin":"https://cafe.bithumb.com",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36",
"accept-encoding":"gzip, deflate, br",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"accept":"application/json, text/javascript, */*; q=0.01",
"referer":"https://cafe.bithumb.com/view/boards/43",
"x-requested-with":"XMLHttpRequest",
"scheme": "https",
"content-length":"1107"}
s=requests.Session()
s.headers.update(headers)
r = s.post('https://cafe.bithumb.com/boards/43/contents')

最佳答案

你只需要比较两个post数据,你就会发现除了几个参数(draw=page...start=xx)之外,它们几乎是相同的。这意味着您可以通过修改 drawstart 来抓取 Ajax 数据。

编辑:数据已转换为字典,因此我们不需要urlencode,也不需要cookie(我测试过)。

import requests
import json

headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Origin": "https://cafe.bithumb.com",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36",
"DNT": "1",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Referer": "https://cafe.bithumb.com/view/boards/43",
"Accept-Encoding": "gzip, deflate, br"
}

string = """columns[0][data]=0&columns[0][name]=&columns[0][searchable]=true&columns[0][orderable]=false&columns[0][search][value]=&columns[0][search][regex]=false&columns[1][data]=1&columns[1][name]=&columns[1][searchable]=true&columns[1][orderable]=false&columns[1][search][value]=&columns[1][search][regex]=false&columns[2][data]=2&columns[2][name]=&columns[2][searchable]=true&columns[2][orderable]=false&columns[2][search][value]=&columns[2][search][regex]=false&columns[3][data]=3&columns[3][name]=&columns[3][searchable]=true&columns[3][orderable]=false&columns[3][search][value]=&columns[3][search][regex]=false&columns[4][data]=4&columns[4][name]=&columns[4][searchable]=true&columns[4][orderable]=false&columns[4][search][value]=&columns[4][search][regex]=false&start=30&length=30&search[value]=&search[regex]=false"""


article_root = "https://cafe.bithumb.com/view/board-contents/{}"

for page in range(1,4):
with requests.Session() as s:
s.headers.update(headers)

data = {"draw":page}
data.update( { ele[:ele.find("=")]:ele[ele.find("=")+1:] for ele in string.split("&") } )
data["start"] = 30 * (page - 1)

r = s.post('https://cafe.bithumb.com/boards/43/contents', data = data, verify = False) # set verify = False while you are using fiddler

json_data = json.loads(r.text).get("data") # transform string to dict then we can extract data easier
for each in json_data:
url = article_root.format(each[0])
print(url)

关于python - 使用请求 python 抓取网页上的 AJAX 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53454140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com