[已失效]寻回贴吧失踪的老帖子

由于百度已然关闭wap访问,2017年前旧帖彻底不可见,逝去的宝贵帖子难以挽回,就让往事随风吧。百度贴吧,再见。本贴以下内容已过时作废,未完成也再难有机会完成。


近日,百度贴吧宣布历史旧帖开启维护服务 2017年前的旧帖均无法查看。目前尚未明确何时可以恢复访问,也不知道届时有多少帖子幸存。

但是目前还有一种办法仍可以访问这些被百度藏起来的旧帖子,那就是wap访问方式,或许是该服务太古老了以至于被百度忘记。

通过wap访问帖子只要将贴子url中的二级域名tieba改为wapp即可。实际链接则是http://tieba.baidu.com/mo/q—EEEC69D7357100C0D6CBB611B62E45F2%3AFG%3D1–1-1-0–2–wapp_1557808916909_718/m?kz= 后加上帖子的kz值。

//例如
原url: https://tieba.baidu.com/p/3145679961
wap入口url:https://wapp.baidu.com/p/3145679961
重定向url:http://tieba.baidu.com/mo/q---EEEC69D7357100C0D6CBB611B62E45F2%3AFG%3D1--1-1-0--2--wapp_1557808916909_718/m?kz=3145679961

当然,存在贴吧的帖子实在太不稳定了,动不动误删隐藏也就算了,这次是大面积关闭旧帖,指不定什么时候就全部消失了,贴吧本身也不提供内容备份,因此,通过爬虫把内容爬下来存在最近电脑上才是最稳的。

简单赶出来一个demo,勉强能用,爬下来一个466页的帖子,接下来会继续完善。

  • 未完成
    • get_title函数(目前是写死的,要手动输入title)
    • 网络io容错(被拒绝访问后目前只能手动改page和启动页面来重启)
    • 命令行参数解析(通过命令行传入帖子url及其他参数)
    • 备份网页的css美化样式以及阅读页面(通过iframe显示并js换页)
    • 多线程(并发加速)
    • 代理池(配合多线程防止封ip)
    • 图形界面(成品本该易用,qt5)

最近没什么时间了,代码写的太渣我藏起来了,下次有空再完善一下。

#python 3.6.0
import requests
from bs4 import BeautifulSoup
import os,time,re,sys

global DIR_ROOT
DIR_ROOT="saves"

url=r'https://tieba.baidu.com/mo/q---EEEC69D7357100C0D6CBB611B62E45F2%3AFG%3D1--1-3-0--2--wapp_1557808916909_718/m?kz=3145679961&see_lz=1'

def get(url):
    UA = r"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
    RF = url
    headers = {'User-Agent':UA,'Referer':RF}
    print('获取页面: '+url)
    code = requests.get(url,headers=headers,verify=False)
    return code

def get_soup(url):
    src = get(url).text
    return BeautifulSoup(src,'lxml')

def get_title(soup):
    title="【直播】mackler的原版生存(单机&服务器)"
    return title

def get_pic_url(url):
    url = url.split('?&src=')
    url = url[-1]
    url = url.replace('%3A','s:').replace('%2F','/')
    return url

def get_pic(url,title):
    global DIR_ROOT
    pic_name=url.split('/')
    pic_name=pic_name[-1]
    path = r'%s\%s\%s\%s'%(DIR_ROOT,title,'picture',pic_name)
    pic = get(url)
    with open(path,'wb') as f:
        f.write(pic.content)
    rpath=r'%s\%s'%('picture',pic_name)
    return rpath

def check_path(title):
    global DIR_ROOT
    html_path = r'%s\%s'%(DIR_ROOT,title)
    pic_path = r'%s\%s\%s'%(DIR_ROOT,title,'picture')
    if not os.path.exists(DIR_ROOT):
        os.makedirs(DIR_ROOT)
    print(DIR_ROOT+' 已存在')
    if not os.path.exists(html_path):
        os.makedirs(html_path)
    print(html_path+' 已存在')
    if not os.path.exists(pic_path):
        os.makedirs(pic_path)
    print(pic_path+' 已存在')
    return True

def pre_work(soup,title):
    imgs = soup.find_all('a',href=re.compile('.*src=http%3A%2F%2Fimgsrc.*'))
    num=1
    for img in imgs:
        img.name="img"
        img['src']=get_pic(get_pic_url(img['href']),title)
        print('预处理图像%s'%num)
        time.sleep(0.3)
        num+=1
    return soup.find_all('div', class_="i")

def every_floor(i):
    return i.prettify()

def get_page(resultset,page,title):
    path = r'%s\%s\page%s.html'%(DIR_ROOT,title,page)
    with open(path,'w',encoding='utf-8') as f:
        num=1
        for i in resultset:
            f.write(every_floor(i))
            f.write('\n')
            print('写入%s层'%num)
            num+=1

def get_next(soup):
    url = soup.find_all('a',accesskey="6")
    if url==[]:
        return False
    else:
        url='https://tieba.baidu.com/mo/q---EEEC69D7357100C0D6CBB611B62E45F2%3AFG%3D1--1-3-0--2--wapp_1557808916909_718/'+url[0]['href']
        return url

def main(url):
    page = 1
    title = get_title(get_soup(url))
    print(title)
    check_path(title)
    while url:
        html_soup=get_soup(url)
        get_page(pre_work(html_soup,title),page,title)
        yield "已保存第%s页"%page
        url = get_next(html_soup)
        page+=1

main = main(url)

while True:
    try:
        print (next(main), end=" ")
        time.sleep(2)
    except StopIteration:
        sys.exit()

发表评论

电子邮件地址不会被公开。 必填项已用*标注