Python实战爬虫,爬取新片场视频数据

蚂蚁学Python

共 8234字,需浏览 17分钟

 ·

2022-07-06 13:16

任务简介

从蚂蚁学python的群里面接到这个单,从单上看需求是这样的,爬取新片场视频音乐图片,有一个爬虫Scrapy代码,已经有程序了,需要调试运行成功。关键是用客户的电脑远程操作并进行全程用录屏录像。毕竟自己也学习完了爬虫,那就试一下。和客户联系上后,了解完客户真实的需求,最后客户的需求是这样的。

难点

爬取的内容很多,涉及到视频、图片、和音乐,关键是要远程用客户的电脑进行操作写代码,并一步一步的分析操作讲解给客户。为了代码清晰,将需求一个一个的分开,分多个程序去写。自己先完成一遍代码程序。

代码实现

文章主要介绍爬取新片场首页精品收藏夹发布的视频,具有代表性。
其中用到的技术,是前不久从帅帅老师视频那里学到的selenium,代码结构如下:

options = webdriver.ChromeOptions()
options.add_argument('--headless')
self.driver = webdriver.Chrome(options=options)
self.driver.get(url)
WebDriverWait(self.driver, timeout=10).until(
          lambda x: "评论" in self.driver.page_source)
page_text = self.driver.page_source
html = etree.HTML(page_text)
src = html.xpath(
      '//*[@id="xpcplayer"]/div/div[2]/video/@src')[0]

话不多说直接上完整代码

import os
import time
import requests
from fake_useragent import UserAgent
from lxml import etree
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import re

# 爬去新片场素材视频进行视频下载
class xinPianChangShouCangJiaVideo:
    def __init__(self):
        # 创建options对象
        options = webdriver.ChromeOptions()
        # 开启无界面模式 给对象添加无头参数
        options.add_argument('--headless')
        # 实例化带有配置的driver对象
        self.driver = webdriver.Chrome(options=options)
        # 伪装请求头
        user_agent = UserAgent().random
        self.headers = {'User-Agent': user_agent}
        # 保存视频路径
        path = os.getcwd()
        self.filename = path + '\\' + '精品收藏夹视频'
        isExists = os.path.exists(self.filename)
        if not isExists:
            os.makedirs(self.filename)
            print(self.filename + ' 创建成功')
        else:
            print(self.filename + ' 目录已存在')

    # 获取每个视频的超链接
    def getEachVideoUrl(self):
        url = 'https://www.xinpianchang.com/bookmark/663078'
        print(url)
        res = requests.get(url, headers=self.headers)
        html = etree.HTML(res.content.decode())
        # 每个视频的URL
        href = html.xpath(
            '//*[@id="__next"]/section/main/div/div[1]/div[2]/div[*]/div[1]/div[1]/a/@href')
        # 每个视频的名字
        title = html.xpath(
            '//*[@id="__next"]/section/main/div/div[1]/div[2]/div[*]/div[1]/div[2]/div[1]/a/text()')
        # print(href)
        return title, href

    # 下载每一个视频
    def DownloadEveryVideo(self):
        # 用request 请求是请求不到的,结果放在一个js里面了
        title, href = self.getEachVideoUrl()
        # title = ['建国70周年宣传片《70,我一直爱着你》']
        # href = ['https://www.xinpianchang.com/a10548298?from=articleCollectDetail']
        for i in range(len(href)):
            url = href[i]
            print(f"正在爬取的视频链接: {url}")
            self.driver.get(url)
            # 评论关键词出现了,页面就是加载完毕
            WebDriverWait(self.driver, timeout=10).until(
                lambda x: "评论" in self.driver.page_source)
            time.sleep(1)
            page_text = self.driver.page_source
            html = etree.HTML(page_text)
            # 每个视频的直连
            src = html.xpath(
                '//*[@id="xpcplayer"]/div/div[2]/video/@src')[0]
            try:
                # 请求视频地址,保存视频,有可能视频地址无效的情况
                res = requests.get(src, headers=self.headers)
                print(title[i])
                # title含特殊字符问题需要处理一下
                name = re.sub(r'[:/\\?*“”<>|]''_', title[i])
                with open(self.filename + '\\' + f'{i + 1}_{name}.mp4''wb') as f:
                    f.write(res.content)
                    print(f, '下载完成')
            except Exception as e:
                print(e)

    # 主函数
    def main(self):
        # 开始时间
        start_time = time.time()
        self.DownloadEveryVideo()
        use_time = int(time.time()) - int(start_time)
        print(f'爬取总计耗时:{use_time}秒')
        self.driver.quit()


if __name__ == '__main__':
    scjv = xinPianChangShouCangJiaVideo()
    scjv.main()

完成了这一个爬虫那么其他需求的爬虫也就相对好一些,原理都是大同小异,都是相互通的。

关键是要远程用客户的电脑进行操作写代码,并一步一步的分析操作讲解给客户,考虑到客户的接受程度,最后给客户讲解花了3小时。

最后展示一下成果

今晚来蚂蚁老师抖音直播间,Python带副业全套餐有优惠!!!



浏览 133
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报