吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 30597|回复: 137
收起左侧

[原创工具] python 解析爬取某度文库

    [复制链接]
17788210295 发表于 2019-8-22 18:08
本帖最后由 17788210295 于 2019-8-30 20:11 编辑

用了一天研究了下某度文库爬取, 原理是 利用浏览器 切换成手机版找规律(存放在webapp...的url里想研究的可以去看看),主要是翻页 比较复杂
   目前还不完善 能解析大部分 某度文库 的文档 和图片(有图片的就下载)
文档保存为word 格式 暂时还不会把图片放进word 先放在文件夹        运行后直接 粘贴 需要下载的网页   欢迎留言哦  
更新了下复制代码出错问题
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
#*** 吾爱 17788210295
import requests
import re
from json import loads
import os
from tqdm import tqdm
class Baidu(object):
    def __init__(self):

        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Mobile Safari/537.36'
        }
        self.rtcs_flag='1'
        self.rtcs_ver='3.1'
        self.base_url='http://wkrtcs.bdimg.com/rtcs/webapp'
        self.base_img='https://wkrtcs.bdimg.com/rtcs/image'
        self.flag=True
        self.cout=1
    def get_info(self,url):
        try:
            r=requests.get(url,headers=self.headers).content.decode()
        except Exception:
            print('编码错误,切换编码!')
            r = requests.get(url, headers=self.headers).content.decode('gbk')
        self.bucketNum=re.findall('"bucketNum":(\d+),',r)[0]
        self.sign = re.findall('&sign=(.*?)&',r)[0]
        self.rsign=re.findall('"rsign":"(.*?)",',r)[0]
        self.md5sum=re.findall('&md5sum=(.*?)&',r)[0]
        self.page_list=re.findall('"rtcs_range_info":(.*),"rtcs_flow"',r)[0]
        self.page_count=re.findall('"rtcs_page_count":(.*?),',r)[0]
        self.firstpageurl=re.findall('data-firstpageurl="(.*?)"',r)[0].replace('amp;','')
        try:
            self.name=re.findall('<title>(.*?)</title>',r)[0].strip()
        except Exception:
            self.name='百度文库百度文库'
        if not os.path.exists(self.name):
            os.mkdir(self.name)
        self.path=self.name+'/'
    #解析翻页参数
    def parse(self):
        print('页数:',self.page_count)
        page_dics=loads(self.page_list)
        if int(self.page_count)>=4:
            self.get_first()
            pn = 2
            rn = 4
            while True:
                a = ''
                ranges=page_dics[pn-1:pn+rn-1]
                for r in tqdm(ranges):       #进度条
                    a+=r.get('range')+'_' if (r is not ranges[-1]) else r.get('range')
                    try:
                        self.get_pages(pn,rn,a)
                    except Exception:
                        print('解析错误')
                pn = pn + rn
                rn = 5
                if pn >int(self.page_count):
                    break
        else:
            self.get_first()
            a=''
            pn=2
            rn=4
            ranges = page_dics[pn - 1:pn + rn - 1]
            for r in tqdm(ranges):
                a += r.get('range') + '_' if (r is not ranges[-1]) else r.get('range')
            try:
                self.get_pages(pn,rn,a)
            except Exception:
                pass

    #翻页写入文本
    def get_pages(self,pn,rn,ranges):
        dic={
            'bucketNum':self.bucketNum,
            'pn':pn,
            'rn':rn,
            'md5sum':self.md5sum,
            'sign':self.sign,
            'rtcs_flag':self.rtcs_flag,
            'rtcs_ver':self.rtcs_ver,
            'range':ranges,
            'rsign':self.rsign
        }
        page=requests.get(self.base_url,params=dic,headers=self.headers).text[5:-1]
        b=loads(page)
        a = ''
        for i in b['document.xml']:
            for m in i['c']:
                a += '\n'
                for n in m['c']:
                    try:
                        if isinstance(n['c'], str):
                            a += n['c']
                    except Exception:
                        pass
        with open(self.path+self.name+'.doc','a',encoding='utf-8') as f:
            f.write(a)

    # 解析第一页
    def get_first(self):
        print(self.firstpageurl)
        first_page=requests.get(url=self.firstpageurl,headers=self.headers).text[32:-1]
        b = loads(first_page)
        a = ''
        for i in tqdm(b['document.xml']):
            for m in i['c']:
                a += '\n'
                for n in m['c']:
                    try:
                        if isinstance(n['c'], str):
                            a += n['c']
                    except Exception:
                        pass
        with open(self.path+self.name+'.doc', 'a', encoding='utf-8') as f:
            f.write(a)
        print('第一页解析完成!!!')

    #下载图片
    def down_img(self,cout,num):
        data={
            'md5sum':self.md5sum,
            'sign':self.sign,
            'rtcs_ver':'3',
            'bucketNum':self.bucketNum,
            'ipr':'{"c":"word/media/image%s.png"}'%cout
        }

        data=requests.get(url=self.base_img,params=data)
        if data.status_code ==200:
            with open(self.path + str(num) + '.jpg', 'wb+') as f:
                f.write(data.content)
            print(self.name+'下载完成!')
        else:
            couts=str(cout)+'_1'
            print(couts)
            data = {
                'md5sum': self.md5sum,
                'sign': self.sign,
                'rtcs_ver': '3',
                'bucketNum': self.bucketNum,
                'ipr': '{"c":"word/media/image%s.png"}'%couts
            }
            data = requests.get(url=self.base_img, params=data)
            if data.status_code == 200:
                with open(self.path + str(num) + '.jpg', 'wb+') as f:
                    f.write(data.content)
                print(self.name+'下载完成!')
            else:

                self.flag=False


    def run(self,url):
        num=0
        self.get_info(url)
        self.parse()
        print('页面写入完成!!!'+'-'*20+'下载图片>>>>>>')
        while self.flag:
            num += 1
            self.down_img(self.cout,num)
            self.cout+=1



