首页 > 解决方案 > 无法使用 Python 请求复制 AJAX

问题描述

我正在尝试从网页(https://droughtmonitor.unl.edu/Data/DataTables.aspx)复制 ajax 请求。当我们从下拉列表中选择值时启动 AJAX。

我正在使用 python 使用以下请求,但无法在浏览器的网络选项卡中看到响应。

import bs4
import requests
import lxml

ses = requests.Session()
ses.get('https://droughtmonitor.unl.edu/Data/DataTables.aspx')
headers_dict = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
url = 'https://droughtmonitor.unl.edu/Ajax2018.aspx/ReturnTabularDMAreaPercent_urban'
req_data = {'area':'00064', 'statstype':'1'}
resp = ses.post(url,data = req_data,headers = headers_dict)
    
soup = bs4.BeautifulSoup(resp.content,'lxml')
print(soup)

标签: pythonpython-3.xajaxweb-scrapingpython-requests

解决方案


您需要在请求中添加几项内容才能从服务器获得答复。

  1. 您需要将 to 转换dictjson字符串而不是dict.
  2. 您还需要request-data通过将请求标头设置为来指定类型Content-Type:application/json; charset=utf-8

通过这些更改,我能够请求正确的数据。

import bs4
import requests

ses = requests.Session()
ses.get('https://droughtmonitor.unl.edu/Data/DataTables.aspx')
headers_dict = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
                'Content-Type': 'application/json; charset=utf-8'}
url = 'https://droughtmonitor.unl.edu/Ajax2018.aspx/ReturnTabularDMAreaPercent_urban'
req_data = json.dumps({'area':'00037', 'statstype':'1'})
resp = ses.post(url,data = req_data,headers = headers_dict)
    
soup = bs4.BeautifulSoup(resp.content,'lxml')
print(soup)

我必须说一个相当棘手的问题。


推荐阅读