Python爬虫系列6-百度文库VIP付费数据的抓取

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 编程难不难?那可不是闹着玩的。不从事这一行的永远不知道这行的艰辛俗话说的好;爬虫在手天下我有,自从学习了爬虫;看到什么都想盘它一番;直到遇到JS反爬。不知大家有没有遇到过这种情况;就是你在网上不管是查阅资料也好还是做什么,你会发现其实很多人写的反爬一类的都只给你看结果,你根本不知道这个突破过程是怎么样的,哪怕获取到了代码又有何用;下次再给你一道题,你同样还是不会。你品,你细品......我觉得做任何事情一定有在短期内简单可行的方法。学习不应该是苦差事,而应该是快乐的,重要的是找到适合自己的学习方法。师者传道受业解惑!

确定要抓取的数据内容

开始之前咱们先看一下要爬取的数据内容~
image.png

分析网站结构

image.png

通过鼠标选择器;选中文本之后在右侧的元素面板中可以看到数据是包含在p标签中的,我在想是否能够通过re正则表达式直接获取对应的text文本;~ 哈哈,想简单了🤓 ~ 因为在仔细对比之后发现,class所对应的属性是不规则的;就算将文本获取下来了,文字也是那种七拼八凑没有排好版的;这样的文章要来也没有任何用呀;所以继续分析呗......😂

一般像这种文章一类的;它的api确实很难逆向......自己埋得坑得给填平😂
image.png

image.png

经过一番查找;发现这个VIP文库好像是通过js文件然后生成了属于自己独有的api地址 ?
在不确定对不对的情况下,也没有其他数据验证的情况下;先解析排序一番 看是否能够拿到数据。

-实战

第一步:请求网络链接先获取到网站返回数据


import requests
import re

# 设置会话列表
session = requests.session()
# 请求网址
def get_content_url(url):
    return session.get(url).content.decode('gbk')

def main():
    url = input('请输入你要付费下载百度文库的url网址:')
    content = get_content_url(url)
    print(content)

image.png

我们在获取到该文章的url之后,查看该url对应的网页数据时,在这个网页数据中发现它同时蕴含着真正文章的地址
image.png


