日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

url中能出现的字符_python爬虫,解决大众点评字符库反爬机制的经验

發(fā)布時間:2024/9/27 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 url中能出现的字符_python爬虫,解决大众点评字符库反爬机制的经验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

剛開始寫文章還希望大家可以喜歡,對于爬蟲只是個人整理出的方法,爬蟲大牛請嘴下留情?!啊眱H限學(xué)術(shù)交流,如有冒犯請聯(lián)系作者刪除“”話不多說,想分析天津地區(qū)餐飲行業(yè)的大致情況,要爬出(商鋪名稱,星級,評價條數(shù),人均消費金額,菜系,商圈,團(tuán)購活動等)。

可是在爬蟲時發(fā)現(xiàn),這些數(shù)字都是以這類方框形式展示,再看源代碼,以&#xXXXX這種形式展示,這是反爬機(jī)制中的字體庫反爬,要把這些代碼轉(zhuǎn)化成前端看到的123或天津菜等數(shù)據(jù)。

感覺跟特工密碼一樣,真讓人興奮。

要把這些代碼對應(yīng)出真正的數(shù)字或漢字,需要把css內(nèi)的woff字符庫爬出來。獲取的css鏈接類似如下:http://s3plus.sankuai.com/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/9a2072f4d3d2589da1b348aebb034c6c.css

在源代碼中找到這樣的內(nèi)容,爬取下來

#爬取代碼如下 pattern=re.compile(r'//s3plus..*?.css') url=pattern.findall(html) url1=''.join(url) cssurl='http:'+url1

css鏈接爬下來后打開看看,里面的內(nèi)容,哇塞,這是什么神仙結(jié)構(gòu),可以看到里面有2種字符庫。

我之前遇到過里面有4種各不相同的字符庫,這里只有2種字符庫,簡單多了

但是css內(nèi)的字體文件一直在變,光抓下來一次woff文件是不夠的,既然這里實時變更,就要采取爬蟲實時抓取css、下載woff。

先把第一次爬取出來的css文件中的woff文件下載下來,上面截圖看的出里面有2個woff文件,是否要把所有的woff文件都下載下來呢?這要看我們都需要爬取下來什么內(nèi)容,(商鋪名稱,星級,評價條數(shù),人均消費金額,菜系,商圈,團(tuán)購活動)這些內(nèi)容看他們的class標(biāo)簽,屬于2類,shopNum,tagname,在css文件中能查到這2個標(biāo)簽,分別對應(yīng)一個woff文件,也就是下載這2個woff文件即可。

下載

下載woff文件代碼:

# 將css內(nèi)對應(yīng)shopNum,tagname標(biāo)簽的font-family內(nèi)容爬取出來 def css_url(html):pattern=re.compile(r'//s3plus..*?.css')url=pattern.findall(html)url1=''.join(url)cssurl='http:'+url1f=requests.get(cssurl)f.encoding='utf-8'f1=f.textshopnumfont=re.findall(r'@font-face{font-family: "PingFangSC-Regular-shopNum".*?shopNum{font-family: 'PingFangSC-Regular-shopNum';}',f1)shopnum=''.join(shopnumfont)tagnamefont=re.findall(r'@font-face{font-family: "PingFangSC-Regular-tagName".*?tagName{font-family: 'PingFangSC-Regular-tagName';}',f1)tagname=''.join(tagnamefont)return shopnum,tagname # 將對應(yīng)標(biāo)簽內(nèi)的woff下載在本地 def unicode_dict(shopnum):shopnumlist = re.findall(r'//s3plus.meituan.net/v1/w+/font/w+.woff',shopnum)shopnumurl = "http:" + ''.join(shopnumlist)response_shopnumwoff = requests.get(shopnumurl).contentfontname = shopnumurl[-13:-5]h=open(fontname + '.woff', 'wb')h.write(response_shopnumwoff)h.close()

現(xiàn)在先以shopNum標(biāo)簽舉例,舉一反三tagname也就知道怎么處理了。下面就是關(guān)鍵,把爬取出來的一個woff文件做為基礎(chǔ)字符庫,通過FontCreator可以把編碼對應(yīng)的數(shù)字或漢字顯示出來,下面是fontcreator打開woff文件后呈現(xiàn)出來的樣子。

但要把這些編碼和對應(yīng)漢字轉(zhuǎn)換成.xls或.txt還需要一個圖像文字識別軟件,推薦在線https://zhcn.109876543210.com/,把fontcreator中內(nèi)容截圖下來,用剛才的鏈接轉(zhuǎn)換成.csv,直接把代碼和對應(yīng)的漢字都下載下來,方便直接生成字典(這是我的方法,可以根據(jù)自己的喜好來選擇下載的形式),

這里的是不是unie045和&#xe045很像?只要把前面3個字符更換成uni就可以了?測試一下是真的可以的。那把編碼和漢字對應(yīng)上,形成字典,再replace(’uni’,’&#x’)就能把網(wǎng)頁上的&#xXXXX轉(zhuǎn)換成漢字或數(shù)字了,就能爬取下來正確的內(nèi)容了。

可這只能生成一個字典,前面說過css內(nèi)的woff是不斷變換的,每個woff文件下載下來相同數(shù)字對應(yīng)的編碼都不相同,如圖,

