selenium爬取某网站音频
程序员文章站
2022-05-04 17:16:43
...
最近老妈迷上了喜马拉雅的有声小说,被vip制裁,于是就想搞搞爬虫,喜马搞不了(QAQ),就去制裁盗版网站了(✔),这里记录一下。
盗版网站不稳定,代码需要根据网站的特性写
from selenium import webdriver
import requests
import time
import re
# 这里就是ua伪装头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,"
" like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
# 正则的查找通配符
regax =r'controlslist="nodownload" οncοntextmenu="return false" id="player" src="(.*?)"'
# 定义使用Chrome浏览器
driver = webdriver.Chrome()
# 隐式时间,就是给它下面的页面定义一个超时时间,如果加载超过这个时间才会报错
driver.implicitly_wait(10)
# 定义鼠标滚轮的下滑js,就是当前页下滑的js,下面对界面操作的时候会用到
jsD = "scrollTo(0,500)"
# 定义鼠标滚轮的上滑js
jsU = "scrollTo(0,-400)"
# 制裁的网站地址,这里是总集界面的网址
url = "https://XXXXX.com/book/xxxx"
# 打开网址
driver.get(url=url)
# 定义要下载的章节,65集到367集
for i in range(65, 367):
# 打印当前网址
print(driver.current_url)
# 这里是目标章节的element的Xpath路径,这里目的是模拟鼠标点击进入目标章节的事件
driver.find_element_by_xpath(f'/html/body/div[1]/section/div[4]/div/a[{i}]').click()
# 强制延时事件1秒
time.sleep(1)
# 转换窗口句柄,这里是进入了点击后的窗口
driver.switch_to.window(driver.window_handles[-1])
# 这里是设置第一次进入的时候要刷新一下
if i == 65:
time.sleep(1)
driver.refresh()
# 打印进入后的地址
print(driver.current_url)
# 这里没办法(菜),这个网站不能太快访问下一集,否侧会让你1小时后再访问,所以让它停在这儿两分钟。
time.sleep(120)
# 获取当前页面的全部的element源码
res = driver.page_source
# 利用正则匹配处生成的音频源文件的url,这个不好找!
url_list = re.findall(regax, res)
url = url_list[0]
print(url)
# 这里是如果存在音频url,则下载到当前录
if url:
respose = requests.get(url=url, headers=headers)
with open(f"{i}.mp3", mode="wb") as f:
f.write(respose.content)
# 返回上一页
driver.back()
# 换为当前窗口的句柄
driver.switch_to.window(driver.window_handles[-1])
driver.refresh()
# 上下滚动一下界面
time.sleep(1)
driver.execute_script(jsD)
time.sleep(1)
driver.execute_script(jsU)
time.sleep(1)
driver.execute_script(jsD)
time.sleep(1)
# 完成关闭
driver.quit()