电子课本分析,基于参数跳转逻辑的实现,Python爬虫实战分析

举报
梦想橡皮擦 发表于 2023/05/29 11:52:10 2023/05/29
【摘要】 声明:本篇博客不会涉及详细爬虫代码,仅展示数据采集过程中的关键信息。实战需求来源为博主邻居诉求,她希望为自己的孩子找到下学期的电子教材,然后就有了本案例。由于爬虫类知识点无法对大家直接展示,所以详细网址请查看评论区,或者联想一下。 爬虫采集难度在调研目标站点时,发现其核心逻辑是关注某账号,然后才能获取图书下载地址,但是当关注之后,得到的也只是一篇博客地址,如果你的诉求是获取某一本图书,这个操...

声明:本篇博客不会涉及详细爬虫代码,仅展示数据采集过程中的关键信息。

实战需求来源为博主邻居诉求,她希望为自己的孩子找到下学期的电子教材,然后就有了本案例。

由于爬虫类知识点无法对大家直接展示,所以详细网址请查看评论区,或者联想一下。

爬虫采集难度

在调研目标站点时,发现其核心逻辑是关注某账号,然后才能获取图书下载地址,但是当关注之后,得到的也只是一篇博客地址,如果你的诉求是获取某一本图书,这个操作完全没有问题,但是当要下载的资源变多之后,难度就上来了,太消耗人力了,所以,爬虫程序的需求就产生了。

接下来,我们要做的就是分析,分析站点,分析诉求,找到爬虫采集难点。

本案例数据量不大,所以无需采用多线程或者协程技术,使用单线程的 requests 模块即可完全实现。

站点核心可以被点击的页面有:

  • 列表页,进入图书目录页
  • 详情页,这里默认都是一张广告图。

当点击广告宣传图之后,发现其跳转到一个 mp.xxxx.xxxx.com/xxxx 的地址,在该固定地址,可以找到图书全部页截图。

至此整理逻辑已经梳理清晰,让我们再次梳理一下爬虫采集程序的逻辑。

爬虫采集逻辑

  1. 从列表页获取图书详情页地址;
  2. 从详情页任选一目录链接,跳转到内页,即引导关注页;
  3. 点击广告图,跳转到整本书影印页;
  4. 采集该页所有图片。

流程中最重要的步骤现在出现了,获取【全书影印页】地址。

当然实际获取该地址前,还需要先查阅一下最后的详情页能不能被直接采集到,测试代码如下,其中目标站点地址已经进行 Base64 加密,为了保证本文能够发布!

import requests

res = requests.get('aHR0cHMlM0EvL21wLndlaXhpbi5xcS5jb20vcy95bkdTMGVHUENsbk1kdUtfQnJfTGx3')
print(res.text)

爬虫最核心的逻辑 - 提取详情页

思路回归到提取详情页地址的逻辑上,在上文提及的广告图位置,查看源码,得到下图展示信息。

从图片中可以提前出三点信息:

  1. 使用的是超链接跳转,其中间页为 go.asp
  2. 超链接 a 标签存在 id 属性,这个可能会成为阻挡我们的关键点;
  3. 该链接还绑定了一个 onclick 事件,进一步对我们造成了干扰。

一个链接,可能存在三种跳转方式,接下来就要依次进行验证。

先复制一份目标源码,如下所示:

<a
  id="gourl"
  href="/go.asp?p=/books/rjb/shuxue/xs5x_new/&amp;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 篇原创博客

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。