设为首页收藏本站
查看: 1248|回复: 7

python 解析爬取某度文库

[复制链接]
  • TA的每日心情
    擦汗
    2017-9-10 12:02
  • 签到天数: 110 天

    [LV.6]常住居民II

    发表于 2019-8-25 17:57:41 来自手机 | 显示全部楼层 |阅读模式
    用了一天研究了下某度文库爬取, 原理是 利用浏览器 切换成手机版找规律(存放在webapp...的url里想研究的可以去看看),主要是翻页 比较复杂
       目前还不完善 能解析大部分 某度文库 的文档 和图片(有图片的就下载)
    文档保存为word 格式 暂时还不会把图片放进word 先放在文件夹        运行后直接 粘贴 需要下载的网页
    # -*- 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个小时之内,从您的电脑或手机中彻底删除上述内容,问一下修改名称找谁知道的回复一下
  • TA的每日心情
    慵懒
    2019-9-9 17:35
  • 签到天数: 37 天

    [LV.5]常住居民I

    发表于 2019-8-25 18:23:45 | 显示全部楼层
    谢谢分享,一起进步
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 12:08
  • 签到天数: 130 天

    [LV.7]常住居民III

    发表于 2019-8-25 18:55:16 来自手机 | 显示全部楼层
    还可以,谢谢分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-29 16:52
  • 签到天数: 437 天

    [LV.9]以坛为家II

    发表于 2019-8-26 09:02:53 | 显示全部楼层 赞助商
                                                                                                                                 厉害呀。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    前天 10:41
  • 签到天数: 181 天

    [LV.7]常住居民III

    发表于 2019-8-30 01:11:51 | 显示全部楼层
    大佬厉害厉害 接着学习去了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-11-27 18:02
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2019-8-30 02:44:39 | 显示全部楼层
    谢谢楼主分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-7 20:54
  • 签到天数: 73 天

    [LV.6]常住居民II

    发表于 2019-11-2 18:01:29 | 显示全部楼层

    谢谢楼主分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐 上一条 /1 下一条

    红盟社区--中国红客联盟 

    Processed in 0.091498 second(s), 20 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    Powered by HUC © 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

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