前言:这一期,是针对起点中文网的作品详情页爬取,这是对woff反爬的入门,相对美团之类的字体反爬容易一些。短短的几十行代码,逻辑清晰!让你欲罢不能的关注我!有人就要说了,我已经会爬取小说内容,干嘛要爬它,我还是那句话,一切为了提高自己技术!
一:分析页面
今天的主角就是《明朝败家子》这本书确实写得很不错!代入感很强,最主要喜欢大明王朝!额~跑题了!🐷
1)打开开发者工具,看到这儿字体显示不出来,请求出来也是一个&#xxxxx;这儿就是反扒机制:woff
2)woff文件一般都在css里面:
二:解题步骤
1)我的思路就是先保存HTML和woff(因为有点懒,懒得去把字爬出来,保存html文档简单快捷)
建议:不要学我,xpath这儿我直接复制浏览器的,图方便,还是自己弄,锻炼一下
记得保存的时候需要用“utf-8”不然有可能乱码
import requests
from lxml import etree
import re
from fontTools.ttLib import TTFont
def get_html_woff():
# 保存html文档
url = "https://book.qidian.com/info/1011705052"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
response = requests.get(url, headers=headers).text
txt = open("起点.html", "w",encoding="utf-8")
txt.write(response)
txt.close()
# 保存woof文档
woff = etree.HTML(response)
woff_file = str(woff.xpath("/html/body/div/div[5]/div[1]/div[2]/p[3]/em[1]/style/text()"))
woff_url = re.findall("url\('(.*?)'\)", woff_file)[1]
woff_response = requests.get(url=woff_url, headers=headers).content
fp = open("up_dian.woff", 'wb')
fp.write(woff_response)
这儿使用的软件“FontCreatorPortable”查看woff字体 html的✪就是woff字
如果向看得详细一点,可以保存为xml文件,查看
font.saveXML("xxxx.xml")
2)接下来也就简单了,用fontTools库读取woff,组成一个新的字典,替换掉html里的字体
(代码与上面连接的)
def new_html(): font = TTFont("up_dian.woff") # 打开woff文件 font = font.getBestCmap() # 以字典的方式返回woff new_value = {} d = {} woff_dict = {'.notdef': ' ', 'period': '.', 'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9} # 键和值反转 for key, value in font.items(): d[value] = key # 组成新的字典 for i in woff_dict: for j in d: if i == j: new_value.update({"&#" + str(d[j]) + ";": woff_dict[i]}) txt = open("起点.html", "r", encoding="utf-8").read() for ch in new_value.items(): txt = txt.replace(str(ch[0]), str(ch[1])) new_html = open("new_起点.html",'w',encoding='utf-8') new_html.write(txt) if __name__ == '__main__': print("[***]正在解析...") get_html_woff() new_html() print("[***]解析成功...")
3)成果:这不就出来了嘛!
结束语:嗯~是太简单了点
这也只是入门,“天晴了,雨停了,你又觉得你行了的”,去尝试美团吧!思路大致差不多。可以@我,出美团教程!
继续努力!