baidu文库爪巴虫——doc

tech2022-07-16  165

找到感兴趣的文档却发现需要 vip 才能下载?

分析

打开源代码一看,发现根本没有文档数据,只能从中依稀辨认出需要加载新的页面 把其中的pageData这个js变量用在线json查看器打开: 关键信息在 readerinfo2019 里的 htmlUrls 中 pageLoadUrl 才是关心的页面

{\"pageIndex\":1,\"pageLoadUrl\":\"https:\\/\\/wkbjcloudbos.bdimg.com\\/v1\\/docconvert4554\\/wk\\/c128de0c63d569c35486f68dc62658ce\\/0.json?responseContentType=application%2Fjavascript&responseCacheControl=max-age%3D3888000&responseExpires=Sat%2C%2017%20Oct%202020%2022%3A04%3A58%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-09-02T14%3A04%3A58Z%2F3600%2Fhost%2F1e3fd073d2f7c35eeb50cceae8db404dba76b95e906ec07e51de6dd7145c20ac&x-bce-range=0-44591&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU5OTA1OTA5OCwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDb250ZW50VHlwZSIsInJlc3BvbnNlQ2FjaGVDb250cm9sIiwicmVzcG9uc2VFeHBpcmVzIiwieC1iY2UtcmFuZ2UiXX0%3D.7o1zKe5PxIAGP3BjytIwT6rZMNpGl8g%2Fsc4MvtsE%2F9o%3D.1599059098\"}

用 sublime 或者 正则表达式把其中的转义符去掉 replace('\\\\/', '/') 得到一个可访问的连接,点开看一看

https://wkbjcloudbos.bdimg.com/v1/docconvert4554/wk/c128de0c63d569c35486f68dc62658ce/0.json?responseContentType=application%2Fjavascript&responseCacheControl=max-age%3D3888000&responseExpires=Sat%2C%2017%20Oct%202020%2022%3A04%3A58%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-09-02T14%3A04%3A58Z%2F3600%2Fhost%2F1e3fd073d2f7c35eeb50cceae8db404dba76b95e906ec07e51de6dd7145c20ac&x-bce-range=0-44591&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU5OTA1OTA5OCwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDb250ZW50VHlwZSIsInJlc3BvbnNlQ2FjaGVDb250cm9sIiwicmVzcG9uc2VFeHBpcmVzIiwieC1iY2UtcmFuZ2UiXX0%3D.7o1zKe5PxIAGP3BjytIwT6rZMNpGl8g%2Fsc4MvtsE%2F9o%3D.1599059098

又一个 json 文件,但很明显里面是有文字的:比如 \u827a\u672f\u4e4b\u4e00\u3002 拿去 解析以下,https://www.bejson.com/explore/index_new/,这工具在格式化输出 json 的同时,顺带把汉字翻译了一下 从字面上很好理解,c 表示文字,h、w、x、y分别表示文字的高、宽、水平位置、竖直位置, 我们需要的只有 c 和 y,当 y 发生变化时,对文字换行即可!

代码

知道了上面的思路,代码其实很短的

import requests import re url = 'https://wenku.baidu.com/view/b089d412f705cc1754270940.html?fr=search' html = requests.get(url).text js = re.findall(r'"pageLoadUrl.*?(https.*?0.json.*?)\\', html) hjs = [item.replace('\\\\/', '/') for item in js] for i in hjs: new_html = requests.get(i).text y=0 result='' txtlist=re.findall('"c":"(.*?)".*?"y":(.*?),',new_html) for item in txtlist: if not y==item[1]: y=item[1] result += '\n' result+=item[0].encode('utf-8').decode('unicode_escape','ignore') print(result)
最新回复(0)