Python3,selenium动态下载某库PPT文档,省下的钱可以撸串了!!!

2023-11-16

1、引言

小鱼:你看啥嘞,把显示屏亮度调的这么暗???
小屌丝:这… 没有你想的那样,我这是再学习算法知识呢。
小鱼:你不学习算命了,改行学习算法了?
小屌丝:正儿八经的,能不能帮我把这个文档给down下来(露出猥琐的表情…)
小鱼:这个…理论上是不行的,因为我们要尊重对方嘛。
小屌丝:你要是把文档给弄到本地,我请你撸串。
小鱼:我这么注重养生的人,不撸串。
小屌丝:我再叫上几个妹子。
小鱼:额…几个??
小屌丝:四个
小鱼:网址…订桌…约妹…半小时后见!!
在这里插入图片描述

2、代码实战

2.1 思路分析

我们先来看一下小屌丝想下载的文档。

要想下载,就得是会员,否则,
像小屌丝这种人,怎么可能把钱充到这里面。

据说小屌丝的车是 凯迪拉克,大家脑补一下。

如果非会员下载文档,那就要想想办法了。
例如:嗯…大家都懂得。
所以接下来, 就跟着小鱼一起,看看怎么拿下这个文档。

我们按照以下几步来思考:

  • 爬取前的准备:用到的库
  • 页面的分析:页面展示与定位
  • 实现方式:渲染方式,爬取方式,保存到本地

整理好了思路,就开始弄。

2.2 页面分析

我们先打开开发者模式,看看展示的内容
在这里插入图片描述

我们可以看到,PPT是以图片形式显示,并且图片的url地址已经显示在页面中,并且存储在前端中的格式一样(我就截一个图,剩下的自己看),非常的nice。

2.3 代码展示

又到了激动人心的时刻,上代码。

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-08-31
"""

from selenium import webdriver
import requests
from lxml import etree
import time

def spid_view():
    #不开启浏览器运行脚本
    # options = webdriver.ChromeOptions()
    # options.add_argument('headless')
    # driver = webdriver.Chrome(options = options)
	
	#启动浏览器运行脚本
    driver = webdriver.Chrome()

    #设置url地址
    url_wenku = "https://wenku.baidu.com/view/xxxxx"
    driver.get(url=url_wenku)

    #设置header头,
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}

    #手动点击加载更多页面
    input("阻塞,手动点击加载更多的页面")
    selection = etree.HTML(driver.page_source)

    #手动模拟滑动
    for i in range (1,30):
        # javascript语句,会写WebUI自动化的,都了解这个用法
        js = "var q=document.documentElement.scrollTop={}".format(i * 535)
        driver.execute_script(js)
        #这里强制等待3秒
        time.sleep(3)

    #图片与url匹配
    empty_list = []
    #xpath方式定位
    all_ppt_div = selection.xpath("//div[@class='ppt-image-wrap']/img/@src")

    #做循环获取
    for j in all_ppt_div:
        empty_list.append(j)

    time.sleep(3)
    #如果页面多一层标签,那么就需要使用这个for循环
    # selection = etree.HTML(driver.page_source)
    #第4页到最后一页,都是隐藏页面,
    # for i in range(4,33):
    #     all_ppt_div = selection.xpath("//div[@class='ppt-page-item reader-pageNo-%s ppt-bd hidden-doc-banner']/div/img/@src"%str(i))
    #     try:
    #         empty_list.append(all_ppt_div[0])
    #     except Exception as e:
    #         print(e)
    #         break

    #文件存储
    count = 1
    empty_list = list(set(empty_list))
    for i in empty_list:
        r = requests.get(str(i))
        with open("%s.jpg" %str(count),'wb') as f :
            f.write(r.content)
            count += 1

    #关闭浏览器
    driver.quit()


if __name__ == '__main__':
    spid_view()

2.4 代码解析

启动浏览器

#不开启浏览器运行脚本
    # options = webdriver.ChromeOptions()
    # options.add_argument('headless')
    # driver = webdriver.Chrome(options = options)

    #启动浏览器运行脚本
    driver = webdriver.Chrome()

    #设置url地址
    url_wenku = "https://wenku.baidu.com/view/xxxx"
    driver.get(url=url_wenku)

这里代码,

  • 不启动浏览器执行脚本(小鱼强烈推荐,节约资源)
    ->这里的不启动是指浏览器在后台运行
  • 启动浏览器就是跟我们打开浏览器一样

模拟滑动

    #手动模拟滑动
    for i in range (1,33):
        # javascript语句,会写WebUI自动化的,都了解这个用法
        js = "var q=document.documentElement.scrollTop={}".format(i * 535)
        driver.execute_script(js)
        #这里强制等待3秒
        time.sleep(3)

这段代码,

  • range()的 30是剩余30页没有展示的,也就是"阅读更多"后展示的剩余页数
  • 535 这没有特别的意思,就是535在range()函数使用 每次可以加载两个页面。

图片url匹配

#图片与url匹配
    empty_list = []
    #xpath方式定位
    all_ppt_div = selection.xpath("//div[@class='ppt-image-wrap']/img/@src")

    #做循环获取
    for j in all_ppt_div:
        empty_list.append(j)

    time.sleep(3)
    #如果页面多一层标签,那么就需要使用这个for循环
    # selection = etree.HTML(driver.page_source)
    
    #第4页到最后一页,都是隐藏页面,
    # for i in range(4,33):
    #     all_ppt_div = selection.xpath("//div[@class='ppt-page-item reader-pageNo-%s ppt-bd hidden-doc-banner']/div/img/@src"%str(i))
    #     try:
    #         empty_list.append(all_ppt_div[0])
    #     except Exception as e:
    #         print(e)
    #         break

这段代码,

  • 这里用到的是xpath方法匹配;
  • 定义一个空列表,把图片写入到列表中;
  • 第二个for循环,针对隐藏的页面,也就是多一层标签而设定的;

图片存储

    #文件存储
    count = 1
    empty_list = list(set(empty_list))
    for i in empty_list:
        r = requests.get(str(i))
        with open("%s.jpg" %str(count),'wb') as f :
            f.write(r.content)
            count += 1

这段代码,就是把文件存入到本地,
这里的content就是文件的二进制形式。

3、总结

看到这里,今天的分享又快结束了。
这个框架,适用于90%的场景,剩下的10%,就是要特定喽。
但是,小鱼也是提醒一下,虽然适用,但切勿商用,毕竟baidu也不容易。
我这要赶紧联系小屌丝,这会菜别凉了~

小鱼:小屌丝,文档我弄好了,你的饭桌定好没,菜上齐没,妹子到位没?
小屌丝:你先发给我看看。
小鱼:…

有的时候,一句话就能让友谊的小船倾斜…
也有的时候,一顿烧烤,能让沉底的轮船浮出水面…

在东北,没有什么事,是一顿烧烤解决不了的,
如果有,那就再加上两个妹子(起酒专用的)。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3,selenium动态下载某库PPT文档,省下的钱可以撸串了!!! 的相关文章

随机推荐