爬一个本地网站的数据,用了两天时间,历经千辛万苦,终于成功了,把我遇到的坑都写出来,方便后人.

这是一个本地人口信息的网站,因为比较敏感,所以我就把网站名改了,就是假网站名,没用真网站名.

抄的网友的代码,但就是登录不上,主要是找不到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)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值