全球主机交流论坛

标题: 求助一个PHP Curl网页源码动态的问题 [打印本页]

作者: 唐王李世民    时间: 2024-11-11 13:46
标题: 求助一个PHP Curl网页源码动态的问题
先道声谢谢了。

视频演示:https://thumbsnap.com/qkDgKM5o

网址信息:https://www.toutiao.com/video/7418557232318513703/

我使用PHP的url获取一个网页的时候,它的网页内容一直在跳动,不能获取完整,我知道可能是使用了js动态创建的,但有技术或方法可以获取完整的内容吗?谢谢了

  1. /*
  2. *  今日头条video页面的文件头
  3. **/
  4. function toutiao_html_header($url)
  5. {
  6.     $header = array(
  7.         "Host: https://www.toutiao.com",
  8.         "Referer: {$url}",
  9.         "set-cookie: tt_webid=7421001700129736202; path=/; expires=Sun, 09 Feb 2025 04:22:07 GMT; domain=toutiao.com; secure; httponly",
  10.         'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
  11.         'Accept-Language:zh-CN,zh;q=0.9,en;q=0.8',
  12.         'cookie: ******************************************************************************',
  13.         "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
  14.     );
  15.     return $header;
  16. }

  17. /**
  18. * 模拟浏览器开始访问请求,这个用于今日头条视频的页面内容获取
  19. */
  20. function fetch_toutiao_video_html($url)
  21. {
  22.     $header = toutiao_html_header($url);
  23.     $timeout = 40;
  24.     $ch = curl_init($url);
  25.     curl_setopt($ch, CURLOPT_FAILONERROR, true);
  26.     //设置请求头信息
  27.     #curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  28.     curl_setopt($ch, CURLOPT_HEADER, $header);
  29.     //不取得返回头信息
  30.     #curl_setopt($ch, CURLOPT_HEADER, 0);
  31.     // 关闭https验证
  32.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  33.     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  34.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  35.     curl_setopt($ch, CURLOPT_ENCODING, "");
  36.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
  37.     curl_setopt($ch, CURLOPT_AUTOREFERER, true);
  38.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  39.     curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  40.     curl_setopt($ch, CURLOPT_REFERER, $header[1]);
  41.     curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  42.     curl_setopt($ch, CURLOPT_USERAGENT, $header[6]);
  43.     $content = curl_exec($ch);
  44.     if (curl_errno($ch)) {
  45.         echo 'Error:' . curl_error($ch);
  46.     } else {
  47.         return $content;
  48.     }
  49.     curl_close($ch);
  50. }
复制代码

作者: XSProMax    时间: 2024-11-11 14:03
太高端了 我不会
作者: 唐王李世民    时间: 2024-11-11 14:13
我查了网络上,有几个同样的问题

1、https://wenku.csdn.net/answer/e12d12f453044ecf8d2a3959ec080971

2、https://cloud.tencent.com/developer/ask/sof/104711852/answer/114173132

3、https://cloud.tencent.com/developer/ask/sof/100838855

我不太明白他们回复的方法,请教各位大佬们了,谢谢了
作者: qidian8    时间: 2024-11-11 14:21
可以尝试使用Headless Chrome或Puppeteer来抓取动态生成的内容。
作者: 唐王李世民    时间: 2024-11-11 14:22
qidian8 发表于 2024-11-11 14:21
可以尝试使用Headless Chrome或Puppeteer来抓取动态生成的内容。

谢谢您的回复,在php中应该如何使用呢?
作者: vikin    时间: 2024-11-11 14:35
这种动态的网页 我之前研究了很久你百度下:
ChromeDriver抓取动态网页
作者: kpxyyyy    时间: 2024-11-11 14:43
做爬虫要先分析网页的结构,而不是直接就写请求,现在的网站很多都是前后端分离动态加载。
作者: kof21411    时间: 2024-11-11 14:50
你可以直接curl他的接口api拿内容
作者: imdong    时间: 2024-11-11 15:06
你要获取页面内容不需要输出响应头信息
把这段curl_setopt($ch, CURLOPT_HEADER, $header); 改成curl_setopt($ch, CURLOPT_HEADER, false);
设置头信息函数里面可以把set-cookie相关代码删掉
作者: zhughe    时间: 2024-11-11 15:16
python + playwright 轻松搞定,php只能通过浏览器分析接口,直接抓接口
作者: 唐王李世民    时间: 2024-11-11 16:24
vikin 发表于 2024-11-11 14:35
这种动态的网页 我之前研究了很久你百度下:
ChromeDriver抓取动态网页

