一般来说都会用到Requests来进行模拟登录,需要登录之后才能进行页面爬取的情况,属于深层次的网页爬取,模拟登录由于涉及到用户名和密码等隐私数据,一般网站的设计人员会使用Post方式向网站的后台进行数据提交,密码也不是明码传输,而是加密后传输。需要使用浏览器的开发者工具,拦截网络请求,从而分析出登录提交的URL地址。分析出登录的URL地址后只是迈出了关键的一步,实际上现在的网站为了应对爬虫爬取,避免别有用心的人恶意登录和注册,大多数都会采用验证码技术。现在普遍使用验证码的技术除了图片验证码外,还有短信验证码、滑动拼图、图标点选等多种方式。有些验证码可以通过机器学习等技术手段解决,有些只能依靠打码平台人工识别。 网络传输协议HTTP是一种无状态的协议。使用用户登录来举例,用户登录向Web服务端请求,验证通过后跳转到主页,然后连接会断开,不会一直持续连接。再次发送请求,HTTP协议无法知晓用户已经登录过,无记忆功能。为了解决状态保持的问题,在Web开发中常用Cookies和Session来实现状态保持机制。
下面来简单介绍一下什么是cookie以及他的机制
存储cookie是浏览器提供的功能。cookie其实是存储在浏览器中的纯文本,浏览器的安装目录下会专门有一个cookie文件夹来存放各个域下设置的cookie。 当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request 请求中header的cookie字段中。这些是浏览器自动帮我们做的,而且每一次http请求浏览器都会自动帮我们做。存储在cookie中的数据,每次都会被浏览器自动放在http请求中,如果这些数据并不是每个请求都需要发给服务端的数据,浏览器这样设置自动处理无疑增加了网络开销;但如果这些数据是每个请求都需要发给服务端的数据(比如身份认证信息),浏览器这样设置自动处理就大大免去了重复添加操作。所以对于那些设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其他类型的数据就不适合了。
此外还有Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 当程序需要为某个客户端的请求创建一个Session时,服务器首先检查这个客户端的请求(cookie)里是否已包含了一个Session标识(称为Session Id)。如果已包含则说明以前已经为此客户端创建过Session,服务器就按照Session Id把这个session检索出来使用(检索不到,会新建一个);如果客户端请求不包含Session Id,则为此客户端创建一个Session并且生成一个与此Session相关联的Session id,Session Id的值应该是一个既不会重复,又不容易被找到规律的方式以仿造的字符串,这个Session Id将被在本次响应中返回给客户端保存。
以下是对网页进行登录的深层爬取代码
1.对豆瓣进行爬取
import requests
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.5061 SLBChan/105 SLBVPV/64-bit",
"Cookie":'ll="108288"; bid=UhFg4xbgmwA; __utma=30149280.2007896199.1752813231.1752813231.1752813231.1; __utmc=30149280; __utmz=30149280.1752813231.1.1.utmcsr=cn.bing.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmt=1; last_login_way=phone; ap_v=0,6.0; push_noty_num=0; push_doumail_num=0; __utmv=30149280.28997; user_data={%22area_code%22:%22+86%22%2C%22number%22:%2218747193778%22%2C%22code%22:%223008%22}; vtoken=undefined; __utmb=30149280.10.10.1752813231; login_start_time=1752813440782'
}
def login():
try:
url="https://accounts.douban.com/j/mobile/login/basic"
parm={
"name":"187",
"password":"23123",
"remember":True
}
s = requests.session()
r = s.post(url,data=parm,headers=headers)
r.raise_for_status()
return s
except Exception as err:
print(err)
def get_html(s,url):
try:
r=s.get(url,headers=headers)
r.encoding=r.apparent_encoding
r.raise_for_status()
print("ID" in r.text)
except Exception as err:
print(err)
if __name__=="__main__":
session=login()
print("登陆成功!")
url="https://www.douban.com/people/289971477"
get_html(session,url)
print("获取个人主页成功!")
大家可以对个人信息以及账号密码自行更改,换成自己的,这个代码可以对简单的网站进行深层爬取从而进行登录操作,但对于一些反爬比较强的网站是用不了的。
2.对包头师范学院教务处爬取
import requests
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.5061 SLBChan/105 SLBVPV/64-bit",
"Cookie":'route=bac86a4f0796578ef86a8c36f6d8fe1d; _webvpn_key=; webvpn_username=; JSESSIONID=mQkcVqVMcKlRuM8EzBIa1KxCG375NQ1wq8HEOWkIaJe0i17_DFDm!444696921'
}
def login():
try:
url="https://authserver-443.webvpn.bttc.edu.cn/authserver/login"
parm={
"username":"22",
"password":"w123123",
"remember":True
}
s = requests.session()
r = s.post(url,data=parm,headers=headers)
r.raise_for_status()
return s
except Exception as err:
print(err)
def get_html(s,url):
try:
r=s.get(url,headers=headers)
r.encoding=r.apparent_encoding
r.raise_for_status()
print("包头师范学院" in r.text)
except Exception as err:
print(err)
if __name__=="__main__":
session=login()
print("登陆成功!")
url="https://webvpn.bttc.edu.cn/"
get_html(session,url)
print("获取个人主页成功!")
跟第一个豆瓣爬取同理,大家自行参考!
6万+

被折叠的 条评论
为什么被折叠?



