Python网络爬虫模拟登录与验证解析

内容导读

使用Selenium模拟登录

使用Cookies登录网站

模拟表单登录网站

爬虫识别简单的验证码

实例解析

一、使用Selenium模拟登录

1、为什么要模拟登录

在互联网上存在大量需要登录才能访问的网站,要爬取这些网站,就需要学习爬虫的模拟登录。对于一个需要登录才能访问的网站,它的页面在登录前和登录后可能是不一样的。

如果直接使用requests去获取源代码,只能得到登录以前的页面源代码。接下来我们使用pyhton实现网络的模拟登录与注册,最终达到爬取网站内容的目的。

示例分析如下:

但是如果没有登录,访问知乎首页会自动跳转到登录页面,看到的是如图所示页面。

如果使用requests直接获取知乎首页,可以看到源代码明显是未登录状态的,如上图所示。

模拟登录有多种实现方法,使用Selenium操作浏览器登录和使用Cookies登录虽然简单粗暴,但是有效。使用模拟提交表单登录虽然较为麻烦,但可以实现自动化。

2、使用Selenium模拟登录

使用Selenium来进行模拟登录,整个过程非常简单。流程如下。

(1)初始化ChromeDriver。

(2)打开知乎登录页面。

(3)找到用户名的输入框,输入用户名。

(4)找到密码输入框,输入用户名。

(5)手动单击验证码。

(6)按下Enter键。

以上过程,若使用Selenium,一般情况下只需要不到20行代码就可以完成!

根据本站分享的Selenium的用法,这里的代码看起来就很轻松了。

程序首先打开知乎的登录页面,然后使用“find_element_by_ name”分别找到输入账号和密码的两个输入框。

这两个输入框的name属性值分别为“account”和“password”,如图所示。

在Selenium中可以使用send_keys()方法往输入框中输入字符串。

在输入了密码以后,验证码框就会弹出来。知乎使用的验证码为点击倒立的文字,这种验证码不容易自动化处理,因此在这个地方让爬虫先暂停,手动点击倒立文字。

爬虫中的input()语句会阻塞程序,直到在控制台按下Enter键,爬虫才会继续运行,如图所示。

接下来,爬虫模拟按下Enter键的动作,触发知乎的登录行为,实现登录。登录成功以后,界面如图所示。

二、使用Cookies登录

Cookie是用户使用浏览器访问网站的时候网站存放在浏览器中的一小段数据。Cookie的复数形式Cookies用来表示各种各样的Cookie。

它们有些用来记录用户的状态信息;有些用来记录用户的操作行为;还有一些,具有现代网络最重要的功能:记录授权信息,即用户是否登录以及用户登录哪个账号。

为了不让用户每次访问网站都进行登录操作,浏览器会在用户第一次登录成功以后放一段加密的信息在Cookies中。下次用户访问,网站先检查Cookies有没有这个加密信息,如果有并且合法,那么就跳过登录操作,直接进入登录后的页面。

通过已经登录的Cookies,可以让爬虫绕过登录过程,直接进入登录以后的页面。

在已经登录知乎的情况下,打开Chrome的开发者工具,定位到“Network”选项卡,然后刷新网页,在加载的内容中随便选择一项,然后看右侧的数据,从Request Headers中可以找到Cookie,如图所示。

请注意:这里一定是“Request Headers”,不要选成了“Response Headers”。

只要把这个Request Headers的内容通过requests提交,就能直接进入登录以后的知乎页面了,如图所示。

由于登录以后的知乎页面的HTML代码全部缩在了一行,所以在PyCharm里面看起来不太方便。不过从输出的部分文字可以证明,确实已经是登录以后的页面。

可以看到,使用Cookie来登录网页,不仅可以绕过登录步骤,还可以绕过网站的验证码。

在如上图所示的代码中,使用了requests的Session模块。

所谓Session,是指一段会话。网站会把每一个会话的ID(Session ID)保存在浏览器的Cookies中用来标识用户的身份。requests的Session模块可以自动保存网站返回的一些信息。

其实在前面章节中使用的requests.get(),在底层还是会先创建一个Session,然后用Session去访问。

对于HTTPS的网站,在requests发送请求的时候需要带上verify=False这个参数,否则爬虫会报错。

带上这个参数以后,爬虫依然会报一个警告,这是因为没有HTTPS的证书。

