Python3 爬取百度文库VIP文章

南昌航空大学.jpg

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

其实也没什么难的, 就是里面正则表达式需要自己去理解。iOS项目里面一般只是在验证手机号、判断网页Url的时候会用一下正则表达式,刚好也是技能学习,多了解一点总更好。

单独讲一下这个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 os

session = 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 result

def parse_txt(doc_id):
    pass

def 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)

    pass

if __name__ == '__main__':


    main()

结果


image.png

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

你可能感兴趣的:(Python3 爬取百度文库VIP文章)