爬虫请求头遇见了X-CSRF-Token和c-token如何解决

如果遇见了,大多都是对token的加密。

今天遇见了这样一个网站:

想要获取验证码图片。抓包获取之后:

爬虫请求头遇见了X-CSRF-Token和c-token如何解决_第1张图片

requests.post()请求啊,但是请求之后一直在被网站拒绝,一直在报403.。

后来回头重新看,才发现请求头中是有X-CSRF-Token和c-token来识别身份的。

这个网站比较简单,这两个值是一样的。

然后就找这两值所在的界面嘛。

全局搜索之后,发现这个是明文传输的,如下:

爬虫请求头遇见了X-CSRF-Token和c-token如何解决_第2张图片

那用requests中的

Session来进行会话保持,获取这个值,在访问图片的链接时,加进去即可。

这是最简单的token加密形式了。

代码如下:

import requests
import base64
import json
import re
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def get_image():
    s = requests.Session()
    url1 = '*******************'
    headers1 = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Host': 'wsswj.hb-n-tax.gov.cn', 'Referer': 'https://www.google.com/', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
    res1 = s.get(url1,headers=headers1).text
    c_token = re.findall('var csrfPreventionSalt = "(.*?)";',res1)[0]
    print(c_token)

    headers2 = {
        'Accept': '*/*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Content-Length':'0',
        'Host': 'wsswj.hb-n-tax.gov.cn',
        'Origin': 'https://wsswj.hb-n-tax.gov.cn',
        'Referer': 'https://wsswj.hb-n-tax.gov.cn/portal/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
        'X-CSRF-Token': c_token,
        'X-Requested-With': 'XMLHttpRequest',
        'c-token': c_token,
    }

    url2 = '*********************'
    resp = s.post(url=url2,headers=headers2,verify=False)

    img = base64.b64decode(json.loads(resp.text)["repData"]['image'])

    filename  = 'template.jpg'
    with open('./image/'+filename,'wb') as f:
        f.write(img)
        print('下载完成')

get_image()

多说一句,我在没有加上X-CSRF-Token和c-token的时候,一直报的403,也就是服务器端判别了我是属于非正常请求头的,所以说,服务器对这个是有一个验证识别机制的。

 

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