2022 年最新 Python3 网络爬虫教程
大家好,我是崔庆才,由于爬虫技术不断迭代升级,一些旧的教程已经过时、案例已经过期,最前沿的爬虫技术比如异步、JavaScript 逆向、安卓逆向、智能解析、WebAssembly、大规模分布式、Kubernetes 等技术层出不穷,我最近新出了一套最新最全面的 Python3 网络爬虫系列教程。
博主自荐:截止 2022 年,可以将最前沿最全面的爬虫技术都涵盖的教程,如异步、JavaScript 逆向、安卓逆向、智能解析、WebAssembly、大规模分布式、Kubernetes 等,市面上目前就这一套了。
最新教程对旧的爬虫技术内容进行了全面更新,搭建了全新的案例平台进行全面讲解,保证案例稳定有效不过期。
教程请移步:
如下为原文。
综述
最近山大软件园校区 QLSC_STU 无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! 假若你不能连这个无线,那就照照思路啦~
决战前夕
首先我们看一下那个验证页面是咋样滴,上个图先 嘿,这界面还算可以把,需要我们输入的东西就是俩,一个就是学号,另一个是身份证号后六位,然后就可以登录,享受免费的无线网啦。 不过不知道谁设置了个登录时长,一段时间后就会掉线了,于是,自动模拟登陆系统就要应运而生啦。 来,我们先点击一下连接,看一下浏览器怎么工作的。 按下 F12,监听网络,我们点击第一个响应,也就是 login.jsp,看一下。 我们具体看一下 headers,里面 form 提交了什么东西,真的是茫茫多的数据啊。 嗯,一目了然 POST 的数据和提交的地址。 让我们来分析几个数据吧:
ClientIP:当前客户端的 IP 地址,在山大软件园校区这个地址是 211.87 开头的
timeoutvalue:连接等待时间,也就是俗话说的 timeout
StartTime:登录时间,也就是在你登录的那一刻的时间戳,这个时间戳是 13 位的,精确到了毫秒,不过一般是 10 位的,我们加 3 个 0 就好了
shkOvertime:登录持续时间,这个数据默认是 720,也就是 12 分钟之后,登录就失效了,自动掉线,我们可以手动更改
username:学号
password:密码,也就是我们身份证号后六位
我们需要在登录的时候把 form 表单中的所有信息都 POST 一下,然后就可以完成登录啦。 万事俱备,只欠东风,来来来,程序写起来!
一触即发
说走咱就走啊,天上的星星参北斗啊! 登陆地址:Request URL:http://192.168.8.10/portal/login.jsp?Flag=0 首先,我们需要验证一下 IP 地址,先写一个获取 IP 地址的函数,首先判断当前 IP 是不是 211.87 开头的,如果是的话,证明连接的 IP 是有效的。 首先我们写一个获取本机 IP 的方法:
1 |
"211.87" = |
这个方法利用了 gethostbyname 和 gethostbyname_ex 方法,获取了各个网卡的 IP 地址,遍历一下,找到那个 211.87 开头的 IP,返回 接下来,获取到 IP 之后,我们便可以构建 form,然后进行模拟登陆了。
1 |
#模拟登录 |
比较多的内容就在于 form 表单的数据内容以及请求头,后来利用 urllib2 的 urlopen 方法实现模拟登陆。 如果大家对此不熟悉,可以参见 Urllib 的基本使用 这样,登录后的结果就会保存在 result 变量中,我们只需要从 result 中提取出我们需要的数据就可以了。
乘胜追击
接下来,我们就分析一下数据啦,结果有这么几种:
1.登录成功 2.已经登录 3.用户不存在 4.密码错误 5.未知错误
好,利用 result 分析一下结果
1 |
#打印登录结果 |
通过字符串匹配和正则表达式,我们分辨并提取出了上述五种情况。 增加循环检测 既然是检测网络是否断开,那么我们只需要每隔一段时间检测一下就好了,那就 10 秒吧。 因为这个 10 秒是可配置的,为了方便配置,统一配置到init方法里面。
1 |
#检测间隔时间,单位为秒 |
然后,我们写一个循环来检测一下
1 |
while True: |
其中我们用到了 canConnect 方法,这个就是检测网络是否已经断开的方法,我们可以利用 ping 百度的方法来检测一下。 方法实现如下
1 |
#判断当前是否可以联网 |
好啦,所有的要点我们已经逐一击破,等着凯旋吧
收拾战场
好了,所有的代码要点已经被我们攻破了,接下来就整理一下,让他们组合起来,变成一个应用程序吧。
1 |
__author__ = 'CQC' |
来,我们来运行一下,看下效果吧! 执行
1 |
python login.py |
当前是可以联网的,我分别在网页上操作执行了断开,操作,程序自动检测到掉线,自动重新连接。 接下来我直接断开了 QLSC_STU 网络的链接,程序同样检测到 QLSC_STU 这个热点没有连接上,提示用户链接。 接下来我重新连接上了这个热点,由于刚才已经登录上线,且持续时间较短,网络自动恢复正常。 下面是运行结果: 嗯,这样我们就是实现了自动掉线的检测和模拟登录。
凯旋而归
咿呀伊尔哟,想约妹子上自习吗?那就赶紧来试试吧!一网在手,天下我有!追男神女神都不再是梦想! 如果有问题,欢迎留言讨论,代码肯定有不完善的地方,仅供参考。