用 Python 爬取 QQ 空间说说和相册

关注+星标,每天学习Python新技能

在这里插入图片描述

QQ 空间在 2005 年被腾讯开发,已经经历了 15 个年头,在还没有微信的年代,看网友发表的心情、心事、照片大多都在 QQ 空间的里。它承载了80、90 后的大量青春,下面我们一起用 selenium 模块导出说说和相册回忆青春吧

安装 selenium

selenium 是一个在浏览器中运行,以模拟用户操作浏览器的方式获取网页源码,使用 pip 安装 selenium 模块

pip install selenium  

查看 chrome 浏览器版本并下载 对应的 chrome 浏览器驱动

http://npm.taobao.org/mirrors/chromedriver 网址中找到相同版本的 chrome 驱动,并放在 python 程序运行的同一个文件夹中

登陆

按 F12 检擦网页源代码,找到登录和密码的文本框,如下图所示

def login(login_qq,password, business_qq):  
    '''  
    登陆  
    :param login_qq: 登陆用的QQ  
    :param password: 登陆的QQ密码  
    :param business_qq: 业务QQ  
    :return: driver  
    '''  
    driver = webdriver.Chrome()  
  
    driver.get('https://user.qzone.qq.com/{}/311'.format(business_qq))  # URL  
    driver.implicitly_wait(10)  # 隐示等待,为了等待充分加载好网址  
    driver.find_element_by_id('login_div')  
    driver.switch_to.frame('login_frame')  # 切到输入账号密码的frame  
    driver.find_element_by_id('switcher_plogin').click()  ##点击‘账号密码登录’  
    driver.find_element_by_id('u').clear()  ##清空账号栏  
    driver.find_element_by_id('u').send_keys(login_qq)  # 输入账号  
    driver.find_element_by_id('p').clear()  # 清空密码栏  
    driver.find_element_by_id('p').send_keys(password)  # 输入密码  
    driver.find_element_by_id('login_button').click()  # 点击‘登录’  
    driver.switch_to.default_content()  
  
    driver.implicitly_wait(10)  
    time.sleep(5)  
  
    try:  
        driver.find_element_by_id('QM_OwnerInfo_Icon')  
        return driver  
    except:  
        print('不能访问' + business_qq)  
        return None  

说说

登录 QQ 后默认的页面就在说说的界面,显示一页的说说是滚动加载的,必须要多次下拉滚动条后才能获取到该页所有的说说,然后用 BeautifulSoup 模块构建对象解析页面,下图是放说说的 iframe

def get_shuoshuo(driver):  
      
    page = 1  
    while True:  
        # 下拉滚动条  
        for j in range(1, 5):  
            driver.execute_script("window.scrollBy(0,5000)")  
            time.sleep(2)  
  
        # 切换 frame  
        driver.switch_to.frame('app_canvas_frame')  
        # 构建 BeautifulSoup 对象  
        bs = BeautifulSoup(driver.page_source.encode('GBK', 'ignore').decode('gbk'))  
        # 找到页面上的所有说说  
        pres = bs.find_all('pre', class_='content')  
  
        for pre in pres:  
            shuoshuo = pre.text  
            tx = pre.parent.parent.find('a', class_="c_tx c_tx3 goDetail")['title']  
            print(tx + ":" + shuoshuo)  
  
        # 页数判断  
        page = page + 1  
        maxPage = bs.find('a', title='末页').text  
  
        if int(maxPage) < page:  
            break  
  
        driver.find_element_by_link_text(u'下一页').click()  
        # 回到主文档  
        driver.switch_to.default_content()  
        # 等待页面加载  
        time.sleep(3)  

相册

下载相册里面的照片需要 selenium 模块模拟鼠标一步步点击页面,先点击上方的相册按钮,进去就是多个相册的列表,下图是单个相册的超链接

在单个相册中点击照片,界面如下图

def get_photo(driver):  
      
    # 照片下载路径  
    photo_path = "C:/Users/xxx/Desktop/photo/{}/{}.jpg"  
      
    # 相册索引  
    photoIndex = 1  
  
    while True:  
        # 回到主文档  
        driver.switch_to.default_content()  
        # driver.switch_to.parent_frame()  
        # 点击头部的相册按钮  
        driver.find_element_by_xpath('//*[@id="menuContainer"]/div/ul/li[3]/a').click()  
        #等待加载  
        driver.implicitly_wait(10)  
        time.sleep(3)  
        # 切换 frame  
        driver.switch_to.frame('app_canvas_frame')  
        # 各个相册的超链接  
        a = driver.find_elements_by_class_name('album-cover')  
        # 单个相册  
        a[photoIndex].click()  
  
        driver.implicitly_wait(10)  
        time.sleep(3)  
        # 相册的第一张图  
        p = driver.find_elements_by_class_name('item-cover')[0]  
        p.click()  
        time.sleep(3)  
  
        # 相册大图在父frame,切换到父frame  
        driver.switch_to.parent_frame()  
        # 循环相册中的照片  
        while True:  
            # 照片url地址和名称  
            img = driver.find_element_by_id('js-img-disp')  
            src = img.get_attribute('src').replace('&t=5', '')  
            name = driver.find_element_by_id("js-photo-name").text  
  
            # 下载  
            urlretrieve(src, photo_path.format(qq, name))  
  
            # 取下面的 当前照片张数/总照片数量  
            counts = driver.find_element_by_xpath('//*[@id="js-ctn-infoBar"]/div/div[1]/span').text  
  
            counts = counts.split('/')  
            # 最后一张的时候退出照片浏览  
            if int(counts[0]) == int(counts[1]):  
                # 右上角的 X 按钮  
                driver.find_element_by_xpath('//*[@id="js-viewer-main"]/div[1]/a').click()  
                break  
            # 点击 下一张,网页加载慢,所以10次加载  
            for i in (1, 10):  
                if driver.find_element_by_id('js-btn-nextPhoto'):  
                    n = driver.find_element_by_id('js-btn-nextPhoto')  
                    ActionChains(driver).click(n).perform()  
                    break  
                else:  
                    time.sleep(5)  
  
        # 相册数量比较,是否下载了全部的相册  
        photoIndex = photoIndex + 1  
        if len(a) <= photoIndex:  
            break  
  

示例结果

总结

大家在看十几年前的说说和照片是不是感觉满满的黑历史快要溢出屏幕了。时光荏苒、岁月如梭,愿一切安好。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

整理出了一套系统的学习路线,这套资料涵盖了诸多学习内容:开发工具,基础视频教程,项目实战源码,51本电子书籍,100道练习题等。相信可以帮助大家在最短的时间内,能达到事半功倍效果,用来复习也是非常不错的。

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

👉Python学习视频合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

👉100道Python练习题👈

检查学习结果。

👉面试刷题👈

资料获取方式:↓↓↓↓
在这里插入图片描述

这份完整版的Python全套学习资料已经打包好了,朋友们如果需要可以微信添加文末 Python笔记领取即可获取二维码免费获取

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值