javascript
js input复选框选中父级同时子级也选中_突破百度JS反爬获取百度文库数据下载...
畢業,是一首離別的歌
前言
炎炎夏季,又快到了我們該說畢業的時候。都說分開是為了更好的相聚,讓我們彼此珍惜!
在這個炎熱的空檔期,對于技術渴望的宅男腐女們我們該做點什么呢?那最好的方式就是用編程來填補我們內心的空虛。
編程難不難?那可不是鬧著玩的。不從事這一行的永遠不知道這行的艱辛。
俗話說的好;爬蟲在手天下我有,自從學習了爬蟲;看到什么都想盤它一番直到遇到JS反爬
不知大家有沒有遇到過這種情況;就是你在網上不管是查閱資料也好還是做什么,你會發現其實很多人寫的反爬一類的都只給你看結果,你根本不知道這個突破過程是怎么樣的,哪怕獲取到了代碼又有何用;下次再給你一道題你同樣還是不會。你品,你細品......
我覺得做任何事情一定有在短期內簡單可行的方法。學習不應該是苦差事,而應該是快樂的,重要的是找到適合自己的學習方法
實戰
開始之前咱們先看一下要爬取的數據內容~
分析網頁結構
通過鼠標選擇器;選中文本之后在右側的元素面板中可以看到數據是包含在p標簽中的,我在想是否能夠通過re正則表達式直接獲取對應的text文本。~~~哈哈,想簡單了 因為在仔細對比之后發現,class所對應的屬性是不規則的。
就算將文本獲取下來了,文字也是那種七拼八湊沒有排好版的;這樣的文章要來也沒有任何用呀;所以繼續分析唄......
一般像這種文章一類的;它的api確實很難逆向......自己埋得坑得給填平
經過一番查找;發現這個VIP文庫好像是通過js文件然后生成了屬于自己獨有的api地址 ?
在不確定對不對的情況下,也沒有其他數據驗證的情況下;先解析排序一番 看是否能夠拿到數據。
代碼演示
第一步 請求網絡鏈接獲取網絡返回的數據
import?requestsimport?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)
我們在獲取到該文章的url之后,查看該url對應的網頁數據時,在這個網頁數據中發現它同時蘊含著真正文章的地址
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:[]}'
第二步 正則表達式解析數據
def?get_content_type(content):????print(re.findall(r"docType.*?\:.*?\'(.*?)\'\,",?content))
是不是沒有任何發現;腦子有點懵~ 慢慢來!我已經標注出來了。既然我們發現了這個數據集,那么接下來嘗試著解析一下唄;看看隱藏這么深的究竟是何方神圣。
根據上面獲取到的數據集經過再一次的解析;我們得到了一個鏈接;好像~貌似看到希望了呀哈哈~
再解析一下;此時我們已經通過正則表達式取得該文章的地址了,這些地址不止一個;接下來讓我們把代碼先完善一下
注意:因為每個文章的類型是不同的;看下圖;所以這里只做了doc格式的解析,其他的思路都差不多,有心的同學可以參照著我這種方案自己動手試一下。
def?get_content_type(content):????return?re.findall(r"docType.*?\:.*?\'(.*?)\'\,",?content)[0]
使用文章的地址再次向服務器發送請求時,獲取到的文章數據,但是此時的數據還并不是文章的內容,而是一個json結構的數據集,這里大家看起來可能有點懵逼,我們稍微給他處理一下
經過解析之后;這樣看起來就清晰了很多;大家看下圖的左邊?~ 然后再看右邊?解析整理之后的
不過看到這個數據集有些腦袋懵懵的,頭皮發麻有沒有;經過一番摸索之后;給大家整理一下結論。
這個數據集是基于百度文庫自己的閱讀器生成的,里面包含了非常多的信息,我們需要的文章內容就在其中,只不過它是以五維的位置參數,來標明內容出現的位置。
比如下面這樣,內容就是 c 這一串的Unicode編碼,p 就是其位置參數,什么高啊寬啊等
有種無從下手的感覺;經過一番實驗;這里我們可以根據 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
第三步 保存數據
def?save_file(filename,?content):????with?open(filename,?'w',?encoding='utf-8')?as?f:
????????f.write(content)
????????print('已保存為:'?+?filename)
if?__name__?==?"__main__":
????main()
在這個浮躁的時代;竟然還有人能堅持篇篇原
如果本文對你學習有所幫助-可以點贊?+ 關注!將持續更新更多新的文章
支持原創。感謝!
總結
以上是生活随笔為你收集整理的js input复选框选中父级同时子级也选中_突破百度JS反爬获取百度文库数据下载...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp 使用base标签 没有作用_JS
- 下一篇: map for循环_如何用Map、Fil