0125编程-58租房网爬虫-字体反爬破解

点击这里进入人工智能嘚吧嘚目录,观看全部文章


58同城租房网采用了字体反爬机制,利用字体对页面上的部分数字(如房价、面积平米数)进行了加密处理。

下面的代码包含了爬取房源基本信息并保存为文件的全部代码,在mac下运行有效,windows系统需要参照这里做些必要调整

以下是抓取房源列表页面并保存为多个html文件,注意更换你的headers内容。

header_str='''
accept: text/html
...
user-agent: Mozilla/5.0
'''
#字符串转dict
def str2dict(s,s1=';',s2='='):
    li=s.split(s1)
    res={}
    for kv in li:
        li2=kv.split(s2)
        if len(li2)>1:
            res[li2[0]]=li2[1]
    return res
headers=str2dict(header_str,'\n',': ')
#每页保存为本地html页面待用

import requests
import time

#地址为苏州市
urlstr = 'https://su.58.com/zufang/pn2/?PGTID=0d300008-0000-5965-8ce1-1873463f7758&ClickID={}'


def getPages(n, m):
    for i in range(n, m):
        print('GETING...', i)
        url = urlstr.format(i)
        res = requests.get(url, headers=headers)
        with open(r'./pages/{}.html'.format(i), 'w') as f:
            f.write(res.text)
        time.sleep(1)
    print('OK!')

getPages(9, 10)

以下是用于破解字体反爬加密的代码。
需要先安装模块,conda install -c mwcraig fonttools

from fontTools.ttLib import TTFont
import base64
import re
import io


def getKey(script):
    try:
        return re.findall(r"base64,(.*)'\).format", script)[0]
    except:
        return None


def getFont(key):
    data = base64.b64decode(key)
    fonts = TTFont(io.BytesIO(data))
    return fonts.getBestCmap()


def getDigit(str):
    d = re.findall(r'(\d+)', str)[0]
    return int(d) - 1


def getRealValue(script, string):
    key = getKey(script)
    fontMap = getFont(key)
    newMap = dict()
    #微软雅黑的对应的编码
    font58 = {
        '閏': '0x958f',
        '鸺': '0x9e3a',
        '麣': '0x9ea3',
        '餼': '0x993c',
        '鑶': '0x9476',
        '龤': '0x9fa4',
        '齤': '0x9f64',
        '龥': '0x9fa5',
        '龒': '0x9f92',
        '驋': '0x9a4b',
    }
    for key in fontMap.keys():
        value = getDigit(fontMap[key])
        key = hex(key)
        newMap[key] = value
    result = ''
    for char in string:
        temp = font58[char]
        value = newMap[temp]
        result = '%s%d' % (result, value)
    return int(result)

以下是从本地html文件读取数据并解密其中的数字。

from bs4 import BeautifulSoup
import os

files = os.listdir(r'./pages/')
file_li = [r'./pages/' + s for s in files]

items = []

for fp in file_li:
    with open(fp, 'r') as f:
        html = f.read()
        soup = BeautifulSoup(html)
        li = soup.find('ul', 'listUl').find_all('li')[:-1]
        script = soup.find('head').find_all('script')[-1:]

        for item in li:
            title = item.find('h2').text.strip()
            money = item.find('div', 'money').b.text.strip()
            money = getRealValue(script[0].text, money)
            roomtag = item.find('p', 'room strongbox')
            m2 = roomtag.text.split(' ')[-1:][0].replace('\xa0', '').replace(
                '㎡', '')
            m2li = m2.split('.')
            m2li2 = []
            for m in m2li:
                m2li2.append(str(getRealValue(script[0].text, m)))
            size = '.'.join(m2li2)

            items.append(dict(
                title=title,
                money=money,
                size=size,
            ))
print('OK!')

最后是将items对象写入json文件并测试读取。

import json
with open('items.json', 'w') as f:
    f.write(json.dumps(items))
print('Write OK!')
with open('items.json', 'r') as f:
    readItems=json.loads(f.read())
    print(readItems[10])
print('Read OK!')

点击这里进入人工智能DBD嘚吧嘚目录,观看全部文章


每个人的智能新时代

如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~


END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容