js input复选框选中父级同时子级也选中_突破百度JS反爬获取百度文库数据下载...

f91f428205a6158a1a7b65b5b1cd7138.png

d1d05bed36bc39187cc460be81df6d76.png

毕业,是一首离别的歌

5c057a8ccfc5ce686cd823718d70b0ae.png

5c057a8ccfc5ce686cd823718d70b0ae.png

d1d05bed36bc39187cc460be81df6d76.png

前言

炎炎夏季,又快到了我们该说毕业的时候。都说分开是为了更好的相聚,让我们彼此珍惜!

在这个炎热的空档期,对于技术渴望的宅男腐女们我们该做点什么呢?那最好的方式就是用编程来填补我们内心的空虚。

编程难不难?那可不是闹着玩的。不从事这一行的永远不知道这行的艰辛。
俗话说的好;爬虫在手天下我有,自从学习了爬虫;看到什么都想盘它一番直到遇到JS反爬
不知大家有没有遇到过这种情况;就是你在网上不管是查阅资料也好还是做什么,你会发现其实很多人写的反爬一类的都只给你看结果,你根本不知道这个突破过程是怎么样的,哪怕获取到了代码又有何用;下次再给你一道题你同样还是不会。你品,你细品......
我觉得做任何事情一定有在短期内简单可行的方法。学习不应该是苦差事,而应该是快乐的,重要的是找到适合自己的学习方法
d1d05bed36bc39187cc460be81df6d76.png

实战

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

aac72d25bb567ddbb0dd023687664449.png

136f11eb369e2316b1fa04dc997d525e.png

d1d05bed36bc39187cc460be81df6d76.png

分析网页结构

4b2e6e9059b43b53fc2dbb6212f803dd.png

通过鼠标选择器;选中文本之后在右侧的元素面板中可以看到数据是包含在p标签中的,我在想是否能够通过re正则表达式直接获取对应的text文本。~~~哈哈,想简单了 因为在仔细对比之后发现,class所对应的属性是不规则的。

就算将文本获取下来了,文字也是那种七拼八凑没有排好版的;这样的文章要来也没有任何用呀;所以继续分析呗......

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

4663945365c012e74cf1de4ef1ceca13.png

be52dde1a9b253dbde9f2e73d3819849.png

经过一番查找;发现这个VIP文库好像是通过js文件然后生成了属于自己独有的api地址 ?

在不确定对不对的情况下,也没有其他数据验证的情况下;先解析排序一番 看是否能够拿到数据。

d1d05bed36bc39187cc460be81df6d76.png

代码演示

3d05ed2bc16c752c0a9433d86e5d6aea.gif

第一步 请求网络链接获取网络返回的数据

3d05ed2bc16c752c0a9433d86e5d6aea.gif

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)

87836bcdb02cd923d01bcdb8c06971dd.png

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

b5768d5016b12c63808b693dceb4d775.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:[]}'

3d05ed2bc16c752c0a9433d86e5d6aea.gif

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

3d05ed2bc16c752c0a9433d86e5d6aea.gif

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

681a3631519df1f92fa014986c5c1302.png

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

8600b7063ad36a49b5b6a85c64d963db.png

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

daf3af1ee215bdb870b97a3c20ac2a81.png

再解析一下;此时我们已经通过正则表达式取得该文章的地址了,这些地址不止一个;接下来让我们把代码先完善一下

67cccbfe41d06d2ddff3aefb09de8eb4.png

注意:因为每个文章的类型是不同的;看下图;所以这里只做了doc格式的解析,其他的思路都差不多,有心的同学可以参照着我这种方案自己动手试一下。

0297781aa0dea37446704e7141563f3c.png

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

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

52f78d572e36712663725740c0b99e62.png

经过解析之后;这样看起来就清晰了很多;大家看下图的左边?~ 然后再看右边?解析整理之后的

72e8c04b9f7abd128add91c339043a92.png

不过看到这个数据集有些脑袋懵懵的,头皮发麻有没有;经过一番摸索之后;给大家整理一下结论。

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

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

1040d1b013b669a469a2352095013d3c.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

8ab8370d77c1420cf3705e14da938aa4.png

4e1318240c148853920147680d425e5c.png

3d05ed2bc16c752c0a9433d86e5d6aea.gif

第三步 保存数据

3d05ed2bc16c752c0a9433d86e5d6aea.gif

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

if __name__ == "__main__":
    main()

e4164337c3f87989471d001a886b7aa8.png

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

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

6c92651e99bee11f05f07d0414070bdc.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值