不过这个警告不会影响爬虫的运行结果。对于有强迫症的读者,可以参考相关内容为requests设置证书,从而解除这个警告。

三、模拟表单登录

在本站其它已介绍通过POST提交请求解决了AJAX版登录页面的爬取。但是在现实中,有更多的网站是使用表单提交的方式来进行登录的。

这里将要讲解如何解决表单登录的问题,首先打开练习页会自动打开登录页面,如图所示。

这个登录页面与之前介绍的AJAX登录的页面非常相似。但是这里多了一个“自动登录”复选框。

输入用户名kingname,密码genius,勾选“自动登录”复选框并单击“登录”按钮,可以看到登录成功后的页面,如图所示。

根据前面的经验,遇到这种问题应首先打开Chrome的开发者工具并监控登录过程。

然而,仔细观察会发现登录请求的那个网址只会在“Network”选项卡中存在1s,然后就消失了。

"Network"选项卡下面只剩下登录成功后的页面所发起的各种网络请求,如图所示。

这是因为表单登录成功以后会进行页面跳转,相当于开了一个新的网页,于是新的请求就会直接把旧的请求覆盖。

为了避免这种情况,需要在Chrome的开发者工具的“Network”选项卡中勾选“Preserve log”复选框,再一次登录就可以看到登录过程,如图所示。

此时可以看到Status Code是302,说明这里有一个网页跳转,也就证明了之前为什么登录以后看不到登使用requests的Session模块来模拟这个登录,其运行结果如图所示。

四、爬虫识别简单的验证码

4.1 肉眼打码

对于一次登录就可以长时间使用的情况,只需要识别一次验证码即可。

这种情况下,与其花时间开发一个自动识别验证码的程序,不如直接肉眼识别。肉眼识别验证码有两种情况,借助浏览器与不借助浏览器。

1、借助浏览器

在模拟登录中讲到过Cookies,通过Cookies能实现绕过登录,从而直接访问需要登录的网站。因此,对于需要输入验证码才能进行登录的网站,可以手动在浏览器登录网站,并通过Chrome获取Cookies,然后使用Cookies来访问网站。这样就可以实现人工输入一次验证码,然后很长时间不再登录。

2、不借助浏览器

对于仅仅需要识别图片的验证码,可以使用这种方式——先把验证码下载到本地,然后肉眼去识别并手动输入给爬虫。

手动输入验证码的一般流程如下。

(1)爬虫访问登录页面。

(2)分析网页源代码,获取验证码地址。

(3)下载验证码到本地。

(4)打开验证码,人眼读取内容。

(5)构造POST的数据,填入验证码。

(6)POST提交。

需要注意的是,其中的(2)、(3)、(4)、(5)、(6)步是一气呵成的,是在爬虫运行的时候做的。绝对不能先把爬虫程序关闭,肉眼识别验证码以后再重新运行。

打开验证码练习页面http://exercise.kingname.info/exercise_captcha.html(如果没有,可以创建一个网页),可以看到在这个页面需要输入验证码,如图所示。

打开源代码页面,可以看到验证码的地址,如图所示。

源代码给出的是一个相对路径,所以图片的实际网址为网站域名+相对路径,即http://exercise.kingname.info/static/captcha/1500558784. 9632132.png。

文件名一看就是使用Python的time.time()生成的时间戳。在知道了图片的网址以后,就可以使用requests将验证码下载下来,再肉眼识别。一旦验证码被识别了出来,那么剩下的工作就和一般的POST提交没有什么两样了。

识别验证码的完整代码如下图所示。

4.2 自动打码

1、Python图像识别

Python的强大,在于它有非常多的第三方库。

对于验证码识别,Python也有现成的库来使用。

开源的OCR库pytesseract配合图像识别引擎tesseract,可以用来将图片中的文字转换为文本。

这种方式在爬虫中的应用并不多见。因为现在大部分的验证码都加上了干扰的纹理,已经很少能用单机版的图片识别方式来识别了。

所以如果使用这种方式,只有两种情况:网站的验证码极其简单工整,使用大量的验证码来训tesseract。

(1)安装tesseract

Windows系统中:下载安装包 https://github.com/ tesseract-ocr/tesseract/wiki/Downloads,

在“3rd party Windows exe's/ installer”下面可以找到.exe安装包。

