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也不容易。
我这要赶紧联系小屌丝,这会菜别凉了~
小鱼:小屌丝,文档我弄好了,你的饭桌定好没,菜上齐没,妹子到位没?
小屌丝:你先发给我看看。
小鱼:…
有的时候,一句话就能让友谊的小船倾斜…
也有的时候,一顿烧烤,能让沉底的轮船浮出水面…
在东北,没有什么事,是一顿烧烤解决不了的,
如果有,那就再加上两个妹子(起酒专用的)。