这是一个本地人口信息的网站,因为比较敏感,所以我就把网站名改了,就是假网站名,没用真网站名.
抄的网友的代码,但就是登录不上,主要是找不到form data信息,这是第一坑,就能劝退大部分人.英语是form data ,汉字是表单数据.
上边保留日志要打对号,我以为浏览器的问题,换个浏览器,一会儿行,一会儿又不行,看了网友的提示才明白.
1打开登录页.
2按F12打开调试窗口.
3按网页的登录按钮.
4又去调试窗口,找到上图中的主页的那个网页,然后有的是在标头,有的是在负载,有表单数据,不同的浏览器就显示的位置不一样.
这是第一大坑,找不到表单窗口,大部分人被劝退.
如果这样还找不到,就用帐号密码登录,再找,一定能找到,总之要求登录的网站一定有表单数据.
二,如何解决验证码.
其实最简单的方法就是把验证码图片保存到本地,人自己看一眼验证码,手动输入,以前我总想玩机器识别,自动输入,看似很高级,其实复杂又难玩,不如自己看一眼验证码手动输入简单.
第三坑,把form data输入了,还是登录不上去,试了好多方法,最后发现,没有数据的form data也要输入,表单数据整了一堆参数,我只把有值的参数写上了,没有值的空参数我就不写了,结果就登录不上去.必须把没有值的空参数也写上去.
登录之后和登录之前的表单参数,位置顺序还不一样,我用的登录之后的表单参数位置顺序.
第四坑,登录之后给我来了一句pageRedirect||%2fDefault1.aspx|
这又是什么鬼,翻译一下英语才知道是登录成功之后网页跳转,于是我用session.get人工跳转到它指定的网页
第五坑,总算没啥错误了,又给我来个Response [200]
查来查去,原来是session.get之后你想看它获得的内容,要用session.get(XXXXX).text
第六坑,session.get()里边没加headers=headers参数,也给我报个什么错,这个还算好解决.
import requests #爬网页
from bs4 import BeautifulSoup #解析网页内容
# 爬网页
url = '网站登录地址'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response = requests.get(url=url,headers = headers)
content = response.text
print(content)
# bs4解析
soup = BeautifulSoup(content,'lxml')
viewState =soup.select('#__VIEWSTATE')[0].attrs.get('value')
print(viewState)
viewStateGenerator =soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
print(viewStateGenerator)
eVENTVALIDATION =soup.select('#__EVENTVALIDATION')[0].attrs.get('value')
print(eVENTVALIDATION)
# 验证码
imgShortCode =soup.select('#MyImg')[0].attrs.get('src') # 同理
# 拼接
imgCode = '主页地址' + imgShortCode
print(imgCode)
# session
session = requests.session()
responseCode = session.get(imgCode)
contentCode = responseCode.content
with open('CodeDownloadImg.jpg','wb') as fp:
fp.write(contentCode)
codeInput = input('打开CodeDownloadImg.jpg看验证码,然后输入:')
# 登录接口
urlPost = '网站登录地址'
dataPost = {
'ScriptManager1' : "UpdatePanel1|BtnOk",
'__EVENTTARGET' : '',
'__EVENTARGUMENT': '',
'hdkId': '',
'hdKVal': '',
'UserId': '',
'TxtUser': "你注册的登录名",
'TxtPass': "注册的密码",
'TxtValidity': codeInput,
'__VIEWSTATE': "/wEPDwUKMTcyMzM5MjA5NWRka/IEi1yp6Io1kHJcr0iIWwfRleuxsCWDQe+wkzhsi7U=",
'__VIEWSTATEGENERATOR': "CA0B0334",
'__EVENTVALIDATION': '/wEdAAi0RfoZ/5gOsqPG+0LQ0gj8WFAEkVvHsmOp+7cfEraaYgSyq8SFAD7uLH+MLLT9ZgDw5DOQjrEKsM9grc5TE0xFJpTN5EWcMzY0vw486EGsUiRUZ9UiTbgc03l5a/zMwdk4iIeEx9Ef2ezD4UG0M+B7OLzwrTSwNq50ccOn3Zx3HhSER2L//xnSM/yrz7p0dGwg23sYy7sBTsovr4ZDP2dX',
'__ASYNCPOST': 'true',
'BtnOk':'',
}
# 访问
responsePost = session.post(url=urlPost,data=dataPost,headers=headers)
contentPost = responsePost.text
print(contentPost)
print(session.get("跳转地址",headers=headers).text)
with open('ancient_poetry.html','w',encoding='utf-8') as fp:
fp.write(contentPost)