美文网首页Python精选
Python3 爬取百度文库VIP文章

Python3 爬取百度文库VIP文章

作者: 獨荹儛臨 | 来源:发表于2019-05-15 16:11 被阅读1次
    南昌航空大学.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文章

        本文链接:https://www.haomeiwen.com/subject/iobgyqtx.html