电子课本分析,基于参数跳转逻辑的实现,Python爬虫实战分析
声明:本篇博客不会涉及详细爬虫代码,仅展示数据采集过程中的关键信息。
实战需求来源为博主邻居诉求,她希望为自己的孩子找到下学期的电子教材,然后就有了本案例。
由于爬虫类知识点无法对大家直接展示,所以详细网址请查看评论区,或者联想一下。
爬虫采集难度
在调研目标站点时,发现其核心逻辑是关注某账号,然后才能获取图书下载地址,但是当关注之后,得到的也只是一篇博客地址,如果你的诉求是获取某一本图书,这个操作完全没有问题,但是当要下载的资源变多之后,难度就上来了,太消耗人力了,所以,爬虫程序的需求就产生了。
接下来,我们要做的就是分析,分析站点,分析诉求,找到爬虫采集难点。
本案例数据量不大,所以无需采用多线程或者协程技术,使用单线程的 requests 模块即可完全实现。
站点核心可以被点击的页面有:
- 列表页,进入图书目录页
- 详情页,这里默认都是一张广告图。
当点击广告宣传图之后,发现其跳转到一个 mp.xxxx.xxxx.com/xxxx 的地址,在该固定地址,可以找到图书全部页截图。
至此整理逻辑已经梳理清晰,让我们再次梳理一下爬虫采集程序的逻辑。
爬虫采集逻辑
- 从列表页获取图书详情页地址;
- 从详情页任选一目录链接,跳转到内页,即引导关注页;
- 点击广告图,跳转到整本书影印页;
- 采集该页所有图片。
流程中最重要的步骤现在出现了,获取【全书影印页】地址。
当然实际获取该地址前,还需要先查阅一下最后的详情页能不能被直接采集到,测试代码如下,其中目标站点地址已经进行 Base64 加密,为了保证本文能够发布!
import requests
res = requests.get('aHR0cHMlM0EvL21wLndlaXhpbi5xcS5jb20vcy95bkdTMGVHUENsbk1kdUtfQnJfTGx3')
print(res.text)
爬虫最核心的逻辑 - 提取详情页
思路回归到提取详情页地址的逻辑上,在上文提及的广告图位置,查看源码,得到下图展示信息。
从图片中可以提前出三点信息:
- 使用的是超链接跳转,其中间页为
go.asp
; - 超链接 a 标签存在 id 属性,这个可能会成为阻挡我们的关键点;
- 该链接还绑定了一个
onclick
事件,进一步对我们造成了干扰。
一个链接,可能存在三种跳转方式,接下来就要依次进行验证。
先复制一份目标源码,如下所示:
<a
id="gourl"
href="/go.asp?p=/books/rjb/shuxue/xs5x_new/&url=%2Cn%2AtkCN%2BcDKAglIasHZ%3Dn%5BGjucrrnq5%2B%2Ahm%2Cs%60fugk%2Amn%2B%5Fjh"
onclick="javascript:_hmt.push(['_trackEvent','数学','/books/rjb/shuxue/xs5x_new/','mp.xxxx.xxxxx.com/?数学同步资源']);"
title="1 观察物体(三)(第2页)"
><img src="/images/viewpage1-dzkbdhw.jpg" id="ebookimg"
/></a>
其中一眼就能识别到一个 url
参数值 %2Cn%2AtkCN%2BcDKAglIasHZ%3Dn%5BGjucrrnq5%2B%2Ahm%2Cs%60fugk%2Amn%2B%5Fjh
,
如果你对 URL 编码比较熟悉,一眼就能看出 %2C
这种常见编码符号。
下面使用 `` 对 URL 进行解码。
from urllib.parse import unquote
text = unquote("%2Cn%2AtkCN%2BcDKAglIasHZ%3Dn%5BGjucrrnq5%2B%2Ahm%2Cs%60fugk%2Amn%2B%5Fjh", 'utf-8')
print(text)
解析之后,得到如下字符串,明显看出是一个加密串。
,n*tkCN+cDKAglIasHZ=n[Gjucrrnq5+*hm,s`fugk*mn+_jh
此时通过 URL 直接解码完成目标已经无法实现,需要进入到调试环节,查看其传递加密参数之后还执行了哪些逻辑。
在跳转图书页之前,出现了一个加载页,但是由于开发者工具无法缓存,所以需要用代码跑一下逻辑。
爬虫逻辑跳转页
使用下述代码得到中间页源码。
import requests
headers = {
"Referer": "http://www.爬虫数据混淆,参照评论区.com/books/rjb/shuxue/xs5x_new/007.htm",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
}
res = requests.get('http://www.爬虫数据混淆,参照评论区.com/go.asp?p=/books/rjb/shuxue/xs5x_new/&url=%2Cn%2AtkCN%2BcDKAglIasHZ%3Dn%5BGjucrrnq5%2B%2Ahm%2Cs%60fugk%2Amn%2B%5Fjh',headers=headers)
res.encoding = 'gb2312'
print(res.text)
果然在跳转源码中找到了其解密逻辑,具体如下图所示:
代码传递被加密的参数到 goto()
函数中,该函数调用了一个 dzkbw()
函数,这个函数应该就是解密函数了。
首先在控制台运行一下被混淆的代码,得到下图所示内容,可以看到 dzkbw() 函数,就是由下图所示的一大段代码生成,我们的重点也就变成了在 Python 中运行下述 JS 代码(注意,这里你不需要对其进行解析)。
接下来用 Python 实现 JS 执行,并执行 JS 内部函数的问题,交给你来完成啦,我们下篇博客见!
📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 2000 篇原创博客
- 点赞
- 收藏
- 关注作者
评论(0)