“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
详细内容参见置顶评论
需求分析
今天测试数据用到了 MP4 格式的视频文件,问题来了?从哪里去获取短小又精彩的MP4文件呢,我打开了X光网,从这里找预告片就好了。
打开站点http://地址脱敏处理/,如下图所示,在里面检索带播放图片的内页地址。
寻找分页逻辑
经过反复测试,得到的结论如下
- 页面一次会加载60条数据
- 前台进行的交互分页
- 累计可以获取10页数据
分页地址如下所示
http://地址脱敏处理/index.html
http://地址脱敏处理/index-2.html
http://地址脱敏处理/index-3.html
复制代码
编码时间
对于该类定向爬虫,核心用 requests
模块即可完成全部任务,页面解析使用 lxml
模块。
整体逻辑描述如下
- 第一步:使用目标首页地址解析网页,获取网页源码
- 第二步:从源码中提取包含视频文件的详情页
- 第三步:进入详情页获取视频文件地址
- 第四步:下载视频文件,通过 res.content 获取二进制流
首先拿第一页做一下测试(后续直接扩展到全部页面即可,可预生成)。
import requests
from lxml import etree
import time
def get_html(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
}
res = requests.get(url, headers=headers, timeout=3)
html_data = res.text
bodyelement = etree.HTML(html_data)
org_divs = bodyelement.xpath('//div[@class="news-cont"]')
for div in org_divs:
video_element = div.xpath('.//em[@class="pic-video"]')
if video_element:
link = div.xpath('./a/@href')[0]
print(link)
if __name__ == '__main__':
get_html('http://地址脱敏处理/index.html')
复制代码
上述代码的重点在解析包含 em[@class="pic-video"]
的标签,即通过上图中的播放器图标判断详情页是否包含MP4视频文件。
后续的工作就变得简单了,进入详情页获取视频文件地址,然后下载目标视频文件。
为了便于大家学习,我将所有的代码都单独写成一个个的函数,如下所示(其中重要逻辑已经用注释进行标记):
import requests
from lxml import etree
import time
def get_html(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
}
res = requests.get(url, headers=headers, timeout=3)
html_data = res.text
bodyelement = etree.HTML(html_data)
org_divs = bodyelement.xpath('//div[@class="news-cont"]')
# 获取所有目标 DIV
for div in org_divs:
video_element = div.xpath('.//em[@class="pic-video"]')
# 通过特定标签判定详情页是否包含视频文件
if video_element:
link = div.xpath('./a/@href')[0]
get_video(link)
def get_video(_url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
}
res = requests.get(_url, headers=headers, timeout=3)
element_dom = etree.HTML(res.text)
# 解析视频地址
videosrc = element_dom.xpath("//video/@src")[0]
down_video(videosrc)
def down_video(video_url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36",
"Host": "vfx.mtime.cn"
}
res = requests.get(video_url, headers=headers, timeout=3)
# 写入视频文件
with open(str(int(time.time()))+".mp4",'wb') as f:
f.write(res.content)
if __name__ == '__main__':
get_html('http://地址脱敏处理/index.html')
复制代码
运行结果如下所示:
上述代码获取的仅有一页数据,如果希望扩展到全部页面,只需要在爬取视频前获取所有的列表页地址即可,可以使用列表解析器进行生成。
记录时间
2022年度 Flag,写作的 561 / 1024 篇。
可以关注我,点赞我、评论我、收藏我啦。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END