htmlUrls = '{\x22ttf\x22:[{\x22pageIndex\x22:1,\x22param\x22:\x22&md5sum=b1f8fa5aeb9b6fed68ad32e063bfb0e5&range=0-31101&sign=7515dbae11\x22},{\x22pageIndex\x22:2,\x22param\x22:\x22&md5sum=b1f8fa5aeb9b6fed68ad32e063bfb0e5&range=31102-55306&sign=7515dbae11\x22},{\x22pageIndex\x22:3,\x22param\x22:\x22&md5sum=b1f8fa5aeb9b6fed68ad32e063bfb0e5&range=55307-93048&sign=7515dbae11\x22},{\x22pageIndex\x22:4,\x22param\x22:\x22&md5sum=b1f8fa5aeb9b6fed68ad32e063bfb0e5&range=93049-132192&sign=7515dbae11\x22},{\x22pageIndex\x22:5,\x22param\x22:\x22&md5sum=b1f8fa5aeb9b6fed68ad32e063bfb0e5&range=132193-&sign=7515dbae11\x22}],\x22json\x22:[{\x22pageIndex\x22:1,\x22pageLoadUrl\x22:\x22https:\\\/\\\/wkbjcloudbos.bdimg.com\\\/v1\\\/docconvert5004\\\/\\\/wk\\\/b1f8fa5aeb9b6fed68ad32e063bfb0e5\\\/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C%2014%20Jun%202020%2014%3A46%3A09%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-04-30T06%3A46%3A09Z%2F3600%2Fhost%2F9e582203d432a9f847b718dab571a08017108e768f72ade5237ff652a7155251&x-bce-range=0-10894&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4ODIzMjc2OSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.ErP4NzQSHI7omb0fL0PCVfgvk0ze0w0JUfZLWMMYDlM%3D.1588232769\x22},{\x22pageIndex\x22:2,\x22pageLoadUrl\x22:\x22https:\\\/\\\/wkbjcloudbos.bdimg.com\\\/v1\\\/docconvert5004\\\/\\\/wk\\\/b1f8fa5aeb9b6fed68ad32e063bfb0e5\\\/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C%2014%20Jun%202020%2014%3A46%3A09%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-04-30T06%3A46%3A09Z%2F3600%2Fhost%2F9e582203d432a9f847b718dab571a08017108e768f72ade5237ff652a7155251&x-bce-range=10895-28260&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4ODIzMjc2OSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.9i8HdDDmUge8YbVEMtZAnelm%2FDSLDfBfgI2Jx7P16aE%3D.1588232769\x22},{\x22pageIndex\x22:3,\x22pageLoadUrl\x22:\x22https:\\\/\\\/wkbjcloudbos.bdimg.com\\\/v1\\\/docconvert5004\\\/\\\/wk\\\/b1f8fa5aeb9b6fed68ad32e063bfb0e5\\\/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C%2014%20Jun%202020%2014%3A46%3A09%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-04-30T06%3A46%3A09Z%2F3600%2Fhost%2F9e582203d432a9f847b718dab571a08017108e768f72ade5237ff652a7155251&x-bce-range=28261-38549&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4ODIzMjc2OSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.4SABpIpgQ%2BnueqTBSwfTo3nLieKfUcGU%2FZU9OZ%2F4nk0%3D.1588232769\x22},{\x22pageIndex\x22:4,\x22pageLoadUrl\x22:\x22https:\\\/\\\/wkbjcloudbos.bdimg.com\\\/v1\\\/docconvert5004\\\/wk\\\/b1f8fa5aeb9b6fed68ad32e063bfb0e5\\\/0.json?responseContentType=application%2Fjavascript&responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C%2014%20Jun%202020%2014%3A46%3A09%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-04-30T06%3A46%3A09Z%2F3600%2Fhost%2F5a356ec62775deff7aa1b5b5b4937945c319efe9126778be6254387b75ca1626&x-bce-range=38550-52301&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4ODIzMjc2OSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDb250ZW50VHlwZSIsInJlc3BvbnNlQ2FjaGVDb250cm9sIiwicmVzcG9uc2VFeHBpcmVzIiwieC1iY2UtcmFuZ2UiXX0%3D.L5iFcYymhKwKiOA3dVRyBtUXFG9QRfohHiaIzS2MpQU%3D.1588232769\x22},{\x22pageIndex\x22:5,\x22pageLoadUrl\x22:\x22https:\\\/\\\/wkbjcloudbos.bdimg.com\\\/v1\\\/docconvert5004\\\/\\\/wk\\\/b1f8fa5aeb9b6fed68ad32e063bfb0e5\\\/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C%2014%20Jun%202020%2014%3A46%3A09%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-04-30T06%3A46%3A09Z%2F3600%2Fhost%2F9e582203d432a9f847b718dab571a08017108e768f72ade5237ff652a7155251&x-bce-range=52302-&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4ODIzMjc2OSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.9VimXbBUqMM9a8uJUhZFYjWxNzEnd0X485v%2FiCIHO24%3D.1588232769\x22}],\x22png\x22:[]}'

第二步:正则表达式进行数据解析

解析之后不知道大家有没有发现一个规律;这里面蕴含的数据内容; 哈哈哈 ~ 😎我们好像找到了! 噢耶🤞 ️这种感觉非常的神奇;跟探索新大陆似的。也许这就是爬虫的乐趣所在 Go Go Go !一鼓作气。。。


def get_content_type(content):
    print(re.findall(r"docType.*?\:.*?\'(.*?)\'\,", content))

image.png

是不是没有任何发现;脑子有点懵~ 慢慢来!我已经标注出来了。既然我们发现了这个数据集,那么接下来尝试着解析一下呗;看看隐藏这么深的究竟是何方神圣。。。。。。
image.png

根据上面获取到的数据集经过再一次的解析;我们得到了一个链接;好像~貌似看到希望了呀;哈哈~
image.png

再解析一下;此时我们已经通过正则表达式取得该文章的地址了,这些地址不止一个;接下来让我们把代码先完善一下
[图片上传失败...(image-b384de-1600501959886)]
PS:因为每个文章的类型是不同的;看下图;所以这里只做了doc格式的解析;其他的思路都差不多;有心的同学可以参照着我这种方案自己动手试一下。
image.png

def get_content_type(content):
    return re.findall(r"docType.*?\:.*?\'(.*?)\'\,", content)[0]

使用文章的地址再次向服务器发送请求时,获取到的文章数据,但是此时的数据还并不是文章的内容,而是一个json结构的数据集;这里大家看起来可能有点懵逼;我们稍微给他处理一下
image.png

经过解析之后;这样看起来就清晰了很多;大家看下图的左边👈~ 然后再看右边👉解析整理之后的;
[图片上传失败...(image-4dbdb8-1600501959886)]
不过看到这个数据集有些脑袋懵懵的,头皮发麻有没有;经过一番摸索之后;给大家整理一下结论;

这个数据集是基于百度文库自己的阅读器生成的,里面包含了非常多的信息,我们需要的文章内容就在其中,只不过它是以五维的位置参数,来标明内容出现的位置。

