Python3|Python3 爬取百度文库VIP文章

Python3|Python3 爬取百度文库VIP文章
文章图片
南昌航空大学.jpg
记得之前写毕业论文的时候总是会去看百度文库,里面还是有很多知识点值得我们去学习借鉴的。今天刚好项目没什么事、就去网上看了下别人怎么爬取的。自己再整理一下。发给大家一起借鉴

其实也没什么难的, 就是里面正则表达式需要自己去理解。iOS项目里面一般只是在验证手机号、判断网页Url的时候会用一下正则表达式,刚好也是技能学习,多了解一点总更好。
【Python3|Python3 爬取百度文库VIP文章】单独讲一下这个Demo里面的正则吧,具体的我还不是很了解,我也没深入研究这个东西
1、result返回的是括号里面的内容, 那么.*表示的应该是里面的一个任意长度的字符 直到.html停止 2、findAll 返回的是一个数组,所以这里我们拿的是[0] 数组里面的第一个元素 3、假设 url= 'hhwerwerwerview/42342341wr.html' 那么result= 42342341wr result = re.findall('view/(.*).html', url)[0]

1、查找起始是title .*? 的意思是中间是任意长度的字符除换行符,\: 匹配的是\好像所有的标点符号都用了反斜杠 2、结果是返回括号里面的值 3、假设 url = 'title3423qw:qwwer'1231434'那么result= 1231434 result = re.findall(r"title.*?\:.*?\'(.*?)\'\,", content)[0]

1、这里面我也不是很懂 意思就是你需要匹配的字符串里面出现反斜杠的话\,需要用四个反斜杠 3、假设 url = 'https://14234235346456.html\x22'那么result= https://14234235346456.html url_list = re.findall('(https.*?0.json.*?)\\\\x22}', content)

import requests import re import json import ossession = requests.session()def fetch_url(url):return session.get(url=url).content.decode('gbk') def get_doc_id(url): return re.findall('view/(.*).html', url)[0] def parse_type(content): return re.findall(r"docType.*?\:.*?\'(.*?)\'\,", content)[0] def parse_title(content): return re.findall(r"title.*?\:.*?\'(.*?)\'\,", content)[0]def parse_doc(content): result = '' url_list = re.findall('(https.*?0.json.*?)\\\\x22}', content)# 匹配\需要\\\\ # https:\\\/\\\/wkbjcloudbos.bdimg.com\\\/v1\\\/docconvert4844\\\/\\\/wk\\\/7210afedd7358a5 # bd48649cf6dad0de5\\\/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Sat%2C # %2029%20Jun%202019%2014%3A56%3A28%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa # 7cc85045ce7179e%2F2019-05-15T06%3A56%3A28Z%2F3600%2Fhost%2Fddebf898b7d5f21bffa6b06bbfc684 # 1d2f89f574e32a5fa4edee8ffbff44e057&x-bce-range=0-16174&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIx # LjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU1NzkwNjk4OCwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDY # WNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.bDk2fN4WA%2BfOAHAWSeT # UvfSu4xHnyKVQJ9LzqgqiOEg%3D.1557906988 url_list = [addr.replace("\\\\\\/", "/") for addr in url_list]# 将 url上的\\\转换成\ for url in url_list: content = fetch_url(url) y = 0 txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', content) for txt in txtlists:if not y == txt[1]: n = '\n' else: n = '' result += n result += txt[0].encode('utf-8').decode('unicode_escape', 'ignore') y = txt[1] return resultdef parse_txt(doc_id): passdef save_file(filename, content):with open(filename, 'w', encoding='utf8') as f: f.write(content) print('已保存为:'+ filename) def main():# input(str('请输入要下载的文库URL....\n')) url = 'https://wenku.baidu.com/view/aa31a84bcf84b9d528ea7a2c.html' content = fetch_url(url) doc_id = get_doc_id(url) type = parse_type(content) title = parse_title(content) if type == 'doc': result = parse_doc(content) save_file(title+'.txt', result)passif __name__ == '__main__':main()

结果

image.png 好了、也没什么别的了。逻辑上来说的话就是简单。难的就是刚入门的人来说,不了解每个函数的作用,带参问题。 还有一个难点,就是在解析网页的时候需要知道怎么解析得到你想要的数据

    推荐阅读