练习题,第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('', "0").replace('', "1").replace('', "2") \
.replace('', "3").replace('', "4").replace('', "5") \
.replace('', "6").replace('', "7").replace('', "8") \
.replace('', "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))