网址:http://shanzhi.spbeen.com/index/

一、网站分析

  1. 1、首先该网站需要登录,
  2. 2、登录之后获取网页源码
  3. 3、找到字体文件并找到替换关系替换爬取下来的数据,处理得到正常的数据
  4. 如何找到字体文件:
  5. 1 定位找到进行了字体反爬的位置,在对应的styles里找到font-family
  6. 2、复制font-family里面的值,去网页源码里搜索
  7. 3、在搜索结果附近找到xxx.ttf这样的url进行下载
  8. 如何需要通过python去读取识别字体文件里面的内容
  9. pip install fontTools -i https://pypi.tuna.tsinghua.edu.cn/simple

二、程序实现

1、登录

  1. from fontTools.ttLib import TTFont
  2. from lxml import etree
  3. from tools import get_js
  4. import requests
  5. # 获取网页源码
  6. url = 'http://shanzhi.spbeen.com/login/'
  7. # 请求头
  8. header = {
  9. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36',
  10. 'Cookie': 'shanzhi_kmer=h9wm0ptr9kcuza527as3a43a6zuwzsid; csrftoken=yHdq0AaPEO1pyiC2zji4MmeyLRNcXVcZLNoHCT3izQ52lwvASvHv0jgsGG9kEXUN'
  11. }
  12. # 先从网页源码中得到csrfmiddlewaretoken和pk
  13. # tips:以后看到token 下意识去网页源码中找
  14. reponse_obj = requests.get(url, headers=header)
  15. # print(reponse_obj.text)
  16. # 加载一个element对象
  17. tree = etree.HTML(reponse_obj.text)
  18. # 获取csrfmiddlewaretoken
  19. csrfmiddlewaretoken = tree.xpath('//input[@name="csrfmiddlewaretoken"]/@value')[0]
  20. # 获取pk
  21. pk = tree.xpath('//input[@id="pk"]/@value')[0]
  22. # pk就是公钥
  23. # pk = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaP+rYm6rqTMP565UmMU6YXq46KtAN3zwDSO8LNa15p0lJfsaY8jXY7iLsZqQZrGYr2Aayp6hYZy+Q+AMB/VUiSpD9ojPyOQ7r9jsf9jZbTOL4kj6iLZn37fEhp4eLvRgy5EJCyQoFyLCsgLechBTlYl2eA95C3j4ZUFhiV6WFHQIDAQAB"
  24. old_password = 'logic_00' 密码
  25. # 使用js环境进行的加密处理
  26. # 这里引入了tools.py文件中的get_js方法,用于执行js
  27. password = get_js('./shanzhi.js', 'doLogin', old_password, pk)
  28. data_dict = {
  29. 'username': 'logic_00',
  30. 'password': password,
  31. 'csrfmiddlewaretoken': csrfmiddlewaretoken
  32. }
  33. res = requests.post(url, headers=header, data=data_dict)
  34. # res.text 是待替换的源码
  35. html = res.text
  1. import execjs
  2. def get_js(file_name,fun_name,*args):
  3. with open(file_name,'r',encoding='utf-8') as file_obj:
  4. js_code = file_obj.read()
  5. # 1、编译js文件
  6. cjs = execjs.compile(js_code)
  7. # 2、 执行js代码
  8. return cjs.call(fun_name,*args)
  1. // 引用安装node-jsencrypt
  2. 1CD进入项目目录
  3. 2、做国内资源隐射:npm install -g cnpm --registry=https://registry.npm.taobao.org
  4. 3、安装:cnpm install node-jsencrypt
  5. const JSEncrypt = require('node-jsencrypt');
  6. function doLogin(pass_old, pk) {
  7. var password_old = pass_old;
  8. var encrypt = new JSEncrypt();
  9. var public_key = pk;
  10. encrypt.setPublicKey(public_key);
  11. var pass_new = encrypt.encrypt(password_old);
  12. return pass_new;
  13. }

2、通过替换字典替换到真实数据

  1. for k, v in replace_dict.items():
  2. # TypeError: replace() argument 2 must be str, not int
  3. html = html.replace(k, v)
  4. print(html)