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

标签 python html ajax python-requests

我正在尝试抓取网页上的 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/

相关文章:

python - 如何使功能可切换?

python - 用python进行简单的数值计算

javascript - 使用 JavaScript 更改网页中的文本

javascript - JQuery 'thinks' 我想要 AJAX 另一个域

python - 在 webpy 中使用另一个类

python - 将 IPython 变量作为参数传递给 bash 命令

python - 使用编解码器返回 HTML 时 View 中出现 Django FileNotFoundError

javascript - 在移动设备中进行#选择后,我需要关闭下拉菜单

javascript - 使用 Jquery 的 AJAX 无法跨 JSP 页面工作

JavaScript 对象访问;输出正常,选择不起作用