网络爬虫:requests.post抓取__doPostBack生成的网页

1、问题分析

在抓取某个网站页面的表单时,进入初始网页后,问题出在爬取初始页面以外的其他页面,其他页面的链接不是常规的URL网址,而是如下形式的链接:

1 

2 

3 

4 

5 

6 

7 

8 

9 

10 

...

不难看出,是由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

亲测成功,完毕。

你可能感兴趣的:(网络爬虫:requests.post抓取__doPostBack生成的网页)