python3网络爬虫--MitmProxy+Selenium某音视频抓取(附源代码)


创作于

一.前言

本人已经撰写过几篇关于某音的文章:


因为某音推出了网页版本,本次使用Selenium配合mitmdump实现全自动抓取某音网页视频数据,可以解析出视频名称、视频地址、无水印地址等…。

二.预览

1.抓取过程预览

下图是自动化抓取过程,某音一次加载6个视频,当用户刷到第4个视频时,开始请求下一次数据,抓取此请求接口即可。

请添加图片描述

2.数据库预览

下图为结果数据库(MongoDB)
在这里插入图片描述

三.准备工作

1.工具

  1. Python3.x
  2. Python开发工具PyCharm
  3. 基于Python3.x的mitmproxy
  4. 基于Python3.x的Selenium
  5. Selenium驱动WebDriver
  6. Chrome谷歌浏览器
  7. SwitchyOmega谷歌浏览器代理插件
  8. MongoDB数据库(非必要)

2.一些教程

  1. mitmproxy证书配置以及SwitchyOmega插件安装
  2. Selenium的安装以及WebDriver驱动的配置

四.原理&流程

1.主要原理

通过Selenium向webdriver发出指令,进而对Chrome进行控制,比如打开网站主页,模拟按下键盘按键,实现视频的切换,产生数据的加载,异步开启mitmdump,充当中间人,拦截浏览器到服务器的请求与响应,为Chrome设置好SwitchyOmega谷歌插件的代理地址与端口,让浏览器中请求与响应皆经过中间人mitmdump,最后使用mitmdump对响应进行过滤,筛选出目标接口产生的响应,解析响应体,存储结果到数据库。

2.整体流程

整体的操作流程如下
在这里插入图片描述

3.代码(数据)流程

代码的撰写一定要满足mitmproxy的语法。
在这里插入图片描述

3.我的设置

有的读者可能对SwitchyOmega不太熟悉,虽然上面我放了使用教程,我在这里贴一下SwitchyOmega的配置
先新建一个情景模式,然后填写对应的IP和端口号(Ip就是window的局域网IP,使用ipconfig可以查到,端口号是mitmdump监听的端口号)最后别忘了点击应用选项。
在这里插入图片描述
最后这样,将它开启
在这里插入图片描述

4.解释

大家可能在第二步“预览”部分发现Webdriver操作的浏览器就是我平时上网的浏览器,而不是新建了一个用户默认的浏览器,因为我发现douyin会识别用户的浏览器,特别是新建的浏览器特征,每次返回的数据都是一样的,而且只返回一组数据,设置了代理也没用,所以我在webdriver的配置中加入了“–user-data-dir=”参数,这样selenium默认打开的就是我自用的浏览器,通过设置User Data目录,即可轻松的跳过很多网站的登陆验证,而且可以免于复杂的验证码处理流程。这里参考了:
Selenium使用自带浏览器自动化

五.源代码

2022年6月3日14:59:50

1.douYinVideoCrawl.py(Selenium自动化脚本)

import os
import time
import selenium
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from seleniumwire import webdriver
import random


class DouyinSpider(object):
    def __init__(self):
        super(DouyinSpider, self).__init__()
        self.douyinUrl = "https://www.douyin.com/"
        self.setWebdriver()

    def setWebdriver(self):
        option = webdriver.ChromeOptions()
        option.add_argument(
            'User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53')
        # 通过设置User Data目录,即可轻松的跳过很多网站的登陆验证,而可以免于复杂的验证码处理流程。
        # 参考:https://blog.csdn.net/a12355556/article/details/112551931
        profile_directory = r'--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data'
        option.add_argument(profile_directory)
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 打开浏览器
        driver = webdriver.Chrome(options=option)
        self.driver = driver
        self.driver.implicitly_wait(5)

    def openDouyinPage(self):
        """
        打开某音页面,保证主页能够真正打开,为抽取数据做准备
        :return:
        """
        try:
            self.driver.get(self.douyinUrl)
            time.sleep(2)
            if self.driver.title == "{}音-记录美好生活".format("抖"):
                return True
            else:
                return False
        except selenium.common.exceptions.WebDriverException:
            self.openDouyinPage()

    def start(self):
        """
        开始爬取
        :return:
        """
        os.startfile(os.path.abspath("douyin.bat"))  # 开启mitmdump
        if not self.openDouyinPage():
            self.openDouyinPage()
        htmlEle = self.driver.find_element(By.TAG_NAME, "html")
        while True:
            try:
                htmlEle.send_keys(Keys.ARROW_DOWN)  # 通过向翻到下一个
                self.do_sleep()
            except:
                pass

    def do_sleep(self):
        """
        随机睡眠1-2秒
        :return:
        """
        sleepTime = random.randint(1, 2)
        time.sleep(sleepTime)


