58同城 房产字体 反爬

该博客详细介绍了如何从58同城房产页面中获取字体文件,然后进行base64解码并分析字体映射关系。通过正则表达式提取字体内容,使用fontTools库解析字体文件为XML,进一步理解数字与字体编码之间的关系。最后,展示了如何使用lxml库解析HTML,提取页面标题。整个过程涉及网络请求、正则、编码解码、字体解析及网页内容提取等技术。
摘要由CSDN通过智能技术生成

58同城 房产字体 反爬

  1. 获取HTML

    url = "https://sz.58.com/zufang/"
    
    UA = {
    	"referer": "https://www.google.com/",
    	"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36"
    }
    
    html = requests.get(url=url, headers=UA)
    html.encoding="utf-8"
    
    ret = html.text
    with open('58-fangchan.txt', "w", encoding="utf-8") as f:
    	f.write(ret)
    
  2. 获取字体文件

    # 1. 获取字体文件,
    with open("58-fangchan.txt", "r", encoding='utf-8') as f:
    	content = f.read()
    
    font_face = re.search(r"base64,(.*?)'\)", content).group(1)
    
  3. 转换 xml, 分析关系

    from fontTools.ttLib import TTFont
    
    font = TTFont("./b-58fangchan字体.ttf")
    font.saveXML("b-58fangchan字体.xml")
    
    
    
  4. 字体的映射关系

    通过,我们反复分析,得出数字取出 减1 
    
  5. 全部代码

    import base64
    import io
    import re
    from lxml import etree
    
    from fontTools.ttLib import TTFont
    
    import requests
    
    # ret = base64.b64decode(font_face)
    # with open('58fangchan.ttf', 'wb') as f:
    # 	f.write(ret)
    
    # font = TTFont(ret)
    # font.saveXML('b-58.xml')
    
    
    
    url = "https://sz.58.com/zufang/"
    
    UA = {
    	"referer": "https://www.google.com/",
    	"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36"
    }
    
    # html = requests.get(url=url, headers=UA)
    # html.encoding="utf-8"
    #
    # ret = html.text
    # with open('58-fangchan.txt', "w", encoding="utf-8") as f:
    # 	f.write(ret)
    
    
    # 1. 获取字体文件,
    with open("58-fangchan.txt", "r", encoding='utf-8') as f:
    	content = f.read()
    
    font_face = re.search(r"base64,(.*?)'\)", content).group(1)
    # print(font_face)
    
    # 2. base64 解码
    ret = base64.b64decode(font_face)
    
    font = TTFont(io.BytesIO(ret))
    
    bestcmap = font['cmap'].getBestCmap()
    
    for k, v in bestcmap.items():
    	# print(k)
    	# print(v)
    	# k 此时 是10 进制 ,转成 16进制
    	k = hex(k)
    	k = k.replace('0x', '&#x') + ";"
    	# 通过,分析得出,取出v, -1 就对应数字
    	v = int(re.search(r'(\d+)', v).group(0)) -1
    	print(k)
    	print(v)
    	if k in content:
    		content = content.replace(k, str(v))
    #
    # print(content)
    # # 3 .获取 标题 ,
    resp = etree.HTML(content)
    
    lis = resp.xpath("//ul[@class='listUl']/li")
    for li in lis:
        title = li.xpath('./div[@class="des"]/h2/a/text()')
        if title:
            title = title[0]
            print(title)
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值