1、问题分析
在抓取某个网站页面的表单时,进入初始网页后,问题出在爬取初始页面以外的其他页面,其他页面的链接不是常规的URL网址,而是如下形式的链接:
不难看出,是由javascript函数__doPostBack动态生成的页面,在初始页面的html源码中,可以查看__doPostBack函数如下:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}}
2、解决方法
首先,查看初始页面源码中是否有以下两项内容:
id="__VIEWSTATE" value="/wEPDwULLTE...........">
如果有,则需要获取这两项内容的值,本文使用BeautifulSoup获取:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
VIEWSTATE = soup.find('input', id="__VIEWSTATE").attrs['value']
EVENTVALIDATION = soup.find('input', id="__EVENTVALIDATION").attrs['value']
然后,假设想爬取第3页的内容,则使用以下代码实现:
import requests
EVENTTARGET = “MyDataGrid$ctl24$ctl02”
EVENTARGUMENT = “”
s = requests.session()
# # headers可使用“浏览器->开发者工具->Network->headers”查看获取
headers = {
'Host': "www.xxxxxx.xx.xx",
'Accept':"",
'Accept-Language': "zh-CN,zh;q=0.9",
'Accept-Encoding': "gzip, deflate",
'Content-Type': "application/x-www-form-urlencoded",
'Connection': "keep-alive",
'Referer': "http://www.xxxxxx.xx.xx",
'User-Agent': '"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
}
data = {"__EVENTTARGET": EVENTTARGET,
"__EVENTARGUMENT": EVENTARGUMENT,
"__VIEWSTATE": VIEWSTATE ,
"__EVENTVALIDATION": EVENTVALIDATION }
# # 需要登录的话,可以在post中把cookies加上
rs = s.post(url, data=data, headers=headers, timeout=timeout, verify=False)
rs.encoding='utf-8'
html = rs.text
亲测成功,完毕。