进网页需要验证码?不好意思,Python从来不惧各种验证码

就是比小编短了一点点

我们来看看请求的参数是怎么样的

哇靠,gt ?challenge?w?

这些都是什么鬼参数,还加密了,完全下不了手啊

那么

本篇完

再见

peace

你是不是迷恋我??

好吧

你居然滑到这里来了

说明你还是有点爱我的

我是那种遇到一点困难就放弃的人吗

显然不是

那么接下来才是真的学习 python 的正确姿势

既然以请求的方式不好弄,我们从它们的源代码入手,看看有什么突破口。

回到 b 站的登录页,按下 F12,进入 Element

然后点击滑块出现了图片,定位一下

发现有两个 a 标签

一个 class 是 gt_bg gt_show

一个 class 是 gt_fullbg gt_show

和小帅b想的一样

这个验证码应该是有两张图片

一张是完全的背景图片

一张是缺口的图片

那把这两张图片下载下来对比一下不就行了

打开 a 标签一看

哇靠

一张图片被切割成很多小块

原来这张图片是拼出来的

我们看看原始图片是怎么样的

什么乱七八糟的

再仔细看下源代码

原来是在同一张图片通过偏移量合成了一张完整的图片

background-position: -277px -58px;

厉害厉害

小编我看了一下缺口的图片也是如此

到这里

我们的第一个思路就是

下载这两张原始图片

然后通过偏移量合成两张真正的图片

背景图

↓变身

缺口图

↓变身

那么怎么做呢?

因为我们还要模拟滑动滑块

所以呢

我们要用到 selenium

打开b站的登录页

然后等到那个滑块显示出来

获取滑块按钮

driver.get(url)

slider = WAIT.until(EC.element_to_be_clickable(

(By.CSS_SELECTOR, “#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show”)))

接下来我们就获取页面的源码

driver.page_source

然后使用 bs 获取两张原始背景图片的 url

bs = BeautifulSoup(driver.page_source,‘lxml’)

找到背景图片和缺口图片的div

bg_div = bs.find_all(class_=‘gt_cut_bg_slice’)

fullbg_div = bs.find_all(class_=‘gt_cut_fullbg_slice’)

获取缺口背景图片url

bg_url = re.findall(‘background-image:\surl(“(.*?)”)’,bg_div[0].get(‘style’))

获取背景图片url

fullbg_url = re.findall(‘background-image:\surl(“(.*?)”)’,fullbg_div[0].get(‘style’))

拿到了图片地址之后

将图片下载下来

将图片格式存为 jpg 格式

bg_url = bg_url[0].replace(‘webp’, ‘jpg’)

fullbg_url = fullbg_url[0].replace(‘webp’, ‘jpg’)

print(bg_url)

print(fullbg_url)

下载图片

bg_image = requests.get(bg_url).content

fullbg_image = requests.get(fullbg_url).content

print(‘完成图片下载’)

ok

我们已经把两张原始图片下载下来了

那么接下来就是要合成图片了

我们要根据图片的位置来合成

也就是源码中的 background-position

获取每一个小图片的位置

我们可以通过字典的形式来表示这些位置

然后将数据放到列表中

存放每个合成缺口背景图片的位置

bg_location_list = []

存放每个合成背景图片的位置

fullbg_location_list = []

for bg in bg_div:

location = {}

location[‘x’] = int(re.findall(‘background-position:\s(.?)px\s(.?)px;’, bg.get(‘style’))[0][0])

location[‘y’] = int(re.findall(‘background-position:\s(.?)px\s(.?)px;’, bg.get(‘style’))[0][1])

bg_location_list.append(location)

for fullbg in fullbg_div:

location = {}

location[‘x’] = int(re.findall(‘background-position:\s(.?)px\s(.?)px;’, fullbg.get(‘style’))[0][0])

location[‘y’] = int(re.findall(‘background-position:\s(.?)px\s(.?)px;’, fullbg.get(‘style’))[0][1])

fullbg_location_list.append(location)

那么

现在我们已经有了原始图片

还知道了每个位置应该显示原始图片的什么部分

接下来我们就写一个方法

用来合成图片

写入图片

bg_image_file = BytesIO(bg_image)

fullbg_image_file = BytesIO(fullbg_image)

合成图片

bg_Image = mergy_Image(bg_image_file, bg_location_list)

fullbg_Image = mergy_Image(fullbg_image_file, fullbg_location_list)

那么问题又来了

怎么合成啊

我们再看看一开始分析的图片

这里图片被分割成的每一个小图片的尺寸是

10 * 58

所以我们也要将我们刚刚下载的原始图片切割成相应的尺寸大小

而且

这张图片是由上半部分的小图片和下半部分的小图片合成的

所以我们定义两个 list 来装这些小图片

存放上下部分的各个小块

upper_half_list = []

down_half_list = []

然后将原始的图片切割好放进去

image = Image.open(image_file)

通过 y 的位置来判断是上半部分还是下半部分,然后切割

for location in location_list:

if location[‘y’] == -58:

间距为10,y:58-116

im = image.crop((abs(location[‘x’]), 58, abs(location[‘x’])+10, 116))

upper_half_list.append(im)

if location[‘y’] == 0:

间距为10,y:0-58

im = image.crop((abs(location[‘x’]), 0, abs(location[‘x’]) + 10, 58))

down_half_list.append(im)

至此

我们这两个 list 就分别放好了各个切割的图片了

那么接下来就创建一张空白的图片

然后将小图片一张一张(间距为10)的粘贴到空白图片里

这样我们就可以得到一张合成好的图片了

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
[外链图片转存中…(img-5LoLYD0K-1711029962847)]

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值