不可能每個woff文件都這樣生成一個字典,其他字符庫要怎么找到編碼對應(yīng)的漢字或數(shù)字呢?這里需要用到TTFont,from fontTools.ttLib import TTFont,把woff文件存為xml,每個編碼都會生成這樣一個坐標(biāo)系,雖然編碼不同,但是后面的坐標(biāo)系是相同的,對應(yīng)生成的數(shù)字或漢字也是相同的,這是一個切入點~

只要通過一個字符庫的xml找到坐標(biāo)系和漢字、數(shù)字對應(yīng)的關(guān)系,新爬下來的字符庫轉(zhuǎn)換成xml后,遍歷他的坐標(biāo)系和已知字符庫的坐標(biāo)系對上了,就把已知字符庫的漢字或數(shù)字賦值給新的字符庫,完成!

上代碼:

newfont = TTFont(fontname + '.woff') newfont.saveXML(fontname + '.xml') basefont = TTFont('1d7914a7.woff') unicodedict = {"unie046": "跟", "unif305": "塊", "unif230": "1", "unie713": "2", "unie86f": "3", "unie5f3": "4","unif235": "5", "unie7c3": "6", "unif558": "7", "unie383": "8", "unif5f6": "9", "unie8f4": "0","unieb6b": "店", "unie015": "中", "unif44f": "美", "unif4fe": "家", "unif5b5": "館", "unie6b4": "小","unif78b": "車", "unie0a1": "大", "unif191": "市", "unie5eb": "公", "unif33f": "酒","unif0a1": "行", "unie19a": "國", "unie075": "品", "unie4d5": "發(fā)", "unif2ed": "電", "uniea88": "金","uniec19": "心", "unie240": "業(yè)", "unif77e": "商", "unif87a": "司", "unief51": "超", "unie877": "生","uniebf3": "裝", "unied5e": "園", "unie0c0": "場", "unie723": "食", "unif167": "有", "uniec25": "新","unief2b": "限", "unieb71": "天", "unie36b": "面", "unie4e5": "工", "unie820": "服","unieb69": "海", "unie591": "華", "unif5ab": "水", "unif653": "房", "unie3d5": "飾", "unif48e": "城","unif042": "樂", "unie31f": "汽", "unif76c": "香", "unie056": "部", "unie5b9": "利", "unif860": "子","unie661": "老", "unif316": "藝", "unie714": "花", "unif101": "專", "uniedf8": "東", "unie66e": "肉","unif6eb": "菜", "unif897": "學(xué)", "unif2a7": "福", "unie148": "飯", "unif313": "人","uniedf7": "百", "unied1a": "餐", "unif7be": "茶", "unie32e": "務(wù)", "unie63b": "通", "unie45b": "味","unif397": "所", "unieda8": "H1", "unie761": "區(qū)", "unif6cf": "門", "unie424": "藥", "uniedc9": "銀","unif87c": "農(nóng)", "unie462": "龍", "unie04a": "停", "unie610": "尚", "unif0ea": "安", "unie913": "廣","unie399": "鑫", "uniebb2": "—", "unie04b": "容", "unie21a": "動", "unie225": "南","unif024": "具", "unif165": "源", "unie259": "興", "uniecb3": "鮮", "unie4a3": "記", "unif109": "時","unif4ed": "機(jī)", "unie5c7": "烤", "unif276": "文", "unie538": "康", "unied4c": "信", "uniedca": "果","unif1d5": "陽", "unif6f9": "理", "unie83a": "鍋", "unif7e1": "寶", "unif094": "達(dá)", "unif18e": "地",....... } # 太長了做縮略,全部代碼后面會附上。 newfont_glyphNames=newfont.getGlyphNames()[1:-1] basefont_glyphNames=basefont.getGlyphNames()[1:-1] temp={} a=len(unicodedict) for i in range(0,a):for j in range(0,a):if newfont['glyf'][newfont_glyphNames[i]]==basefont['glyf'][basefont_glyphNames[j]]:temp[newfont_glyphNames[i].replace('uni','&#x').lower()]=unicodedict[basefont_glyphNames[j]]else:pass return temp

通過上面幾步,基本上就可以把爬取下來的字段對應(yīng)出正常的漢字或數(shù)字了,再保存到mysql中,結(jié)果如下。

整理思路:

1、 爬取出css鏈接,從css內(nèi)解析出shopNum,tagname標(biāo)簽的woof文件

2、 將下載下來的一個woff文件做為基礎(chǔ),用fontcreator和誠華OCR,將編碼對應(yīng)的漢字和數(shù)字整理成字典。

3、 將已知的字符庫用TTFont存為xml,用getGlyphNames()和if條件語句判斷新下載的字符庫和已知字符庫是否有相同的坐標(biāo)系,有的話將字典內(nèi)的值賦給新的字符庫的編碼,用replace(‘uni’,‘&#x’)將Unicode編碼轉(zhuǎn)換為網(wǎng)頁上的編碼,形成新的字典。

4、 通過以上方式生成2類字典,shopNum字典和tagname字典。

5、 將爬取出來的&#xXXXX這個格式的內(nèi)容,區(qū)分匹配哪類字典,再將字典的值賦給對應(yīng)的編碼,形成最終的前端顯示的文字或數(shù)字。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的url中能出现的字符_python爬虫,解决大众点评字符库反爬机制的经验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。