首页 > 经验技巧 > 探索m.chinanews.com的新闻采集

探索m.chinanews.com的新闻采集

2022年2月25日 1,700 浏览数 发表评论 阅读评论

《中国新闻网》客户端分享出来的文章,用PHP常规采集获取不到新闻内容。经过一番探索,发现了其中的“秘密”。现将过程分享如下。

打开这个网址:https://m.chinanews.com/wap/detail/zw/gn/2022/02-23/9683825.shtml 查看网页源码,很显然新闻内容都是通过JS加载进来的。

在浏览器中按F12,打开“开发者工具”,切换到“Network”面板,按F5刷新页面,结果出来了。点击“Fetch/XHR”子面板,第二条就是获取内容的链接。

我们在该链接上点鼠标右键选择“Open in new tab”却发现打开的网页没有任何内容。看来是在“Request Headers”上做了“手脚”。

通过几次比较“Request Headers”。发现只有“accessToken”和“timestamp”有变化。

“timestamp”是时间戳,这个好理解。我们需要找一下“accessToken”是如何生成的?按“Ctrl+F”打开搜索框,搜一下“accessToken”。

系统定位到“main.d9b70007.js”这个JS上。

在“Sources”面板上打开这个JS文件,继续搜一下。

找到后设置两个断点,按F5刷新,执行代码调试。

我们看到,要生成accessToken需要生成变量i,而变量i又是通过变量r得来的,r又是通过t转化来的。我们获取上述变量进行分析:

变量t和n都是JSON数据,n是t进行了“名”字母排序形成的。r是把n的“值”取出来拼接而成的。

执行完,我们并没有发现生成的字符串赋值给accessToken


为了节省时间,未进一步分析r变成i的过程。把accessTokey、timestamp和变量r比较了一下,发现文章id和时间戳都合并到r,accessToken貌似是把r用md5加密生成的。

验证了一下,果然如此。

至此,整个解密过程就结束了。下面只要写代码生成accessToken即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
$url = 'https://m.chinanews.com/wap/detail/zw/gn/2022/02-23/9683825.shtml';
//分离出文章ID
$newsid = substr($url, strrpos($url, '/')+1); 
$newsid = substr($newsid, 0,strrpos($newsid, '.shtml'));
//13位时间戳
$t = floor(microtime(true)*1000); 
$accessToken = md5('CNSAPPNJAGTABQ7'.$newsid .'yeschs'.$t.'6.7.8');
//设置请求头
$header = array("Accept: application/json, text/plain, */*",
	"Accept-Encoding: gzip, deflate, br",
	"Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
	"accessToken: {$accessToken}",
	"appKey: CNSAPP",
	"Cache-Control: no-cache",
	"Connection: keep-alive",
	"Cookie: HMF_CI=9f7c30e0df998980521eb5c33178f3349bf27a262a4a0cd33186c9ffb583e6eecd; HMY_JC=4eb5f4194bdc860c03adf09de46e4d31c7026b37689f38f359fa143e4502a0be98,",
	"Host: m.chinanews.com",
	"Pragma: no-cache",
	"Referer: {$url}",
	"sec-ch-ua: \" Not A;Brand\";v=\"99\", \"Chromium\";v=\"96\", \"Google Chrome\";v=\"96\"",
	"sec-ch-ua-mobile: ?0",
	"sec-ch-ua-platform: \"Windows\"",
	"Sec-Fetch-Dest: empty",
	"Sec-Fetch-Mode: cors",
	"Sec-Fetch-Site: same-origin",
	"timestamp: {$t}",
	"User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",);
//设置获取JSON数据的地址
$url = 'https://m.chinanews.com/chinanews/newsContent?language=chs&dtp=7&isWap=yes&id='.$newsid.'&version_chinanews=6.7.8';
//开始curl请求
$ch = curl_init();  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$content = curl_exec($ch);
curl_close($ch);
//JSON解码
$json = json_decode($content,true);
var_dump($json);
?>
分类: 经验技巧 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.