比如下面这样,内容就是 c 这一串的Unicode编码,p 就是其位置参数,什么高啊、宽啊等。
image.png

有种无从下手的感觉;经过一番实验;这里我们可以根据 y 的数值对整个文档进行简单排列,然后设置编解码。

不理解的同学可以根据代码。自己实践一下;这里就不细说了!


def get_content_doc(content):
    result = ''
    url_list = re.findall('(https.*?0.json.*?)\\\\x22}', content)
    # print(url_list)
    url_list = [addr.replace("\\\\\\/", "/") for addr in url_list]
    for url in url_list[:-5]:
        content = fetch_url(url)
        y = 0
        txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', content)
        for item in txtlists:
            if not y == item[1]:
                y = item[1]
                n = '\n'
            else:
                n = ''
            result += n
            result += item[0].encode('utf-8').decode('unicode_escape', 'ignore')
    return result

解析完毕;打完收工

image.png

第三步:数据保存

到这一步,就比较简单了;

def save_file(filename, content):
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(content)
        print('已保存为:' + filename)

if __name__ == "__main__":
    main()

效果展示

保存至txt文件中

上面的代码逻辑是直接保存在txt文件中的 比如这样的
image.png

保存至word文档中

经过再一次的处理;尝试保存至word文档中 效果是这样的
image.png

在这个浮躁的时代;竟然还有人能坚持篇篇原创;

如果本文对你学习有所帮助-可以点赞👍+ 关注!将持续更新更多新的文章。

支持原创。感谢!

相关文章
|
17天前
|
数据采集 API 数据处理
Objective-C 音频爬虫:实时接收数据的 didReceiveData: 方法
Objective-C 音频爬虫:实时接收数据的 didReceiveData: 方法
|
18天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
14天前
|
数据采集 Python
python爬虫抓取91处理网
本人是个爬虫小萌新,看了网上教程学着做爬虫爬取91处理网www.91chuli.com,如果有什么问题请大佬们反馈,谢谢。
24 4
|
16天前
|
数据采集 Java Python
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
在信息化时代,实时数据的获取对体育赛事爱好者、数据分析师和投注行业至关重要。本文介绍了如何使用Python的`ThreadPoolExecutor`结合代理IP和请求头设置,高效稳定地抓取五大足球联赛的实时比赛信息。通过多线程并发处理,解决了抓取效率低、请求限制等问题,提供了详细的代码示例和解析方法。
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
|
1月前
|
消息中间件 数据采集 数据库
小说爬虫-03 爬取章节的详细内容并保存 将章节URL推送至RabbitMQ Scrapy消费MQ 对数据进行爬取后写入SQLite
小说爬虫-03 爬取章节的详细内容并保存 将章节URL推送至RabbitMQ Scrapy消费MQ 对数据进行爬取后写入SQLite
21 1
|
1月前
|
数据可视化 IDE 数据挖掘
Python助您洞察先机:2024年A股市场数据抓取与分析实战
【10月更文挑战第1天】随着2024年中国股市的强劲表现,投资者们对于如何高效获取并分析相关金融数据的需求日益增长。本文旨在介绍如何利用Python这一强大的编程语言来抓取最新的A股交易数据,并通过数据分析技术为个人投资决策提供支持。
214 1
|
1月前
|
数据采集 数据挖掘 数据处理
Python中实现简单爬虫并处理数据
【9月更文挑战第31天】本文将引导读者理解如何通过Python创建一个简单的网络爬虫,并展示如何处理爬取的数据。我们将讨论爬虫的基本原理、使用requests和BeautifulSoup库进行网页抓取的方法,以及如何使用pandas对数据进行清洗和分析。文章旨在为初学者提供一个易于理解的实践指南,帮助他们快速掌握网络数据抓取的基本技能。
57 3
|
2月前
|
数据采集 Python
天天基金数据的Python爬虫
天天基金数据的Python爬虫
44 3
|
2月前
|
数据采集 存储 JavaScript
构建您的第一个Python网络爬虫:抓取、解析与存储数据
【9月更文挑战第24天】在数字时代,数据是新的金矿。本文将引导您使用Python编写一个简单的网络爬虫,从互联网上自动抓取信息。我们将介绍如何使用requests库获取网页内容,BeautifulSoup进行HTML解析,以及如何将数据存储到文件或数据库中。无论您是数据分析师、研究人员还是对编程感兴趣的新手,这篇文章都将为您提供一个实用的入门指南。拿起键盘,让我们开始挖掘互联网的宝藏吧!
|
2月前
|
数据采集 JSON 数据格式
Python:南京地铁每日客流数据的爬虫实现
Python:南京地铁每日客流数据的爬虫实现
59 1
下一篇
无影云桌面