网页抓取解密(【每日一题】高产量博主,点个关注不迷路!)
优采云 发布时间: 2022-02-18 17:21网页抓取解密(【每日一题】高产量博主,点个关注不迷路!)
PS高收益博主,点击不要迷路!
内容
一、实战需要的确定
本次实战的主要目的是复习requests库的基本语法,同时介绍一些新的内容:登录界面的捕获方式、session的使用、隐藏域问题的解决方法、破解验证码的方法等
要求如下:首先,我们可以打开古诗词网站:
接线以单击我的选项:
此时,我们需要登录才能看到个人下方的个人信息页面:
但是我们这次的实际需求是在不登录(绕过登录)的情况下获取个人页面的源码信息。
二、抓取古诗词网站的登录界面
确定需求后,可以简单分析一下我们的实现思路:首先,我们需要抓取相关的登录接口,然后将接口放入代码中,获取相关参数,匹配相关参数,达到绕过登录的目的。
所以迈出第一步:抓取固始文的登录界面:
1️⃣ 回到刚才的古诗文登录页面:
我们按 F12 解析网页:
这时候Network中Name列的第一项login.aspx就和我们需要的界面很相似了。但是,当我们查看它的具体内容时,我们发现这并不是一个真正的登录界面。有两个原因:
首先是因为我们的登录信息是放在输入文本框中的,所以接口应该是POST请求,而这个接口是GET请求;
二是我们在Headers中找不到相关的登录参数,比如用户名、密码和验证码。
所以获取登录界面有个小技巧:输入一组错误的用户名或者密码或者验证码,然后我们就可以在Network中找到真正的登录界面了:
在上述操作中,记得先按F12,然后不要关闭F12,而是输入一组错误信息,然后不要点击网页提示的OK按钮,否则界面会消失。
找到接口后,我们保存接口的url,同时点击Payload,查看POST请求的参数(部分谷歌浏览器版本的参数在Headers项下,其他版本在Payload中) :
至此,我们了解到有__VIEWSTATE、__VIEWSTATEGENERATOR、from、email、pwd、code、denglu这7个参数,而from、email、pwd、denglu这4个参数是已知的或固定的。其他四人不详。
三、难度分析
抓到接口和参数后,再来分析一下我们的难点:解决__VIEWSTATE、__VIEWSTATEGENERATOR、代码这三个参数。
前两个参数__VIEWSTATE、__VIEWSTATEGENERATOR是一种叫做隐藏域的技术手段,是一种反爬虫手段,我们需要一些方法来解决这两个参数。
最后一个参数码,验证码,需要我们采取一些必要的方法来解决(获取)。
四。隐藏域的解决方法
先解决隐域问题:
隐藏字段是什么意思?我们的 POST 请求提交的参数是由输入表单域发起的。因此,按照传统的思维方式,网页上所有的参数都应该有对应的输入文本框,但有些参数没有对应的输入文本框。这些参数是隐藏的,这类问题称为隐藏域问题。
隐藏域问题的一个常见解决方案是在页面的源代码中搜索参数的痕迹:
我们回到古时文的登录页面,按F12解析源码:
可以看到,当我们按Ctrl+f,分别输入__VIEWSTATE和__VIEWSTATEGENERATOR进行查询时,我们在它的源码中找到了这两个参数,这样这个参数问题就解决了。
五、验证码的破解方法:
最后,我们着手解决验证码的问题。在之前的实战中,这个问题是手动输入的。这次,我们将介绍另外两种方法:图像识别和编码平台破解。
VI 手动输入
首先回顾一下手动输入法。这个方法就是我们下载验证码对应的图片,然后在图片上看到验证码的内容,通过python输入函数读取验证码。
但是,这种方法并没有实现真正的自动化,所以我们探索了另外两种方法。
五、二图像识别
第二种方法是图像识别,描述如下:
首先,让我们安装图像识别所需的插件和库:
1️⃣ 下载插件:Tesseract-OCR,放到任意目录下(不过记住这个位置,后面会用到),这里是Tesseract-OCR的下载链接(提取码:dxzj)
2️⃣ 安装 pytesseract 和 Pillow 库。
首先查看你的python解释器的路径,找到里面的Scripts文件夹,打开终端,使用终端进入这个文件夹:
执行安装说明:
pip install pytesseract
pip install Pillow
之后,我们一步之遥:修改pytesseract.py文件中的一行代码:
首先我们找到pytesseract.py文件:它的路径在python安装目录下的lib文件夹中的set-packages文件夹中,进入set-packages文件夹,找到一个叫pytesseract的文件夹,里面收录pytesseract.py文件。
打开这个文件,将红圈内那行代码的内容替换为刚安装Tesseract-OCR的安装路径(定位到tesseract.exe)
最后,我们可以在代码中成功导入图像识别库,并调用相关代码进行图像识别:
from PIL import Image
import pytesseract
text = pytesseract.image_to_string(Image.open(r'demo.png'))
print(text)
在识别图片的时候,我们直接复制上面的代码,将Image.open函数替换为对应图片的路径即可。
V.III编码平台:Super Eagle编码
最后一种方法是使用编码平台。我们以 Super Eagle 编码为例:
我们进入它的官网,点击开发文档,选择python:
然后点击下载:
之后,将下载一个压缩包。我们只需要一个名为 chaojiying.py 的文件:
如果懒得按上面的步骤,可以直接点击我的分享链接下载chaojiying.py文件(提取码:dxzj)
然后我们打开py文件,滑到最下面, if__name=='__main': 这是我们需要自己修改的部分(其他内容不要改!!!):
这部分,首先我们需要在print函数中加一个括号,改成print(),然后我们观察这部分代码,有两个地方需要自定义:im和chaojiying.PostPic()两个部分:
在im这部分,我们可以传入需要识别的图片路径;
PostPic()函数的第一个参数是im,第二个参数需要在我们自己的超级鹰平台账号下获取:
我们回到超级鹰官网,注册一个自己的账号,然后进入我们的账号:
选择软件ID:
之后,我们点击生成软件ID,填写信息,随便选择一个名字,表示不需要填写,然后点击提交。
然后就可以看到我们刚刚创建的软件ID值了:
此时,我们可以将这个id作为参数传递给刚才的chaojiying.PostPic()函数作为第二个参数。
补充:这个时候我们还不能真正认出形象,原因是我们没钱,可以这样充值:
以学习为目的,我们选择其他金额,充值1元玩。
在这个页面可以看到我们的充值金额和充值标准:验证码类型和价目表-超级鹰验证码识别
六、完整的源代码
最后附上本次实战源码:
import requests
# 登录页面的url接口地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
response = requests.get(url = url,headers = headers)
content = response.text
# print(content)
# 解析源码,获取__VIEWSTATE __VIEWSTATEGENERATOR
from bs4 import BeautifulSoup
soup = BeautifulSoup(content,'lxml')
# 获取 __VIEWSTATE 的value值
__VIEWSTATE = soup.select('#__VIEWSTATE')[0].attrs.get('value')
# 获取__VIEWSTATEGENERATOR的value属性值
__VIEWSTATEGENERATOR = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
print(__VIEWSTATEGENERATOR)
print(__VIEWSTATE)
# 获取验证码的图片
basic_url = 'https://so.gushiwen.cn'
code_url = basic_url + soup.select('#imgCode')[0].attrs.get('src')
# session:验证码的一致性,requests库里有一个session方法,
# session的返回值,能够使请求变成一个对象
session = requests.session()
# 验证码的url的内容
response_code = session.get(code_url)
# 此时要使用二进制数据,因为我们要使用的是图片的下载,图片转二进制下载
content_code = response_code.content
# wb的模式是将二进制数据写入文件
with open('code.jpg','wb') as fp:
fp.write(content_code)
# 获取验证码的图片,下载到本地,观察它的内容:
# 控制台,输入验证码:
code_name = input('请输入你的验证码:')
#
# 点击登录
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data_post = {
'__VIEWSTATE' : __VIEWSTATE,
'__VIEWSTATEGENERATOR' : __VIEWSTATEGENERATOR,
'from' : 'http://so.gushiwen.cn/user/collect.aspx',
'email': 'Lobster_Jian_Lang@163.com',
'pwd': 'ljl010802',
'code': code_name,
'denglu': '登录'
}
response_post = session.post(url = url_post,headers = headers,data = data_post)
content_post = response_post.text
with open('gushiwen.html','w',encoding = 'utf-8') as fp:
fp.write(content_post)
# 第二种验证码方式:图像识别
# from PIL import Image
# import pytesseract
#
# code_name = pytesseract.image_to_string(Image.open(r'code.jpg'))
以上就是本次实战的完整博文!