JS逆向之python+node爬取头条

在最近的需求中需要对今日头条的数据进行爬取,于是花了两天多的时间,终于爬下来了,下面直接进入正题。

分析思路

在爬取网站之前,按照套路先打开网站分析一下,确定一下整体的思路。
在这里插入图片描述
主要是获取web网站主页下的资讯新闻url,再通过url拿到详情页的正文,先打开开发者工具对主页进行抓包
在这里插入图片描述
主页的html没有数据信息,页面数据应该是ajax传递的,在调试接口中找一下有没有接口
在这里插入图片描述
发现了这个,应该是我们要找的东西,找到request_url,是我们要拿到的接口链接,
在这里插入图片描述
简单分析了下主要是max_behot_time、as、cp、_signature这几个参数在变化,max_behot_time在返回的json文件最后能拿到,其他几个参数很明显是加密了,全局搜索参数,在index.88f72107a4b3405 -27de1.js里面找到了as、cp,打上断点调试,确认e就是as、cp的值,
在这里插入图片描述
这两个参数应该是md5加密的,把整个函数扣出来,用python调用。在这里插入图片描述
下面再找下_signature,发现p就是_signature函数隐藏的地方
在这里插入图片描述

找到p函数所在的js
在这里插入图片描述

打上断点,可以看到通过将其他参数拼接的a传给window.byted_acrawler.sign()方法进行加密,最后返回_signature参数的值。
在这里插入图片描述
这样就是最后完整的请求链接,在浏览器里测试一下,果然是有数据的,这里就不放图了,然后写个js接口去调用node执行
在这里插入图片描述
再用python去解析返回的json包,可以拿到资讯信息的title,url之类的,算是爬取成功了。但自己这边需求比较特殊,需要获取到正文详情页面的信息,本来以为直接拿HTML就行,但发现并不是这样。
在这里插入图片描述
详情页也是用JS渲染的,找了一会并没有定位到文件,最后发现response返回结果里有个content值,包含了正文,直接请求页面,最后通过正则拿到详情数据。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python逆向分析通用模板代码的步骤如下: 1. 使用Chrome等浏览器打开目标网站,并按F12打开开发者工具,进入Network面板,勾选“Preserve log”选项。 2. 在浏览器中输入目标网站的URL,按下回车键,此时开发者工具会记录下所有的网络请求。 3. 在Network面板中找到目标请求,右键选择“Copy” -> “Copy as cURL”获该请求的cURL命令。 4. 在Python中使用requests库发送该cURL命令,即可获请求的结果。 5. 解析结果,提需要的数据。 下面是一个示例代码: ```python import requests import json # 替换为目标请求的cURL命令 curl_cmd = "curl 'https://www.example.com/api/xxx' -H 'authority: www.example.com' -H 'accept: */*' -H 'sec-fetch-dest: empty' -H 'x-requested-with: XMLHttpRequest' -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36' -H 'content-type: application/json;charset=UTF-8' -H 'origin: https://www.example.com' -H 'sec-fetch-site: same-origin' -H 'sec-fetch-mode: cors' -H 'referer: https://www.example.com/' -H 'accept-language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7' --data-raw '{\"page\":1,\"pageSize\":20}' --compressed" # 将cURL命令转换为requests的参数 cmd_parts = curl_cmd.split() url = cmd_parts[1] headers = {cmd_parts[i]: cmd_parts[i+1] for i in range(2, len(cmd_parts)) if cmd_parts[i-1] == "-H"} data = json.loads(cmd_parts[-1]) # 发送请求并解析结果 response = requests.post(url, headers=headers, json=data) result = json.loads(response.text) print(result) ``` 需要注意,由于不同网站的请求参数和请求头可能不同,因此需要根据具体情况修改上述代码中的curl_cmd、headers和data等参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值