Mac系统中:可以通过Homebrew安装:brew install tesseract

Ubuntu系统中:可以直接通过apt-get安装:sudo apt-get install tesseract-orc

(2)安装Python库

要使用tesseract来进行图像识别,需要安装两个第三方库:

pip install Pillow

pip install pytesseract

其中,Pillow是Python中专门用来处理图像的第三方库,pytesseract是专门用来操作tesseract的第三方库。

(3)tesseract的使用

tesseract的使用非常简单。

① 导入pytesseract和Pillow。

② 打开图片。

③ 识别。

通过以下代码来实现最简单的图片识别:

import pytesseract

from PIL import Image

image = Image.open('验证码.png')

code = pytesseract.image_to_string(image)

print(code)

运行结果如图所示。

如果使用Mac OS,并且使用Homebrew安装tesseract,那么有可能程序会报以下错误:

FileNotFoundError: [Errno2] No such file or directory: ‘tesseract’

这是因为Homebrew没有把tesseract加入到系统的环境变量的缘故。

要解决这个问题,需要修改Python安装文件夹下面的lib/site-packages/pytesseract文件夹中的pytesseract.py文件,将第21行的代码:

tesseract_cmd = 'tesseract'

修改为:

tesseract_cmd = '/usr/local/bin/tesseract'

修改代码如下图所示。

要找到这个文件,最简单的办法是在PyCharm中先使用import导入pytesseract。

在Windows和Linux系统中按下Ctrl键并单击“pytesseract”即可。

使用Mac OS系统的读者按下Command键并单击“pytesseract”即可。

这样,PyCharm就会自动打开这个文件。

2、打码网站

(1)打码网站介绍

在线验证码识别的网站,简称打码网站。这些网站有一些是使用深度学习技术识别验证码,有一些是雇佣了很多人来人肉识别验证码。

网站提供了接口来实现验证码识别服务。使用打码网站理论上可以识别任何使用输入方式来验证的验证码。

这种打码网站的流程一般是这样的。

① 将验证码上传到网站服务器。

② 网站服务器将验证码分发给打码工人。

③ 打码工人肉眼识别验证码并上传结果。

④ 网站将结果返回。

(2)使用在线打码

在百度或者谷歌上面搜索“验证码在线识别”,就可以找到很多提供在线打码的网站。但是由于一般这种打码网站是需要交费才能使用的,所以要注意财产安全。

这里使用一个名称为“云打码”的网站来进行测试。如果此时不能打开此网站,可以从网络搜索其他打码网站。

注册账号以后,需要交费购买才能正常使用。

这个网站虽然提供了各种语言的SDK,但是版本都比较旧了,所以建议使用HTTP接口。

虽然HTTP 接口文档给出了上传的地址,但是不要去看它提供的“PythonHTTP调用示例”,因为这个示例有问题。

它的HTTP接口的正确使用步骤如下:

① 首先访问http://yundama.com/download/YDMHttp.html,获得软件KEY,如图所示。

② 使用POST方式上传图片,并接收返回信息。

③ 网速足够好的时候,立刻就可以从返回的信息中得到验证码。如果返回的数据没有验证码,转步骤④。

④ 获取cid,并使用GET方式反复访问http://api.yundama.com/api.php? cid= <cid>&method=result,直到获取到验证码为止。

注意事项:

如果此打码网站不可使用,可通过搜索引擎寻找其他的打码网站。

通过看打码网站的文档来学习怎么使用,根据网站的说明把打码网站的接口集成到爬虫当中。

由于这种打码网站鱼龙混杂,而且小网站众多,因此在选择网站的时候,需要注意以下几点:

① 拒绝实名制,不要选择任何需要提供手机号及身份证照片的网站。

② 注册邮箱请使用小号,单独使用密码。

③ 如果要交费,注意交费地址。

④ 只使用支付宝扫二维码或者微信扫二维码支付,反复确认交费金额,不要在网站上输入密码。

⑤ 一次交费不要超过10元。

⑥ 尽量不要使用百度。

五、实例解析

模拟登录并验证并爬取网站内容。

1、需求分析

目标网站:果壳网 https://www.guokr.com。

目标内容:个人资料设置界面源代码。

使用模拟登录与验证码识别的技术实现自动登录果壳网。

果壳网的登录界面有验证码,请使用人工或者在线打码的方式识别验证码,并让爬虫登录。

