TZ糖纸 发表于 2023-7-12 12:05

《使用C#+Selenium+FiddlerCore 抓取douyin》

FiddlerCore 包NuGet\Install-Package FiddlerCore -Version 4.6.2
其他看图安装包


上代码
public class douyin
    {
      public static void start()
      {
            FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete;
            FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest;
            FiddlerApplication.Startup(8888, true, true, true);
            remove();
            install();


            // 创建代{过}{滤}理对象
            Proxy proxy = new Proxy();

            // 设置代{过}{滤}理服务器地址和端口
            proxy.HttpProxy = "127.0.0.1:8888";
            proxy.SslProxy = "127.0.0.1:8888";


            ChromeOptions options = new ChromeOptions();
            // 将代{过}{滤}理对象附加到 ChromeOptions
            options.Proxy = proxy;


            // 创建Edge浏览器的WebDriver实例
            IWebDriver driver = new ChromeDriver(options);

            // 导航到52pojie网站
            driver.Navigate().GoToUrl("用户的主页");


            // 等待用户输入并保持程序运行
            Console.WriteLine("按下任意键停止...");
            Console.ReadLine();
            // 关闭浏览器
            driver.Quit();
            // 停止 FiddlerCore
            FiddlerApplication.Shutdown();
      }

      private static void FiddlerApplication_BeforeRequest(Session oSession)
      {
            if (oSession.url.StartsWith("www.douyin.com/aweme/v1/web/aweme"))
            {
                // 移除"Accept-Encoding"请求头
                if (oSession.oRequest.headers.Exists("Accept-Encoding"))
                {
                  oSession.oRequest.headers.Remove("Accept-Encoding");
                }
            }
      }

      static string tmp = "-------------------------------------";
      private static void FiddlerApplication_AfterSessionComplete(Session oSession)

      {
            if (oSession.RequestMethod == "POST" || oSession.RequestMethod == "GET")
            {
                if (oSession.url.Contains("www.douyin.com/aweme/v1/web/aweme"))
                {

                  byte[] responseBodyBytes = oSession.responseBodyBytes;


                  // 转换解压后的字节数组为字符串
                  string responseBodyString = Encoding.UTF8.GetString(responseBodyBytes);

                  var json = JObject.Parse(responseBodyString);
                  var videoList = json["aweme_list"];
                  foreach (var video in videoList)
                  {
                        var preview_title = video["preview_title"];
                        var play_addr = video["video"]["play_addr"]["url_list"];
                        Console.WriteLine(preview_title);
                        Console.WriteLine(play_addr);
                  }

                }
            }
      }

      public static void install()
      {
            if (!CertMaker.rootCertExists())
            {
                CertMaker.createRootCert();
                CertMaker.trustRootCert();
            }
      }



      public static void remove()
      {
            if (CertMaker.rootCertExists())
            {
                CertMaker.removeFiddlerGeneratedCerts();
            }
      }
    }

代码解释
private static void FiddlerApplication_BeforeRequest(Session oSession)
      {
            if (oSession.url.StartsWith("www.douyin.com/aweme/v1/web/aweme"))
            {
                // 移除"Accept-Encoding"请求头
                if (oSession.oRequest.headers.Exists("Accept-Encoding"))
                {
                  oSession.oRequest.headers.Remove("Accept-Encoding");
                }
            }
      }
这段代码是因为douyin在使用http传输时使用了br压缩方式,所以这里移除请求头,干掉br压缩

private static void FiddlerApplication_AfterSessionComplete(Session oSession)

      {
            if (oSession.RequestMethod == "POST" || oSession.RequestMethod == "GET")
            {
                if (oSession.url.Contains("www.douyin.com/aweme/v1/web/aweme"))
                {

                  byte[] responseBodyBytes = oSession.responseBodyBytes;


                  // 转换解压后的字节数组为字符串
                  string responseBodyString = Encoding.UTF8.GetString(responseBodyBytes);

                  var json = JObject.Parse(responseBodyString);
                  var videoList = json["aweme_list"];
                  foreach (var video in videoList)
                  {
                        var preview_title = video["preview_title"];
                        var play_addr = video["video"]["play_addr"]["url_list"];
                        Console.WriteLine(preview_title);
                        Console.WriteLine(play_addr);
                  }

                }
            }
      }
拦截对应的请求
前边干掉了br压缩,这里我们直接对byte[]转string进行json解析
最终效果图


因为是通过接口拿到的数据,这里随便怎么输出,我这里只把作品标题还有视频链接输出

YokingChi 发表于 2023-10-23 19:36

本帖最后由 YokingChi 于 2023-10-23 19:41 编辑

xpj4186 发表于 2023-10-22 11:20
FiddlerCore包在哪里下载?好像下架了?在包管理器搜索不到啊
程序包管理器控制台,在里面打命令安装:
NuGet\Install-Package FiddlerCore -Version 4.6.2
找不到控制台的话点击视图(View) -> 其他窗口(OtherWindow) -> 程序包管理器控制台 (Package Manager Console)

henry307 发表于 2023-7-12 13:21

还是用C#写的

wfghim 发表于 2023-7-12 13:32

学习了。有空了,在试试

mrchi 发表于 2023-7-12 13:39

才知道抖音还有网页版,学习了

wkfy 发表于 2023-7-12 13:47

我想学习一下抖音的小程序怎么抓。发现是网页版没小程序。

AHDylan 发表于 2023-7-12 17:04

大佬,多发布点C#的爬虫技术

guohuanxian 发表于 2023-7-12 17:36

抓取得抖音,有抓取直播流的吗?方法怎么做那

TZ糖纸 发表于 2023-7-12 19:53

guohuanxian 发表于 2023-7-12 17:36
抓取得抖音,有抓取直播流的吗?方法怎么做那

抓直播流后边可以试试

xixicoco 发表于 2023-7-13 04:24

这个方法比较独特啊

TZ糖纸 发表于 2023-7-13 13:11

xixicoco 发表于 2023-7-13 04:24
这个方法比较独特啊

这个方法,只要是通过浏览器的 都能抓
页: [1] 2
查看完整版本: 《使用C#+Selenium+FiddlerCore 抓取douyin》