练习题,第12题,

静态css反爬,利用字体
反爬原理:
1、主要利用font-family属性,例如设置为my-font
2、在HTML里面不常见(不可读)的unicode
3、在CSS字体(my-font)中将其映射到常见(可读)到字体,例如数字
4、爬虫在抓取数据的时候只能抓到unicode,而不是真实的数据


应对措施
1、下载woff字体文件,转化为tff文件
2、用百度字体编辑器打开tff文件,并确定其unicode与其实际的映射关系
3、将下载的HTML内容按照映射关系替换
4、解析HTML并获取正确的数据


难点:
有些网站会动态生成woff,这种反爬措施比较难以自动化绕开

重点,将woff文件转换为xml文件

找到这个字体文件,

使用python将woff文件转换为xml文件

中间需要安装一个工具,

pip install fontTools

import os
import requests
from fontTools.ttLib import TTFont
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
url = "https://www.python-spider.com/static/font/challenge12/aiding.woff"
resp = requests.get(url=url)
with open("aiding.woff", "wb") as f:
    f.write(resp.content)
    f.close()
font = TTFont("aiding.woff")
font.saveXML("aiding.xml")  # 转换为xml文件

实际上,这个题,不需要知道这个css字体也是没有问题的,

因为数字都是固定的,所以可以直接做替换就可以了,

这个题难度不大

import requests
import time
import json
import urllib3
urllib3.disable_warnings()
url = "https://www.python-spider.com/api/challenge12"
headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                          '(KHTML, like Gecko) Ubuntu Chromium/60.0.3112.113 Chrome/60.0.3112.113 Safari/537.36',
all_page_sum = []
for page in range(1,101):
    time.sleep(1)
    data = {
        "page":page
    resp = requests.post(url, headers=headers, data=data, verify=False)
    # print(resp.text)
    text_json = json.loads(resp.text)
    # print(text_json["data"])
    list1 = []
    for i in text_json["data"]:
        # print(i["value"])
        list1.append(i["value"])
    list2 = []
    for i in list1:
        str1 = i \
            .replace('&#xf712', "0").replace('&#xe458', "1").replace('&#xf375', "2") \
            .replace('&#xf80c', "3").replace('&#xf12f', "4").replace('&#xee4a', "5") \
            .replace('&#xf295', "6").replace('&#xe449', "7").replace('&#xf0d6', "8") \
            .replace('&#xe44d', "9").replace(" ", "")
        list2.append(int(str1))
    # print(list2)
    all_page_sum.append(sum(list2))
    print("第 {} 页的合计".format(page),sum(list2))
print("all page sum ",sum(all_page_sum))