for i in range(2,4):
data['__EVENTARGUMENT'] = 'Page$'+str(i)
data1= json.dumps(data)
response = requests.post(url = url,data=data1 ,headers =headers )
pass
这里的data1,原网页传的就是form表单,不是json序列化数据,直接传入字典data就行
另外data同样有问题,除了第一页可以直接通过get或者post访问,其他页都会验证VIEWSTATE和EVENTVALIDATION字段,如果你直接从第二页开始,服务器会返回一个状态码500的页面,因为你这两个字段是错误的。必须先访问第一页,拿到这两个字段才行。你这段代码因为没有传入标准数据格式,所以服务器返回的都是第一页
总结两点
- requests直接传入字典
- 从第一页开始获取数据或者首先获取第一页的两个字段
额外加餐
基于生成器的实现
def get_next_parse():
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
yield soup
page = 2
while True:
data['__EVENTARGUMENT'] = 'Page$%i' % page
data['__VIEWSTATE'] = soup.find(id='__VIEWSTATE')['value']
data['__EVENTVALIDATION'] = soup.find(id='__EVENTVALIDATION')['value']
r = requests.post(url, data, headers=headers)
if r.status_code != 200: # 停止迭代条件
break
soup = BeautifulSoup(r.text, 'html.parser')
yield soup
page += 1
g = get_next_parse()
# 前四页
for i in range(4):
soup = next(g)
# Do something
# 所有数据
for soup in get_next_parse():
pass
# Do something
|