if __name__ == '__main__':
    url=input('请输入网址:')
    b=Baidu()
    b.run(url)



免责声明:仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
Snipaste_2019-08-22_18-07-12.jpg

免费评分

参与人数 26吾爱币 +17 热心值 +24 收起 理由
w1667 + 1 热心回复!
puti67 + 1 + 1 谢谢@Thanks!
tracy_dooou + 1 谢谢@Thanks!
dengyangdong + 1 + 1 热心回复!
无语指南 + 1 + 1 我很赞同!
arui666 + 1 用心讨论,共获提升!
bcleon + 1 我很赞同!希望能有后续改进
宇宙之大 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hiromao2010 + 1 + 1 谢谢
52pj_1401675 + 1 + 1 用心讨论,共获提升!
ghoob321 + 1 + 1 我很赞同!
barry1204 + 1 + 1 谢谢@Thanks!
王图思睿 + 1 谢谢@Thanks!
gison + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
napolenking + 1 谢谢@Thanks!
方言商 + 1 &amp;lt;font style=&amp;quot;vertical-align: inherit;&amp;quot;&amp;gt;&amp;lt;font style=
wfwf215 + 1 + 1 感谢
沈小三333 + 1 我很赞同!
jfy168 + 1 鼓励转贴优秀软件安全工具和文档!
rx_y2000 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
一颗草zZ + 1 + 1 谢谢@Thanks!
ss988 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gggxk2019 + 1 谢谢@Thanks!
luxuriance + 1 + 1 谢谢@Thanks!
pang533026524 + 1 + 1 用心讨论,共获提升!
llyy390 + 1 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lihaisanhui 发表于 2019-8-25 10:17
[Python] 纯文本查看 复制代码
  File "百度文库爬取.py", line 9
        def __init__(self):
          ^
SyntaxError: invalid character in identifier

你这是python2还是3
jinlongpj 发表于 2019-9-13 21:35
lihaisanhui 发表于 2019-8-25 10:17
[mw_shl_code=python,true]  File "百度文库爬取.py", line 9
        def __init__(self):
          ^
...

同样错误,版本3.6
thghx 发表于 2019-8-22 18:19
weidian 发表于 2019-8-22 18:34
爬虫?谢谢分享!
 楼主| 17788210295 发表于 2019-8-22 18:40

你这动图.........
ISHAO 发表于 2019-8-22 18:44
可以,支持一下
追逐太阳 发表于 2019-8-22 18:46
支持一下,但是Python还没学,如果有java版本的就好了
yanmingming 发表于 2019-8-22 19:00

咋的啦? 吓到了啊
yth492300648 发表于 2019-8-22 19:00
这个还行百度文库
头像被屏蔽
笑傲江湖1001 发表于 2019-8-22 22:56
提示: 作者被禁止或删除 内容自动屏蔽
sky4639 发表于 2019-8-23 07:42
代码怎么用啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表