if __name__ == '__main__':
    spider = DouyinSpider()
    spider.start()

2.douYinVideoParse.py(mitmdump对视频数据解析、存储脚本)

import mitmproxy.http
import json
import pymongo
import time


def response(flow: mitmproxy.http.HTTPFlow):
    aim_url = 'https://www.douyin.com/aweme/v1/web/tab/feed/'
    # 捕捉所有目标url开头的url
    if flow.request.url.startswith(aim_url):
        _json = json.loads(flow.response.text)
        aweme_list = _json.get('aweme_list')
        for aweme in aweme_list:
            item = {}
            item['user_name'] = aweme.get("author").get('nickname')  # 用户名
            item['user_uid'] = aweme.get("author").get('uid')  # 个人id
            item['user_id'] = aweme.get('author_user_id')  # 唯一id
            item['share_url'] = aweme.get('share_url')
            statistics = aweme.get('statistics')
            item['collect_count'] = statistics.get('collect_count')
            item['comment_count'] = statistics.get('comment_count')
            item['digg_count'] = statistics.get('digg_count')
            item['share_count'] = statistics.get('share_count')
            item['play_count'] = statistics.get('play_count')
            play_addr = aweme.get('video').get('play_addr')
            url_list = play_addr.get('url_list')
            item['video_nowm_address'] = url_list[0]
            for url in url_list:
                if "watermark=1" in url:
                    item['video_nowm_address'] = url
                    break
            item['video_url_list_address'] = url_list
            item['data_size'] = play_addr.get("data_size")
            item['video_intro'] = aweme.get('desc')
            data = dict(item)
            data_count = save_to_mongo().count_documents(data)
            if data_count == 0:
                save_to_mongo().insert_one(data)
            print(data)


def save_to_mongo():
    # MONGODB 主机名
    host = "127.0.0.1"
    # MONGODB 端口号
    port = 27017
    client = pymongo.MongoClient(host=host, port=port)
    # 指定数据库
    dbname = 'Douyin'
    sheetname = 'user_infos'
    mydb = client[dbname]
    post = mydb[sheetname]
    return post

3.douyin.bat(mitmdump启动脚本)

为了偷懒直接写了个bat,主程序也能够自动将其开启。

mitmdump  -q  -s douYinVideoParse.py -p 8885

六.总结

本次使用-MitmProxy+Selenium抓取了一些视频数据,通过设置Selenium的webdriver驱动隐藏了爬虫身份,为抓取数据提供了新思路。思路、代码方面有什么不足欢迎各位大佬指正、批评!觉得还行,能点个赞吗?
请添加图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,为了访问QQ空间相册,我们需要登录QQ账号。可以使用Selenium模拟用户登录QQ,然后使用BeautifulSoup解析相册页面,获取相册中的图片链接。 以下是大致的实现步骤: 1. 安装Selenium和BeautifulSoup模块。 2. 使用Selenium模拟用户登录QQ,进入相册页面。 ```python from selenium import webdriver # 创建Chrome浏览器对象 browser = webdriver.Chrome() # 打开QQ登录页面 browser.get("https://mail.qq.com/") # 执行模拟登录操作,具体实现可以参考Selenium文档或其他相关教程 # ... # 进入相册页面 browser.get("http://user.qzone.qq.com/123456789/album") ``` 3. 使用BeautifulSoup解析相册页面,获取相册中的图片链接。 ```python from bs4 import BeautifulSoup # 获取相册页面的HTML源代码 html = browser.page_source # 使用BeautifulSoup解析HTML源代码,获取相册中的图片链接 soup = BeautifulSoup(html, "html.parser") img_links = soup.find_all("img", class_="c_photo_img_img") # 打印图片链接 for link in img_links: print(link["src"]) ``` 4. 下载图片。 ```python import requests # 下载图片 for i, link in enumerate(img_links): img_url = link["src"] response = requests.get(img_url) with open(f"photo_{i}.jpg", "wb") as f: f.write(response.content) ``` 以上只是大致的实现步骤,具体的实现过程可能还需要根据实际情况进行调整。同时,需要注意的是,访问QQ空间相册需要登录QQ账号,因此需要注意账号安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值