会员登录|免费注册|忘记密码|管理入口 返回主站||保存桌面|手机浏览|联系方式|购物车
异步社区免费电子书下载爬虫实验攻略
2024-12-29IP属地 湖北1

地址:https://www.epubit.com/bookDetails?id=UB77f4a1b70747e
异步社区《基于Python的金融分析与风险管理(第2版)》电子版免费页面下载。

通过右键另存为进行测试可以发现,每一页都是一个jpg文件,是一张图片。

通过上述测试和分析可以看出,免费图书的网址看似很有规律
都是:https://cdn.ptpress.cn/pubcloud/5B0A982E/ubook/UB77f4a1b70747e/pdfEbook/ 加上一个长码的名字。
实际上又找不出规律,因为后面的这个图片名字是无规律可循的。
所以,要找到链接到这些图片的母链接就尤为关键。

首先派上用场的就是“开发者工具”,主流的浏览器如chrome,firefox,360,都自带开发者工具,帮助分析网页信息。快捷键统一为:F12.

在开发者工具中点击“元素”(英文版“Elements”,Ctrl+F,在下方出现的查找框中,输入扉页的两页电子书的图片下载地址。
https://cdn.ptpress.cn/pubcloud/5B0A982E/ubook/UB77f4a1b70747e/pdfEbook/82dca929-8982-464d-a29b-ed666e63321d.jpg
https://cdn.ptpress.cn/pubcloud/5B0A982E/ubook/UB77f4a1b70747e/pdfEbook/cf0444a3-5c47-4fce-8c24-b8c1e6cfa20d.jpg
会发现,在页面元素中,都且仅存在着一个元素来对应。
也就是说,只要能找到这一个页面的网址就可以顺藤摸瓜,找到这一页面的一个或多个元素,从而找到对应的图片下载地址了。
这一页面的网址为
https://www.epubit.com/onlineEbookReader?id=126e68580c864d68ac7205c4fd9a55a1&pid=78c6d7a124e04ced8c271bf65126fb6f&isFalls=true
依次的,还可以看到其他页面的网址,例如“内容摘要”的网址
https://www.epubit.com/onlineEbookReader?id=2bc5be337a7949ffaa0e5886b0b4c524&pid=78c6d7a124e04ced8c271bf65126fb6f&isFalls=true
“作者简介”的网址为
https://www.epubit.com/onlineEbookReader?id=e50c5f575082449e9d688eaf32469bc3&pid=78c6d7a124e04ced8c271bf65126fb6f&isFalls=true
因此,如果能在上一级的页面中找到这些网址簇,就可以解决问题了。

很明显,阅读页中的信息,并不是通过上一级的页面中明码写出来的各种网址来获取的,而是通过点击:目录,上一节,下一节这些按钮来获取并更新页面的。这些按钮的点击背后做了哪些事情,需要你掌握一定的前后端编程知识和一些网络编程基本原理。如果你没有,只会一些python怎么办?“开发者工具”给我们提供了一些途径和方法。

PS:这里要了解的知识背景是:对于动态网页而言,每一次网络请求,服务器端都会返回一个Json对象,携带着结构化的信息。Json对象可以理解为一个可以嵌套的“键值对”数组。是传统的重量级结构化标记语言文件xml的轻量级变种,是现在最主流的,最高效的信息传输载体结构。可以通过点击“预览”旁边的“响应”(英文版“Response”)来一探Json真容。

在此操作下,打开“标头”页(英文版“Headers”,会看到一个请求 URL:
https://www.epubit.com/pubcloud/content/front/getContentsByFolderId?folderId=2bc5be337a7949ffaa0e5886b0b4c524&projectId=78c6d7a124e04ced8c271bf65126fb6f&src=
这个URL就是获得我们想要的Json对象的请求。只要利用Python程序,解析该请求URL,就可以得到json对象,再解析json对象,就可以提取到想要的imgUrls了。

那么问题来了,如何才能得到这个网址呢?我们当然知道是因为点击了“目录”->“内容提要”,爬虫如何嗅到呢

继续测试其他的几个页面,如
“作者简介”页的请求URL为
请求 URL:
https://www.epubit.com/pubcloud/content/front/getContentsByFolderId?folderId=e50c5f575082449e9d688eaf32469bc3&projectId=78c6d7a124e04ced8c271bf65126fb6f&src=

“前言”页的请求URL为
请求 URL:
https://www.epubit.com/pubcloud/content/front/getContentsByFolderId?folderId=e327f6ad01a54babad95397d4e75eff5&projectId=78c6d7a124e04ced8c271bf65126fb6f&src=

等等。
似乎规律已经浮现
(1)projectId是一个固定的值,应该是本书的一个统一的id。
(2)其余部分都是定值。
(3)folderId的值是变化的。

只要找到folderId的值,就可以成功拼出请求URL,从而得到下载图片的链接地址。

该URl的projectId,就是本书的统一Id号。
可以继续考察其他页的ebookfoldertree操作,欣喜的发现,均为相同的请求URL。
这意味着该请求URL,可以解析出所有的12个子目录的folderId,从而进一步获得相应的imgUrls,再保存这些图片就能完成爬取工作了。

至此,我们的网页分析与链接规律解析工作已经完成。接下来就是利用Python的各种神器,八仙过海各显神通的写出爬虫了。

首先,引入必备的包

 

接下来,利用get方法,从服务器获取ebookFolderTree的json数据。

 

接下来,解析ebookFolderTree的json数据,并逐层解析子目录,将所有的folderid记录在案。

 
 

利用folderids列表,拼装操作getContentsByFolderId?folderId=xxxxxxxxxx的请求URL,从而在返回的json数据中解析并获取imgUrls列表。再将imgUrls对应的图片资源获取后,写入本地文件,保存为图片。

 

这个加上注释一共六十行的小程序,就完成了对电子书《基于Python的金融分析与风险管理(第2版)》的免费部分的下载保存。当然,这要感谢异步社区并未开启反爬虫机制。同时,该程序只要稍加改进,整理,抽象出稍微通用的接口,就可以下载该网站的其他书籍的免费电子版了。那是另一部分的工作,此处不再赘叙。