登录以后可以正确显示“个人资料设置”界面的源代码。

涉及的知识点:

(1)爬虫识别验证码。

(2)爬虫模拟登录。

2、核心代码构建

在模拟登录果壳网的时候,POST提交的数据有两个参数:csrf_token和captcha_ rand。

这两个参数需要使用XPath或者正则表达式从网页源代码中获取。登录果壳网所需要的参数如图所示。

获取的csrf_token和captcha_rand位置如图。

3、运行与调试

代码运行以后的结果如图。

从图中也可以看到,使用在线打码的方式,验证码没有即时返回每一秒去打码网站查询的过程。

最后打开的源代码HTML标题为“个人资料”,说明已经成功登录。

好了,关于模拟登录与验证就讲到这里。

更多精彩内容请继续关注本站!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/412118.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

裸机:SD卡启动详解

内存和外存的区别 内存和外存在计算机系统中扮演着不同的角色&#xff0c;它们之间存在显著的差异。以下是内存和外存之间几个主要方面的区别&#xff1a; 存储特性与易失性 内存&#xff08;Memory&#xff09;&#xff1a;通常指的是随机存取存储器&#xff08;RAM&#x…

Linux实现异步IO的方法:epoll,posix aio,libaio,io_uring

Linux中异步IO的实现方式大概有以下几种&#xff1a; 1. epoll 熟悉网络编程的人可能会想到select&#xff0c;poll&#xff0c;epoll这些异步IO的方式&#xff0c;但实际上这些方式叫做非阻塞IO&#xff0c;并不是实际意义上的异步IO。因此这些只能用于异步的Socket IO&…

【STM32】一些外设通用内容

在学习各种外设的过程中&#xff0c;发现外设有一些通用的东西可以总结一下&#xff0c;后面发现再继续更新。图来源于正点原子的学习视频和PPT。 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 外设的时钟的开启 2 外设初始化的回调机制 3 外设的…

【HuggingFace Transformers】LlamaDecoderLayer源码解析

LlamaDecoderLayer源码解析 1. LlamaDecoderLayer 介绍2. LlamaDecoderLayer 类源码解析 1. LlamaDecoderLayer 介绍 LlamaDecoderLayer 是 LLaMA 模型中的一个关键组件&#xff0c;它结合了自注意力机制、全连接层和残差连接&#xff0c;以及对输入数据的归一化。主要流程为&…

使用 树莓派3B+ 对日本葡萄园进行经济实惠的环境监测

对于 菊岛邦夫—Vineyard Kikushima 而言&#xff0c;Raspberry Pi 生态系统提供了支持和信息&#xff0c;通过基于温度和湿度监测的有针对性的最低限度杀虫剂方案&#xff0c;来提高葡萄的健康产量。 Vineyard Kikushima&#xff1a;http://vykikushima.greater.jp/vineyards…

Ps:工具预设面板

Ps菜单&#xff1a;窗口/工具预设 Window/Tool Presets 工具预设 Tool Presets面板可以为 Photoshop 的图像编辑工作带来极大的便利。 定义好相关的工具预设后&#xff0c;可以直接调用&#xff0c;而不管现在处于什么工具或什么样的参数状态&#xff0c;省去了再次设置参数的麻…

Spring Boot简介与体系知识导图

Spring Boot是Spring开源组织下的一个子项目&#xff0c;是一个基于Spring框架的快速开发脚手架&#xff0c;它极大地简化了Spring应用的初始化和搭建过程&#xff0c;为开发者提供了快速、简单的方式来开发、部署和管理Spring应用。以下是关于Spring Boot的详细介绍&#xff1…

【MRI基础】对比度噪声比CNR概念

​ CNR代表 MRI 中的对比度噪声比。它是通过测量不同组织或感兴趣区域 (ROI) 相对于背景噪声的对比度来评估 MRI 图像质量的指标。更高的 CNR 表示更好的图像质量&#xff0c;因为它表示被比较的区域之间的区别更清晰。 CNR&#xff0c;contrast to noise ratio 基本概念 对比…

【数据结构】-----哈希

目录 一、哈希表概念 二、哈希函数 三、哈希冲突 Ⅰ、定义 Ⅱ、解决 ①闭散列--开放定址法 线性探测 二次线性探测 ②开散列--链地址法&#xff08;哈希桶&#xff09; 问题&#xff1a;哈希表何时扩容&#xff1f; 一、哈希表概念 哈希表又称散列表&#xff0c;它是一…

