探索m.chinanews.com的新闻采集
《中国新闻网》客户端分享出来的文章,用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); ?> |
原创文章如转载,请注明:转载自无花果的原创博客 [ http://wuhuaguo.lifeskillcn.com ]