头条ixigua原解析失效的解决方法

以前的解析方法

import requests
import re

url = "https://www.ixigua.com/i6746853922465382926/"

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77'
                  '.0.3865.90 Safari/537.36',
}

resp = requests.get(url,headers=headers)
content = resp.text
print(content)
auth_token = re.search(r'"authToken":"(.*?)"',content,re.S).group(1).strip()
businessToken = re.search(r'"businessToken":"(.*?)"',content,re.S).group(1).strip()
vid = re.search(r'"vid":"(.*?)"',content,re.S).group(1).strip()
print(auth_token)
print(businessToken)
print(vid)

r_url = "https://vas.snssdk.com/video/openapi/v1/"
params = {
    'aid': '1768',
    'action': 'GetPlayInfo',
    'video_id': vid,
    'nobase64': 'false',
    'ptoken': businessToken,
    'vfrom': 'xgplayer'
}
s_headers = {
    'authorization':auth_token,
    'accept': 'application/json, text/plain, */*',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'origin': 'https://www.ixigua.com',
    'referer': url,
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'cross-site',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77'
                  '.0.3865.90 Safari/537.36',
}
resp = requests.get(r_url, params=params, headers=s_headers)
print(resp.url)
print(resp.text)

在原解析方法中,主要参数,两个token和视频vid都是可以在源码中获取的,这就使得反爬基本很好应对,最后获取的内容包含链接是base64加密的,解密也没有难度,

但是,最近这个改了,除了vid,两个token都拿不到,导致代码报错,无法抓取。

目前有三个思路。

一,其实它的两个token是在一个接口返回的,这个接口需要一个签名参数_signature。它是js生成的,需要js逆向技能。获取这个签名,就可以访问接口获取两个token,带着两个token,上面的方法就可以继续使用。

二,一个古老的视频接口,只需要vid即可获取数据。

三,两个token也是js生成的,可以直接用js逆向去解析两个token的生成方法,他俩在一起。

由于js确实差,这里记录第二种。

import base64

import requests
import re

url = "https://www.ixigua.com/i6746853922465382926/"

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77'
                  '.0.3865.90 Safari/537.36',
}

resp = requests.get(url,headers=headers)
content = resp.text
vid = re.search(r'"vid":"(.*?)"',content,re.S).group(1).strip()

# http://i.snssdk.com/video/urls/1/toutiao/mp4/v030049c0000bmgpumqbr0fnesej9310
url = 'http://i.snssdk.com/video/urls/1/toutiao/mp4/' + vid
print(url)
resp = requests.get(url)
print(resp.text)

urls = re.findall('"main_url":"(.*?)"',resp.text,re.S)
for url in urls:
    print(url)
real_url = urls[-1]
real_url = str(base64.b64decode(real_url.encode('utf-8')),'utf-8')
print(real_url)

结果:

你可能感兴趣的:(爬虫实战)