Python AJAX WebScrap时未接收所有文本/json数据

Python AJAX WebScrap时未接收所有文本/json数据,python,json,ajax,web-scraping,Python,Json,Ajax,Web Scraping,第一次发帖时,我不是python或web开发专家 我正在创建一个网页刮板来刮一个动态网页。我已经浏览了一些教程,并编写了一个简单的web scape入门。它可以工作,因为它正在检索一些json。然而,当在Chrome开发工具中检查响应时,我发现返回的json只是值为“null”的第一级如何获取其余的值? import requests headers = { "Accept": "application/json, text/plain, */*", "Accept-Encoding": "

第一次发帖时,我不是python或web开发专家

我正在创建一个网页刮板来刮一个动态网页。我已经浏览了一些教程,并编写了一个简单的web scape入门。它可以工作,因为它正在检索一些json。然而,当在Chrome开发工具中检查响应时,我发现返回的json只是值为“null”的第一级如何获取其余的值?

import requests

headers = {

"Accept": "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en-US,en;q=0.9",
"Cache-Control": "max-age=0, private, must-revalidate",
"origin": "https://www.example.com",
"referer": "https://www.example.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
}

#AJAX Request url from the Chrome dev tools
# data parameter taken from the Chrome dev tools, "Network Tab" >"Headers Tab" > "Request Payload"
r = requests.post('https://www.example.com/api/show', headers = headers,data = {"sort":"trending","page_num":4,"per_page":12,"q":"","tags":[]})


response = r.json()

print(response)
输出:

{'response':None}
预期产出应为:

{ "response":{ "discoverables":[ { "bullet_point":null,"category": "category_1","category_url":"/url"...
我在Chrome开发工具的“网络”>“响应”下看到了上面完整的json预期结果

我试过:

  • 更改标题值或忽略它们,结果没有差异
  • 试图利用GET(返回状态代码404)
  • 使用request.sessions
  • 我试着只打印'r'而不使用.json,它返回
    {“response”:null}
不知道为什么json的其余部分没有被捕获

我看了一下这里: 但是,没有“表单数据”,如他们的示例所示。它显示的是“请求有效负载”,没有指定的参数

我假设我缺少一个参数来请求其余的json数据。或者与POST请求有关。如果需要更多信息,请告诉我。

这对我很有用

import requests
import json
from bs4 import BeautifulSoup as bs


url=r'https://www.indiegogo.com/explore/energy-green-tech?project_type=campaign&project_timing=all&sort=trending'

s=requests.Session()
r=s.get(url)


soup=bs(r.text,'html.parser')

token=soup.find('meta',{'name':'csrf-token'}).attrs['content']
print(token)

dataload={
'category_main': "Energy & Green Tech",
'category_top_level': "Tech & Innovation",
'page_num': 2,
'per_page': 12,
'project_timing': "all",
'project_type': "campaign",
'q': "",
'sort': "trending",
'tags': []

}


headers={
    'accept': 'application/json, text/plain, */*',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.9',
    "Cache-Control": "max-age=0, private, must-revalidate",
    'content-length': str(len(json.dumps(dataload, separators=(',',':')))),
    'content-type': 'application/json;charset=UTF-8',
    'origin': r'https://www.indiegogo.com',
    'referer': r'https://www.indiegogo.com/explore/energy-green-tech?project_type=campaign&project_timing=all&sort=trending',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
    'x-csrf-token':token,
    'x-locale': 'en'

}

r=s.post(r'https://www.indiegogo.com/private_api/discover',headers=headers,json=dataload)
print(r.json())

可能有很多事情。。。你能把你要刮的那页贴上去吗?我正在努力搜集竞选信息。我马上看到两件事,你需要在标题中包含x-csrf-token,并将“data”改为“json”。要获取有效的x-csrf-token,您可能需要使用请求会话。我之前尝试过x-csrf-token头/值,但没有成功。我将尝试使用会话并切换到json。谢谢!将“data”更改为“json”&包括x-csrf-token。不需要更改为会话。看起来需要更多地阅读请求库。