暄桐教室分享“闲人”指南

一种理想的生活状态&#xff0c;叫“做个闲人”&#xff0c;如苏东坡《行香子述怀》那般&#xff0c;“对一张琴&#xff0c;一壶酒&#xff0c;一溪云”&#xff0c;放下纷扰&#xff0c;好自在。然而&#xff0c;闲并不是简单的无事可做&#xff0c;让自己时光充沛、能量聚集…

【JavaEE初阶】HTTP请求(Request)

&#x1f4d5;引言 HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成 本片文章将从以下四个方面对HTTP请求报文进行解析 URL方法请求报头正文 &#x1f384;认识URL 我们先抓一个包来看一下URL在包里面的位置 平时我们俗称的 “网址” 其实就是说的 URL (…

SVN提取子目录到新库(附带提交历史)方法

plan-A: 以下命令需要直接在服务器上操作&#xff1a; 1、转存test_repo仓库 svnadmin dump test_repo > test_repo.dump 2、筛选指定子目录 svndumpfilter --drop-all-empty-revs include test_dir <test_repo.dump> test_repo_test_dir.dump --drop-all-empty…

MacOS通过Docker部署安装zookeeper、dubbo-admin,以及Docker Desktop进行管理

1.建立一个网络桥接zk docker network create -d bridge zk我们通过docker安装dubbo-admin和zookeeper,为了保证他们能够正常通信,需要使用同一个网络 2.创建zookeeper的docker卷 docker volume create zookeeper_data 3.启动zookeeper,并指定网络和卷 docker run -d \--n…

互联网热门项目聚合系统,集中热门互联网项目开发的小程序,支持H5,小程序

目录 前言&#xff1a; 一、互联网热门项目聚合系统模式&#xff1f; 二、怎么搭建自己的聚合cps联盟cpa平台 三、操作方式 四、模板 前言&#xff1a; 小程序平台上包含了CPA拉新 、短剧、小说&#xff0c;外卖&#xff0c;打车&#xff0c;旅游&#xff0c;话费充值&…

Qt调用外部exe并嵌入到Qt界面中(验证成功的成功)

http://t.csdnimg.cn/CDsqQ 原作者在这里 本文章主要介绍如何用Qt调用其他应用的exe,并将窗口嵌入到Qt界面中。很多人查到的代码都能成功的将exe调用起来&#xff0c;但是嵌入不到窗口中。主要有两种原因&#xff0c;现在从头到尾的梳理一下。 1.主要代码 1.1启动exe //包含…

vulhub xxe靶机

先用御剑扫描出ip然后进入网页 进入robots.txt里面会发现俩个目录然后我们进去xxe里面 进入xxe页面进行登录&#xff0c;burp抓包 然后进入重放器 可以看到关于密码和用户名的是xml,那么就可以考虑用xxe注入 <?xml version"1.0" ?> <!DOCTYPE r [ <!…

杰发科技AC7801——Flash模拟EEP内存(2)_备份

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容&#xff0c;等到打印完成 计算符合&#xff0c;从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t&#xff0c;因此最大值是65536&#xff0c;写65536…

Nvidia主导AI推理竞赛,但新兴对手纷纷崭露头角

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

软考 -- 软件设计师 -- 二轮复习(1) -- 计算机系统基础知识错题集和重点知识(持续更新)

软考 – 软件设计师 – 二轮复习(1) – 计算机系统基础知识错题集和重点知识(持续更新) 文章目录 软考 -- 软件设计师 -- 二轮复习(1) -- 计算机系统基础知识错题集和重点知识(持续更新)前言一、CPU二、内存编址计算三、原码、反码、补码、移码计算四、浮点数 前言 考试时间&a…

给Ubuntu添加硬盘之后,该如何使用

当你给Ubuntu系统添加了新的硬盘后&#xff0c;你需要按照以下步骤来识别、分区、格式化和挂载新硬盘&#xff1a; 1. 检查新硬盘是否被系统识别 首先确认新硬盘已经被系统识别&#xff1a; lsblk 2. 分区新硬盘 如果硬盘没有分区或者需要重新分区&#xff0c;可以使用fdis…