用python爬取头条文章是什么_爬取头条文章详情页时cookie中的__ac_nonce是什么?...

今天尝试了一下用php拉取头条文章内容,但并不是那么顺利,整体分成三个步骤。

首先,如果我们直接请求文章内容,以postman举例,它会返回如下一段Javascript代码:

分析下上面这段代码就知道,它从cookie中获取__ac_nonce这个值,然后用acrawler.js文件中的方法加密成一串__ac_signature,这些都可以理解,没有问题。

有个疑问:__ac_nonce是怎么来的??

继续看刚才用post请求的响应信息,我发现这个值是通过头条响应头带过来的。

尝试不断请求,是否每次头条都会响应__ac_nonce值,于是我尝试写了如下一个demo脚本:

$ch = curl_init();

$headers = [

'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',

];

curl_setopt($ch, CURLOPT_URL, 'https://www.toutiao.com/a6846918379043815950');

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_HEADER, true);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 3);

$rs = curl_exec($ch);

// 查看具体返回值

var_dump($rs, curl_error($ch));

// 响应头中匹配cookie部分,为了获取__ac_nonce值

preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $rs, $matches);

$cookies = [];

$nonce = "";

foreach($matches[1] as $item) {

parse_str($item, $cookie);

$cookies = array_merge($cookies, $cookie);

}

if (! empty($cookies['__ac_nonce'])) {

$nonce = $cookies['__ac_nonce'];

}

echo 'ac_nonce: ' . $nonce . PHP_EOL;

很遗憾,结果极度不稳定:

bool(false)

string(67) "Operation timed out after 2540 milliseconds with 682 bytes received"

但还是有部分请求给我重新分配了__ac_nonce值,只是没有的情况比较多,这是什么问题?

附言

拿到__ac_nonce配合nodejs生成__ac_signature我最后在拉取详情的时候把请求头带上cookie成功的拉到了头条内容, 如下:

// ...

$headers = [

'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',

'cookie: __ac_nonce=xxx;__ac_signature=xxx;',

];

// ...

所以,问题是:什么是__ac_nonce?怎么100%稳定得到它的值?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值