? ? ? ? 寒暄一下辉巡,本人剛?cè)腴Tpython不久,非常喜歡爬蟲蕊退,平時沒事兒的時候就喜歡研究一下郊楣,最近一個月一直在研究字體憔恳,想一步一步的把字體解析相關(guān)的知識都學(xué)一下,今天先分享一下研究了倆禮拜的字體反爬净蚤,代碼結(jié)構(gòu)寫的比較初級喇嘱,僅是交流,廢話比較多塞栅,只是交流想法和經(jīng)驗者铜,不喜勿噴。
? ? ? ? 此前爬取大眾點評的時候其實難度不大放椰,xpath就能解決作烟,從18年12月前后開始增加了字體的反爬,反爬技術(shù)更新了好幾次砾医,此前的就不寫了拿撩,現(xiàn)在在研究最新的。如下僅供學(xué)習(xí)參考如蚜,不允許作為商業(yè)用途压恒,內(nèi)容為基本邏輯+局部代碼,邏輯通了代碼肯定是沒問題的错邦,知識得自己一點一點積累探赫,大家加油吧。
? ? ? ? 還有撬呢,這個腳本并不健壯伦吠,比如可能會存在list為空,讀取值得時候報錯的問題等魂拦,這些你自己加條件控制就好了毛仪,各有各的寫法,大家好自珍重芯勘,健壯的腳本需要后續(xù)一點一點補充和維護箱靴。
? ? ? ? 先貼結(jié)果鎮(zhèn)樓
? ? ? ? {
? ? ? ? 'address': '鼓樓東大街202號',
? ? ? ? 'area': '南鑼鼓巷/鼓樓東大街',
? ? ? ? 'ave_price': '¥23',
? ? ? ? 'fuwu': '8.8',
? ? ? ? 'huanjing': '8.1',
? ? ? ? 'kouwei': '9.1',
? ? ? ? 'title': '楊記烤肉',
? ? ? ? 'url': 'http://www.dianping.com/shop/22069001'
? ? ? ? }
如下只介紹美食頁的一頁數(shù)據(jù),例入:http://www.dianping.com/search/keyword/2/10_烤串
? ? ? ? 如下粘貼的所有代碼都是基于scrapy框架的荷愕,所以如果要用普通的xpath衡怀,請自己根據(jù)思路轉(zhuǎn)換,還是那句話路翻,多琢磨琢磨邏輯關(guān)系比粘來就用強千百倍狈癞。
爬取思路:
1、先貼引用的庫茂契,前兩個是引用的scrapy的庫蝶桶,第三個是正則表達(dá)式,第四是requests掉冶,最后一個是字體的處理庫真竖。
# -*- coding: utf-8 -*-
import scrapy
from dianping.items import DianpingItem
import re
import requests
import json
from fontTools.ttLib import TTFont
2脐雪、讀取頁面源碼,選取想要爬取的網(wǎng)頁元素恢共,使用xpath定位爬日角铩;
def parse(self, response):
? ? ? ? for each in response.xpath('//*[@id="shop-all-list"]/ul/li'):
? ? ? ? item = DianpingItem()
? ? ? ? item['title'] = each.xpath('div[2]/div[1]/a[1]/h4/text()').extract()[0]
? ? ? ? item['url'] = each.xpath('div[1]/a/@href').extract()[0]
? ? ? ? ……
3讨韭、打印結(jié)果發(fā)現(xiàn)地址脂信、商圈、客單價透硝、評分位置打印出來的結(jié)果不完整狰闪,開發(fā)者工具選取位置看到如下圖的格式,此時經(jīng)過多方查找資料以后搞明白了這是一種字體反爬技術(shù)濒生。頁面通過css技術(shù)傳入一組字體文件埋泵,這些字體文件都是提前通過字體軟件裁剪好的文件,通過css將網(wǎng)頁中的unicode的編碼轉(zhuǎn)換為指定的文字罪治。如果不通過css轉(zhuǎn)碼丽声,展示的效果就會如下圖3-1所示。
此處普及一個關(guān)于unicode的知識觉义,就是操作系統(tǒng)雁社、word和瀏覽器等之所以能夠識別不同的字體文件中的文字,是因為他們所有的文字都用統(tǒng)一的unicode谁撼,所以電腦并不是讀懂了文字歧胁,而是讀懂了unicode滋饲,然后轉(zhuǎn)換為了文字厉碟。字體反爬用到的字體包里的文字和unicode是不對應(yīng)的,所以瀏覽器才會不識別屠缭,換言之就是說字體反爬使用的字體包中漢字對應(yīng)的uniciode不是正常的真實的那個碼箍鼓,是程序員在unicode的后面找了一些碼給硬安排上的,所以顯示出來可能是個正常的不認(rèn)識的符號或別國文字呵曹,或者索性就是框框款咖。
繼續(xù),此處接觸問題的基本思路是找到字庫文件奄喂,找到字庫文件中unicode和漢字的對應(yīng)關(guān)系铐殃,然后替換掉異常的unicode。
(1)找到css的位置跨新,如下圖3-1地址位置有五個字是顯示異常的富腊,而且格式很一致,都使用css域帐。如圖3-2找到對應(yīng)的css赘被。
這塊看不出來是整,直接對著頁面右鍵查看源碼,找到這個css民假,圖3-3
(2)打開這個css浮入,內(nèi)容如下:
@font-face{font-family: "PingFangSC-Regular-shopNum";src:url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/620c796e.eot");src:url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/620c796e.eot?#iefix") format("embedded-opentype"),url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/620c796e.woff");} .shopNum{font-family: 'PingFangSC-Regular-shopNum';}@font-face{font-family: "PingFangSC-Regular-address";src:url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/e8ac2205.eot");src:url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/e8ac2205.eot?#iefix") format("embedded-opentype"),url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/e8ac2205.woff");} .address{font-family: 'PingFangSC-Regular-address';}@font-face{font-family: "PingFangSC-Regular-reviewTag";src:url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/8dae1f86.eot");src:url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/8dae1f86.eot?#iefix") format("embedded-opentype"),url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/8dae1f86.woff");} .reviewTag{font-family: 'PingFangSC-Regular-reviewTag';}@font-face{font-family: "PingFangSC-Regular-tagName";src:url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/ca8f6119.eot");src:url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/ca8f6119.eot?#iefix") format("embedded-opentype"),url("http://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/ca8f6119.woff");} .tagName{font-family: 'PingFangSC-Regular-tagName';}
這塊叨逼叨兩句,如上每個json里都有好幾個字體文件羊异,這塊是因為瀏覽器兼容的問題造成的事秀,不知道原因的自行百度。
嘗試下載字體包野舶,可以使用百度字體編輯器(http://fontstore.baidu.com/static/editor/index.html)打開秽晚,也可以使用fontcreator軟件打開(如下圖3-4是軟件打開的效果)。
打開以后我嚇了一大跳筒愚,這個字體包字兒真多赴蝇,一共603個,我下載了4個巢掺,此后又下了9個句伶,發(fā)現(xiàn)都一樣有603字,而每個字體包中字對應(yīng)的unicode一般都不一樣陆淀,此處留個梗考余,看下一段。
css的地址會隨時間變化轧苫,所以系統(tǒng)可能隨機生成了很多字體包楚堤,每一個css中我們會發(fā)現(xiàn)是4組字體,在這塊我大概停留了一個禮拜的時間含懊,這個節(jié)點有幾個思考和嘗試身冬,首先我們看到這個字體包是PingFangSC-Regular,我在思考是否可以直接用完整的字體包來解析岔乔,而省去找對應(yīng)關(guān)系的尷尬酥筝,因為這塊其實就是讀取woff文件,然后找到字形相關(guān)的參數(shù)做對比雏门,如果字形參數(shù)一致就認(rèn)作是同一個字嘿歌,然后返回最新的字和unicode對應(yīng)關(guān)系,所以在這個節(jié)點上需要一個我們已知對應(yīng)關(guān)系的字體庫茁影。而正常的字體庫的漢字和unicode的對應(yīng)關(guān)系是一定的宙帝,因此我自己還專門給自己建了一個unicode對照表……經(jīng)過一番折騰以后發(fā)現(xiàn)……30多款pingfang字體庫沒有一個字體庫里的漢字能夠和下載下來的woff字形文件匹配的上!D枷小步脓!點評的程序員哥哥們做的有點絕了,所以我自己只能把603個字符和unicode的對應(yīng)關(guān)系一個一個敲出來(一會附上)。
第二個思考就是這個字體文件里都裝些啥玩意沪编,我該怎么處理這些信息并提煉出我想要的信息呢呼盆?查了大量資料,python用到了一個三方庫fonttools蚁廓,先把woff或者ttf文件轉(zhuǎn)化為xml访圃,打開xml會發(fā)現(xiàn)字體文件其實都是一些對應(yīng)關(guān)系,自己找個工具動動手自己解析看看相嵌,我們能用到的就是unicode和對應(yīng)的字形信息腿时,所謂字形信息像是一些坐標(biāo),一些工具讀出來可能就是個漢字或者漢字圖饭宾,至于怎么讀并不重要批糟,c或者java應(yīng)該都能實現(xiàn),這個也是我后續(xù)研究的課題看铆,暫時略過徽鼎,你們自己再pycharm上調(diào)用fonttools庫,引用的時候會自己彈出來一堆函數(shù)弹惦,可以挨個試試得出來的結(jié)果否淤,我就是這么自己琢磨的,我使用fonttools 主要是干兩件事1是找到unicode棠隐,2是找到unicode對應(yīng)的字形信息石抡。
(3)使用正則表達(dá)式提取woff鏈接
如下是代碼(獲取css、下載和解析woff)
def parse(self, response):
? ? ? ? #print(response.text)
? ? ? ? #正則表達(dá)式獲取css鏈接
? ? ? ? css_url="http:" + re.findall(r'(//.+svgtext.+\.css)',response.body.decode('utf-8'))[0]
? ? ? ? #css_url="http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/c6477fbab101bee5040777e08a62e13c.css"
? ? ? ? #print(css_url)
? ? ? ? css_res = requests.get(css_url).text
? ? ? ? #print(css_res)
? ? ? ? #print(css_res)
? ? ? ? #正則表達(dá)式獲取class信息和url
? ? ? ? font_infos = re.findall('@font-face\{(.*?)\}', css_res)
? ? ? ? # print(font_infos)
? ? ? ? json_woff = {}
? ? ? ? for font_info in font_infos:
? ? ? ? ? ? ? ? # print(font_info)
? ? ? ? ? ? ? ? font_family = re.findall('font-family: "(.*?)";src', font_info, re.S)[0]
? ? ? ? ? ? ? ? font_type = re.findall('.*-([^-]*)";src', font_info, re.S)[0]
? ? ? ? ? ? ? ? woff_url ="http:" + re.findall('\),url\("(.*?)"\);', font_info, re.S)[0]
? ? ? ? ? ? ? ? woff_name = re.findall('[^/]+(?!.*/)', woff_url, re.S)[0]
? ? ? ? ? ? ? ? #print(font_family, font_type, woff_url, woff_name)
? ? ? ? ? ? ? ? #將解析后的url讀取存在本地助泽,并將對應(yīng)關(guān)系存入json
? ? ? ? ? ? ? ? path ="D:\\mywork\\project\\dianping\\dianping\\font\\" + woff_name
? ? ? ? ? ? ? ? r = requests.get(woff_url)
? ? ? ? ? ? ? ? with open(path, "wb")as f:
? ? ? ? ? ? ? ? ? ? f.write(r.content)
? ? ? ? ? ? ? ? ? ? f.close()
? ? ? ? ? ? ? ? json_woff[font_type] = path
? ? ? ? ? ? ? ? #print(json_woff)
? ? ? ? ? ? ? ? #如下是分類處理字體文件找到unicode和字符的最新對照啰扛,后面會有parse_font的內(nèi)容。
? ? ? ? ? ? ? ? address_temp = font_tool.parse_font(json_woff['address'])
? ? ? ? ? ? ? ? shopNum_temp = font_tool.parse_font(json_woff['shopNum'])
? ? ? ? ? ? ? ? reviewTag_temp = font_tool.parse_font(json_woff['reviewTag'])
? ? ? ? ? ? ? ? tagName_temp = font_tool.parse_font(json_woff['tagName'])
4嗡贺、處理woff字體文件
這塊信息量非常大隐解,邏輯簡述一下
(1)找一個已經(jīng)下載的woff作為基礎(chǔ)庫,然后用軟件打開人工一個一個敲出來unicode和字符的對應(yīng)關(guān)系暑刃,按照對應(yīng)順序做倆list厢漩,把這些信息都放進去;
# 讀取文件名與css名稱做匹配
baseFonts = TTFont("D:\\mywork\\project\\dianping\\dianping\\font\\" +"first" +".woff")
uni_num = ['unied61', 'unie6a6', 'unie001', 'unie621', 'unie5b0', 'unif4d1', 'unie1be', 'unif274', 'unif46d',
? ? ? ? ? 'uniefeb', 'uniebb0', 'unie2d2', 'unie964', 'unie878', 'unie667', 'unie8bf', 'uniea3c', 'unie6f5',
? ? ? ? ? 'unie4f0', 'unif6d7', 'unieffd', 'unie13f', 'unif843', 'unie184', 'unie2a9', 'unif723', 'unie683',
? ? ? ? ? 'unif3a3', 'uniee31', 'unif345', 'unie0c8', 'unie919', 'unie9dd', 'unif2b6', 'unif113', 'unif313',
? ? ? ? ? 'unie01e', 'unie4db', 'unie5e9', 'unie42a', 'unif13f', 'unif064', 'unie443', 'uniebfb', 'unie832',
? ? ? ? ? 'uniefa3', 'unif01b', 'unie6be', 'unif885', 'unie455', 'unif434', 'unif6f8', 'unif68f', 'uniee42',
? ? ? ? ? 'unif355', 'unie7c0', 'unif70d', 'unie67d', 'uniebcc', 'unie70c', 'unieddd', 'unie34c', 'unie0b7',
? ? ? ? ? 'unie61e', 'unif65c', 'unie0b0', 'unie1c6', 'unif19e', 'unie19d', 'unif06e', 'unif846', 'unieb78',
? ? ? ? ? 'uniee32', 'unie5a1', 'uniedba', 'unie2bf', 'unief45', 'unie567', 'unie821', 'unie754', 'unie387',
? ? ? ? ? 'unif4bc', 'unied86', 'unie6f4', 'unif8d3', 'unie93a', 'uniea13', 'uniee66', 'unif361', 'uniecbf',
? ? ? ? ? 'unif4d5', 'unif5ef', 'unie4b9', 'unie132', 'unif889', 'uniec13', 'unie65d', 'unif711', 'unie923',
? ? ? ? ? 'uniede0', 'unie54b', 'unief3f', 'unie3d7', 'unie1dc', 'unif09c', 'unie363', 'unie105', 'unie5c4',
? ? ? ? ? 'unieda4', 'uniefe4', 'unie20d', 'unie3cc', 'unie7bf', 'unie61d', 'unif573', 'unie4d6', 'unie52c',
? ? ? ? ? 'unif89e', 'unie84d', 'unie682', 'unie4c1', 'unie7a9', 'unie2de', 'unie03a', 'unif607', 'unif161',
? ? ? ? ? 'uniea8b', 'unied77', 'unif737', 'unif6e2', 'unif76e', 'unif181', 'unieb64', 'unieff3', 'unif0de',
? ? ? ? ? 'unie052', 'unif74c', 'unie580', 'uniedeb', 'unif767', 'unieea9', 'unif016', 'unied74', 'unif483',
? ? ? ? ? 'unieb44', 'unif19a', 'unieabb', 'unie8ae', 'unie6ed', 'unie223', 'unie5b8', 'unie59d', 'unie1bb',
? ? ? ? ? 'unie4f2', 'unie992', 'unie0a9', 'uniea6e', 'unied2d', 'unie41c', 'uniee20', 'unie1a0', 'unif670',
? ? ? ? ? 'unie6cd', 'unie570', 'unie357', 'unif71b', 'unif11c', 'unie034', 'unif029', 'unif3c7', 'unie938',
? ? ? ? ? 'unie173', 'unie0a1', 'unie5b7', 'unif353', 'unie413', 'unie8a2', 'unif32a', 'unif30b', 'uniefc7',
? ? ? ? ? 'unie66d', 'unieaf9', 'unie43a', 'unie677', 'unie328', 'unif0c1', 'unie451', 'unif1ea', 'unif035',
? ? ? ? ? 'unie0e9', 'unie932', 'unie545', 'uniea1e', 'unie800', 'unif5b0', 'unie71c', 'unif31f', 'unif684',
? ? ? ? ? 'unif481', 'uniec32', 'unif504', 'unieb13', 'unieb3d', 'unif014', 'unif873', 'unif5ba', 'unif79b',
? ? ? ? ? 'unie804', 'unie39e', 'unied9c', 'unif357', 'unie6c9', 'unie98c', 'uniec38', 'unie41d', 'unif4ec',
? ? ? ? ? 'unif0b3', 'unif5cc', 'uniea87', 'unie399', 'unif7ba', 'unif0ab', 'unieaef', 'unie537', 'unif808',
? ? ? ? ? 'unief25', 'unif4e4', 'uniecef', 'unif725', 'unieca2', 'unie2e7', 'unif67b', 'unif230', 'unie2cd',
? ? ? ? ? 'uniefc8', 'unif44d', 'uniee34', 'unif726', 'unie325', 'unif775', 'unieed0', 'unie7ae', 'unie469',
? ? ? ? ? 'unif207', 'unieb9c', 'unif5fa', 'unie765', 'unif092', 'unie4e9', 'unie38b', 'unie649', 'unief42',
? ? ? ? ? 'unie706', 'uniefdd', 'unie2d1', 'unied57', 'unif0c9', 'unie4ba', 'unie795', 'unie4e1', 'unie0ef',
? ? ? ? ? 'unie653', 'unie4b2', 'unif123', 'unieff7', 'unif4d6', 'unieda3', 'unif6e4', 'unie613', 'unif7cc',
? ? ? ? ? 'unie685', 'unieafc', 'unif32c', 'unie0f4', 'uniec8a', 'unif42b', 'unie09b', 'uniea20', 'unied6e',
? ? ? ? ? 'unie098', 'unie68d', 'unieb3e', 'unie867', 'unif307', 'unif85f', 'unie7cd', 'unie0af', 'unif6da',
? ? ? ? ? 'uniea55', 'unie0ca', 'unif636', 'unif152', 'unif7e1', 'unie85d', 'unif2ff', 'unie436', 'unie278',
? ? ? ? ? 'unie6d9', 'unie0d5', 'unie99d', 'unif827', 'unie761', 'unif344', 'unif640', 'unie030', 'unie06d',
? ? ? ? ? 'unie02f', 'unie3cd', 'unie2cb', 'unie7a6', 'unie5f3', 'unieca8', 'unif55b', 'unieddb', 'unif86d',
? ? ? ? ? 'unieb40', 'unieabf', 'unif241', 'unief05', 'uniefcb', 'unie82c', 'unied15', 'unie7ff', 'unif285',
? ? ? ? ? 'unie8c2', 'unif639', 'unie70b', 'unif1c7', 'unif44f', 'unif093', 'unief15', 'uniefd5', 'unif3f5',
? ? ? ? ? 'unief50', 'unie064', 'unif84f', 'uniee97', 'unif8f9', 'unie033', 'unie9be', 'unif63f', 'uniea6f',
? ? ? ? ? 'unif884', 'unie943', 'unieafb', 'unif267', 'unif2d7', 'unif0da', 'unie3eb', 'uniecea', 'unif55a',
? ? ? ? ? 'uniee99', 'unie10c', 'unie4f8', 'unif047', 'uniefb8', 'unif4cd', 'unie448', 'unie078', 'unif336',
? ? ? ? ? 'unie0cf', 'unieab1', 'unie3ca', 'unieee7', 'uniebd3', 'uniedf0', 'unied4c', 'unie6ae', 'unief38',
? ? ? ? ? 'unie23d', 'unied99', 'unie42d', 'unif82b', 'unie8d9', 'unie0bf', 'unie79e', 'unie047', 'unif18d',
? ? ? ? ? 'uniebfc', 'unieaf3', 'unie89c', 'unif374', 'unie178', 'unie6b4', 'unie591', 'unie7eb', 'uniead8',
? ? ? ? ? 'unif34e', 'unie1ce', 'unieb36', 'unif119', 'uniefd6', 'unie8ed', 'unie33e', 'unied09', 'unie17a',
? ? ? ? ? 'unif820', 'unif293', 'unied0b', 'unie8a7', 'unif426', 'unif37f', 'unif1c6', 'unie93d', 'unif7bb',
? ? ? ? ? 'unie5c7', 'unif449', 'unif87e', 'unie782', 'unie138', 'unif747', 'unie1cb', 'unif543', 'unie4a1',
? ? ? ? ? 'unif34f', 'unie929', 'unie4a8', 'unif6dc', 'unie8fc', 'unif155', 'unief54', 'unie7f1', 'unie7af',
? ? ? ? ? 'unif303', 'unif6ae', 'unif33f', 'uniec80', 'uniecc7', 'unie6d0', 'uniefc6', 'unie8e8', 'unie828',
? ? ? ? ? 'unie585', 'unie35e', 'unie391', 'unie342', 'unif789', 'unif6d8', 'unie426', 'uniecc6', 'unif4e3',
? ? ? ? ? 'unif6c9', 'unif1e2', 'unif5b7', 'unif53e', 'unif7ec', 'unif317', 'unie51f', 'unie30e', 'unieaf6',
? ? ? ? ? 'unif25a', 'unif061', 'unif581', 'unif66a', 'unied62', 'unif0ad', 'unie7d2', 'unief67', 'unie799',
? ? ? ? ? 'unif036', 'unie3b3', 'unie83d', 'unif44c', 'unie356', 'unieba0', 'unie3c3', 'unief95', 'unie1cd',
? ? ? ? ? 'unie3db', 'unif23d', 'unie160', 'uniea5a', 'unif56b', 'unif309', 'uniede3', 'unie039', 'unif7be',
? ? ? ? ? 'unie33c', 'unif6c5', 'unied12', 'unie51d', 'unif6b8', 'unie986', 'uniec1e', 'unif09e', 'unif578',
? ? ? ? ? 'unie9bf', 'unie463', 'unie9f9', 'unif2d0', 'unieb55', 'unief2e', 'uniea44', 'unie6fa', 'unif563',
? ? ? ? ? 'unif0e8', 'unif814', 'unieee0', 'unif8ed', 'uniee64', 'unie57b', 'unie565', 'unie5be', 'unif0d6',
? ? ? ? ? 'unie161', 'unif89a', 'unieeaa', 'unied9a', 'unie3a9', 'unie967', 'unie5b2', 'unif675', 'unif3e7',
? ? ? ? ? 'unief9c', 'unie53c', 'unif565', 'unie54c', 'unie501', 'unie6c7', 'unif35c', 'unie7b2', 'unif654',
? ? ? ? ? 'unif6f5', 'unie796', 'uniedac', 'unie388', 'unif149', 'unie069', 'unief1a', 'unif38b', 'uniea08',
? ? ? ? ? 'unif2f7', 'unif52d', 'unie770', 'uniec96', 'uniec09', 'unie121', 'unie053', 'uniee24', 'unie1b9',
? ? ? ? ? 'unif739', 'unie020', 'unif146', 'uniee51', 'uniedef', 'unie956', 'unieaa1', 'unie548', 'unif304',
? ? ? ? ? 'uniea56', 'unie83c', 'unie3bf', 'unie137', 'unif188', 'uniea4d', 'unif421', 'unif30f', 'unie499',
? ? ? ? ? 'unie244', 'unie7f9', 'unif350', 'unie352', 'unif84c', 'unie256', 'unie58f', 'unieda2', 'unieab4',
? ? ? ? ? 'unif390', 'unie60b', 'unie0be', 'unie72a', 'uniea57', 'unif67a', 'unie280', 'unie1d1', 'uniedbf',
? ? ? ? ? 'unif007', 'unie3e8', 'unie9cf', 'unie616', 'uniee5b', 'unie51a', 'unif5e1', 'unif442', 'unie419',
? ? ? ? ? 'unif89f', 'unif5c7', 'unif6e6', 'unie37f', 'unie4c6', 'unieb7b', 'unif283', 'uniea71', 'unie7de',
? ? ? ? ? 'unif4b1', 'unie6e7', 'unie2d7', 'unie575', 'uniee71', 'unief31', 'unie273']
uni_name = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '店', '中', '美', '家', '館', '小', '車', '大', '市', '公',
? ? ? ? ? ? '酒', '行', '國', '品', '發(fā)', '電', '金', '心', '業(yè)', '商', '司', '超', '生', '裝', '園', '場', '食', '有', '新', '限',
? ? ? ? ? ? '天',
? ? ? ? ? ? '面', '工', '服', '海', '華', '水', '房', '飾', '城', '樂', '汽', '香', '部', '利', '子', '老', '藝', '花', '專', '東',
? ? ? ? ? ? '肉',
? ? ? ? ? ? '菜', '學(xué)', '福', '飯', '人', '百', '餐', '茶', '務(wù)', '通', '味', '所', '山', '區(qū)', '門', '藥', '銀', '農(nóng)', '龍', '停',
? ? ? ? ? ? '尚',
? ? ? ? ? ? '安', '廣', '鑫', '一', '容', '動', '南', '具', '源', '興', '鮮', '記', '時', '機', '烤', '文', '康', '信', '果', '陽',
? ? ? ? ? ? '理',
? ? ? ? ? ? '鍋', '寶', '達(dá)', '地', '兒', '衣', '特', '產(chǎn)', '西', '批', '坊', '州', '牛', '佳', '化', '五', '米', '修', '愛', '北',
? ? ? ? ? ? '養(yǎng)',
? ? ? ? ? ? '賣', '建', '材', '三', '會', '雞', '室', '紅', '站', '德', '王', '光', '名', '麗', '油', '院', '堂', '燒', '江', '社',
? ? ? ? ? ? '合',
? ? ? ? ? ? '星', '貨', '型', '村', '自', '科', '快', '便', '日', '民', '營', '和', '活', '童', '明', '器', '煙', '育', '賓', '精',
? ? ? ? ? ? '屋',
? ? ? ? ? ? '經(jīng)', '居', '莊', '石', '順', '林', '爾', '縣', '手', '廳', '銷', '用', '好', '客', '火', '雅', '盛', '體', '旅', '之',
? ? ? ? ? ? '鞋',
? ? ? ? ? ? '辣', '作', '粉', '包', '樓', '校', '魚', '平', '彩', '上', '吧', '保', '永', '萬', '物', '教', '吃', '設(shè)', '醫(yī)', '正',
? ? ? ? ? ? '造',
? ? ? ? ? ? '豐', '健', '點', '湯', '網(wǎng)', '慶', '技', '斯', '洗', '料', '配', '匯', '木', '緣', '加', '麻', '聯(lián)', '衛(wèi)', '川', '泰',
? ? ? ? ? ? '色',
? ? ? ? ? ? '世', '方', '寓', '風(fēng)', '幼', '羊', '燙', '來', '高', '廠', '蘭', '阿', '貝', '皮', '全', '女', '拉', '成', '云', '維',
? ? ? ? ? ? '貿(mào)',
? ? ? ? ? ? '道', '術(shù)', '運', '都', '口', '博', '河', '瑞', '宏', '京', '際', '路', '祥', '青', '鎮(zhèn)', '廚', '培', '力', '惠', '連',
? ? ? ? ? ? '馬',
? ? ? ? ? ? '鴻', '鋼', '訓(xùn)', '影', '甲', '助', '窗', '布', '富', '牌', '頭', '四', '多', '妝', '吉', '苑', '沙', '恒', '隆', '春',
? ? ? ? ? ? '干',
? ? ? ? ? ? '餅', '氏', '里', '二', '管', '誠', '制', '售', '嘉', '長', '軒', '雜', '副', '清', '計', '黃', '訓(xùn)', '太', '鴨', '號',
? ? ? ? ? ? '街',
? ? ? ? ? ? '交', '與', '叉', '附', '近', '層', '旁', '對', '巷', '棟', '環(huán)', '省', '橋', '湖', '段', '鄉(xiāng)', '廈', '府', '鋪', '內(nèi)',
? ? ? ? ? ? '側(cè)',
? ? ? ? ? ? '元', '購', '前', '幢', '濱', '處', '向', '座', '下', '県', '鳳', '港', '開', '關(guān)', '景', '泉', '塘', '放', '昌', '線',
? ? ? ? ? ? '灣',
? ? ? ? ? ? '政', '步', '寧', '解', '白', '田', '町', '溪', '十', '八', '古', '雙', '勝', '本', '單', '同', '九', '迎', '第', '臺',
? ? ? ? ? ? '玉',
? ? ? ? ? ? '錦', '底', '后', '七', '斜', '期', '武', '嶺', '松', '角', '紀(jì)', '朝', '峰', '六', '振', '珠', '局', '崗', '洲', '橫',
? ? ? ? ? ? '邊',
? ? ? ? ? ? '濟', '井', '辦', '漢', '代', '臨', '弄', '團', '外', '塔', '楊', '鐵', '浦', '字', '年', '島', '陵', '原', '梅', '進',
? ? ? ? ? ? '榮',
? ? ? ? ? ? '友', '虹', '央', '桂', '沿', '事', '津', '凱', '蓮', '丁', '秀', '柳', '集', '紫', '旗', '張', '谷', '的', '是', '不',
? ? ? ? ? ? '了',
? ? ? ? ? ? '很', '還', '個', '也', '這', '我', '就', '在', '以', '可', '到', '錯', '沒', '去', '過', '感', '次', '要', '比', '覺',
? ? ? ? ? ? '看',
? ? ? ? ? ? '得', '說', '常', '真', '們', '但', '最', '喜', '哈', '么', '別', '位', '能', '較', '境', '非', '為', '歡', '然', '他',
? ? ? ? ? ? '挺',
? ? ? ? ? ? '著', '價', '那', '意', '種', '想', '出', '員', '兩', '推', '做', '排', '實', '分', '間', '甜', '度', '起', '滿', '給',
? ? ? ? ? ? '熱',
? ? ? ? ? ? '完', '格', '薦', '喝', '等', '其', '再', '幾', '只', '現(xiàn)', '朋', '候', '樣', '直', '而', '買', '于', '般', '豆', '量',
? ? ? ? ? ? '選',
? ? ? ? ? ? '奶', '打', '每', '評', '少', '算', '又', '因', '情', '找', '些', '份', '置', '適', '什', '蛋', '師', '氣', '你', '姐',
? ? ? ? ? ? '棒',
? ? ? ? ? ? '試', '總', '定', '啊', '足', '級', '整', '帶', '蝦', '如', '態(tài)', '且', '嘗', '主', '話', '強', '當(dāng)', '更', '板', '知',
? ? ? ? ? ? '己',
? ? ? ? ? ? '無', '酸', '讓', '入', '啦', '式', '笑', '贊', '片', '醬', '差', '像', '提', '隊', '走', '嫩', '才', '剛', '午', '接',
? ? ? ? ? ? '重',
? ? ? ? ? ? '串', '回', '晚', '微', '周', '值', '費', '性', '桌', '拍', '跟', '塊', '調(diào)', '糕']
(2)把此后下載的任意一個woff字庫打開后去跟基礎(chǔ)庫做信息比對岩臣,比對兩個庫中字形信息完全一致的那個unicode,利用unicode反向去list中找對應(yīng)的字符宵膨,最終把最新的對應(yīng)關(guān)系存成json架谎。
#此處online是最新下載的woff,base是基礎(chǔ)庫
onlineFonts = TTFont(online_dir)
#這塊自己多print辟躏,這里baseFonts.getGlyphNames()是獲取的woff中去除第一個和最后一個的所有字符信息谷扣,第一個和最后一個都沒啥用
base_glyphNames = baseFonts.getGlyphNames()[1:-1]
online_glyphNames = onlineFonts.getGlyphNames()[1:-1]
temp = {}
#通過計算基礎(chǔ)list的長度來計算循環(huán)次數(shù)
a =len(uni_num)
for i in range(0, a):
? ? ? ? for j in range(0, a):
? ? ? ? ? ? ? ? #這里在比對字形是否一致
? ? ? ? ? ? ? ? if onlineFonts['glyf'][online_glyphNames[i]] == baseFonts['glyf'][base_glyphNames[j]]:
? ? ? ? ? ? ? ? ? ? ? #這里在遍歷list找到base_glyphNames[j]對應(yīng)的unicode對應(yīng)的k? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? for k in range(0,a):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if uni_num[k]==base_glyphNames[j]:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? temp["u" + online_glyphNames[i][3:].lower()] = uni_name[k]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pass
? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? ? ? pass
5、字體替換
這里有個坑,就是頭上帶“\u”的unicode会涎,用print打印以后都會被轉(zhuǎn)譯裹匙,最終要么就成空白,要么就是其他的字兒末秃。這里如果不想被轉(zhuǎn)譯概页,那就將存儲unicode的list直接轉(zhuǎn)化為字符串,然后用正則表達(dá)式把unicode 提取出來即可练慕。
以地址信息為例惰匙,直接貼代碼
#---------------------------------------地址------------------------------------------------------
#這里返回的是一個list,內(nèi)容自行打印铃将,直接字符串化
addresses=str(each.xpath('div[2]/div[3]/span').extract()[0])
address_list=re.findall('\>(.*?)\<',addresses, re.S)
#這里在獲取最新address對應(yīng)的json的key的list
address_key=list(address_temp.keys())
address_list =str(address_list)
address =""
for m in re.findall("'(.*?)'", address_list, re.S):
? ? ? ? #print(m)
? ? ? ? address_info =str(m.replace("\\", ""))
? ? ? ? if address_info? =="":
? ? ? ? ? ? ? ? pass
? ? ? ? elif address_info in address_key:
? ? ? ? ? ? ? address = address + address_temp[address_info]
? ? ? ? else:
? ? ? ? ? ? ? ? address = address + address_info
? ? ? ? #print(address)
? ? ? ? item['address'] =address
這里面太多細(xì)節(jié)了项鬼,我把我的坑基本都說了,其他的東西大家自己領(lǐng)悟吧劲阎。