谢谢您的回复,我了解一下
作者: 唐王李世民    时间: 2024-11-11 16:25
kpxyyyy 发表于 2024-11-11 14:43
做爬虫要先分析网页的结构,而不是直接就写请求,现在的网站很多都是前后端分离动态加载。 ...

谢谢您的回复,技术菜,所以很多不懂
作者: 唐王李世民    时间: 2024-11-11 16:33
kof21411 发表于 2024-11-11 14:50
你可以直接curl他的接口api拿内容

它的接口现在改了好像,找不到vid了
作者: 唐王李世民    时间: 2024-11-11 16:35
imdong 发表于 2024-11-11 15:06
你要获取页面内容不需要输出响应头信息
把这段curl_setopt($ch, CURLOPT_HEADER, $header); 改成curl_setop ...

好的,谢谢您的回复
作者: kpxyyyy    时间: 2024-11-11 16:36
zhughe 发表于 2024-11-11 15:16
python + playwright 轻松搞定,php只能通过浏览器分析接口,直接抓接口

其实php也有querylist
作者: 唐王李世民    时间: 2024-11-11 16:43
imdong 发表于 2024-11-11 15:06
你要获取页面内容不需要输出响应头信息
把这段curl_setopt($ch, CURLOPT_HEADER, $header); 改成curl_setop ...

  看不到内容跳转了,但是一直在转圈圈了,代码没办法进入下一步
作者: 唐王李世民    时间: 2024-11-11 17:46
kpxyyyy 发表于 2024-11-11 16:36
其实php也有querylist

需要额外安装模块吗?谢谢您了
作者: imdong    时间: 2024-11-11 21:16
本帖最后由 imdong 于 2024-11-11 21:27 编辑
唐王李世民 发表于 2024-11-11 16:43
看不到内容跳转了,但是一直在转圈圈了,代码没办法进入下一步


设置cookie
头信息下只需要设置UA,cookie 设置一个ttwid参数值随机数

https:   //  i.ibb  .co/1stn4fW/20241111211814.jpg (去掉空格)

作者: 唐王李世民    时间: 2024-11-12 09:04
imdong 发表于 2024-11-11 21:16
设置cookie
头信息下只需要设置UA,cookie 设置一个ttwid参数值随机数

谢谢您的回复,我试一试
作者: kpxyyyy    时间: 2024-11-12 12:22
说实话,整贴下来也没看到你到底要取什么内容,取网页代码平常的请求就能拉,取数据爬人家接口就行了.
作者: 似毛非毛    时间: 2024-11-12 12:35
。。。你这刚学爬虫就爬淘宝么?哪有新手村出来就打boss的。爬点简单的吧
作者: 唐王李世民    时间: 2024-11-12 12:50
kpxyyyy 发表于 2024-11-12 12:22
说实话,整贴下来也没看到你到底要取什么内容,取网页代码平常的请求就能拉,取数据爬人家接口就行了. ...

它的接口已经改变了,现在取不到接口数据,谢谢您了
作者: 唐王李世民    时间: 2024-11-12 12:51
似毛非毛 发表于 2024-11-12 12:35
。。。你这刚学爬虫就爬淘宝么?哪有新手村出来就打boss的。爬点简单的吧

大佬哪里看到我是爬淘宝?
作者: 我心飞呀飞    时间: 2024-11-12 13:05
确实,由于今日头条等网站使用大量的 JavaScript 来动态加载页面内容,直接使用 cURL 请求无法完整获取动态内容。可以尝试以下两种方法来解决这个问题:

1. 使用无头浏览器 (Headless Browser)
无头浏览器,如 Puppeteer(Node.js 环境)或 Playwright,可以完全模拟浏览器访问页面,包括执行 JavaScript 代码,从而获得完整的内容。这种方法可以确保页面完全加载后抓取内容。

以下是 Puppeteer 的简单示例:



2. 使用 PHP 的 Selenium WebDriver
如果你希望继续使用 PHP 语言,可以结合 Selenium WebDriver 和 ChromeDriver。PHP 有适配的 FB WebDriver 库,通过它可以操控 Chrome 浏览器,获取完整的网页内容。

以下是一个使用 PHP WebDriver 和 ChromeDriver 的示例:



注意事项
环境准备:Puppeteer 需要 Node.js 环境,而 PHP WebDriver 需要启动 Selenium Server 和 ChromeDriver。
效率和资源占用:无头浏览器会消耗更多资源,适合获取高精度数据时使用。
避免频繁请求:使用这些方法抓取数据时要注意频率,以免被网站封禁。
通过这两种方式,你可以更好地获取今日头条视频页面等动态内容。
作者: imdong    时间: 2024-11-12 13:07
唐王李世民 发表于 2024-11-12 09:04
谢谢您的回复,我试一试

还没搞定?
作者: imdong    时间: 2024-11-12 13:36
本帖最后由 imdong 于 2024-11-12 13:58 编辑

只需要设置UA和Cookie ttwid参数就行

作者: kpxyyyy    时间: 2024-11-13 01:25
imdong 发表于 2024-11-12 13:36
只需要设置UA和Cookie ttwid参数就行

我测这个玩意老被cdn的反爬虫拦截,还是用浏览器爬舒服
作者: 唐王李世民    时间: 2024-11-13 08:59
imdong 发表于 2024-11-12 13:36
只需要设置UA和Cookie ttwid参数就行

昨天没有时间测试,今天测试一下,谢谢您了
作者: imdong    时间: 2024-11-13 09:28
kpxyyyy 发表于 2024-11-13 01:25
我测这个玩意老被cdn的反爬虫拦截,还是用浏览器爬舒服

用浏览器需要等到页面加载完,速度上会慢些,所以没有触发机制
自动化和脚本个有利弊
作者: kpxyyyy    时间: 2024-11-13 11:54
imdong 发表于 2024-11-13 09:28
用浏览器需要等到页面加载完,速度上会慢些,所以没有触发机制
自动化和脚本个有利弊 ...

要是有个能够模拟执行需要浏览器的js但又不是浏览器的玩意就好了
作者: 陶泥猴子    时间: 2024-11-13 12:39
新人建议用浏览器爬, 大厂的反爬还是有点难度的
作者: 唐王李世民    时间: 2024-11-13 12:43
imdong 发表于 2024-11-12 13:07
还没搞定?

谢谢您的回复,toutiao的问题解决了,但是又有新问题了
作者: 唐王李世民    时间: 2024-11-13 12:44
陶泥猴子 发表于 2024-11-13 12:39
新人建议用浏览器爬, 大厂的反爬还是有点难度的

我是放在系统后台的,没办法用浏览器
作者: kpxyyyy    时间: 2024-11-13 12:47
唐王李世民 发表于 2024-11-13 12:44
我是放在系统后台的,没办法用浏览器

不需要实装浏览器,浏览器可以在后台跑,就是执行时间不太快。
作者: 唐王李世民    时间: 2024-11-13 12:56
那个对资源影响太大了。
作者: kpxyyyy    时间: 2024-11-13 17:09
唐王李世民 发表于 2024-11-13 12:56
那个对资源影响太大了。

你想速度快又想不占资源还不想费劲,哪有这种好事。
作者: a2815347247    时间: 2024-11-14 12:21
抓包抓一下接口
作者: 唐王李世民    时间: 2024-11-14 19:36
问题解决了,感谢所有回复的大佬们,特别感谢 @imdong 这个大佬指点下解决问题了




欢迎光临 全球主机交流论坛 (https://sunk.eu.org/) Powered by Discuz! X3.4