在專案工廠發現一道爬蟲案例目標是58同城,可是在對**分析之後發現樣例**已經無法滿足現在的58網的資訊搜尋。
樣例**如下:
//ul[@class="house-list"]/li
./div[@class="des"]/h2/a/text()
./div[@class="list-li-right"]/div[@class="money"]/b/text()
./div[@class="des"]/p[@class="room"]/text()
構造好xpath後日設定**(做賊心虛)以及設定對頁面請求的訊息頭
def addheaders(user_agent, referer, requesturl,con, addr):
proxy = request.proxyhandler()
opener = request.build_opener(proxy)
request.install_opener(opener)
headers =
rq = request.request(requesturl, headers=headers)
reponse = request.urlopen(rq)
data = reponse.read().decode("utf-8")
return data
然而正當一切都順風順水的時候,我在網頁原始碼中瞅到了這行
emmm。。。感覺到了對新手的惡意,虐菜之心昭然若揭
然而我怎麼會這樣輕易go die
在爬取完資料後我發現該**對**以及房子面積等資訊中的數字進行了反爬蟲處理(載入下來會亂碼)。
仔細閱讀了一下大概是採用了某種數字移位操作產生了一種新的字元對映表。
我們只要獲取到這個字元對映表就可以定製乙個對映字典從而對亂碼進行replace操作
思路有了那麼就開始操作
首先將字元對映表以base64的方式寫在js**中我們將其複製**(如下圖**):
其次構造python**將base64解碼並且儲存ttf檔案
font_face = 'aaeaaaalaiaaawawr1n........aaa' #base64字型檔案
b = base64.b64decode(font_face) #將頁面中base64字元對映表載入下來存為ttf字型檔案
with open('f:/house/58.ttf', 'wb') as f:
f.write(b)
diction = #將對映表寫成dict
然後字元就正常爬取到啦
整體**如下
from urllib import request
import json
from lxml import etree
import base64
global price
global title
global room
font_face = 'aaeaaaa.......aaa'
b = base64.b64decode(font_face) #將頁面中base64字元對映表載入下來存為ttf字型檔案
diction = #將對映表寫成dict
for key in diction.keys():
price = price.replace(key, diction[key]).strip() #對有數字的物件中採用對映表替換
room = room.replace(key, diction[key]).strip()
dict =
with open("f:/house/house.txt", 'w')as file:
file.write(json.dumps(result))
print(result)
Python爬蟲 字型反爬
網頁開發者自己創造一種字型,因為在字型中每個文字都有其代號,那麼以後在網頁中不會直接顯示這個文字的最終的效果,而是顯示他的代號,因此即使獲取到了網頁中的文字內容,也只是獲取到文字的代號,而不是文字本身。因為創造字型費時費力,並且如果把中國3000多常用漢字都實現,那麼這個字型將達到幾十兆,也會影響網...
爬蟲爬取方法分析與反爬蟲策略
爬蟲 spider 反爬蟲 anti spider 前言 網路爬蟲 spider或crawler 顧名思義,就是在網際網路上爬行的蟲子,那麼這只蟲子為什麼要在網上爬行呢?很簡單 收集資訊。在網際網路時代,誰掌握了資訊誰就把握了主動權。一,爬蟲部分一些簡單建議 1 儘量減少請求次數,2 能抓列表頁就不...
爬蟲(二) 製作自定義字型反爬
1.準備乙個字型庫,命名成 bmyy.ttf 2.提取字元用到fonttools pip install fonttools pyftsubset 字型檔案 text 需要的字形 output file 輸出 參考 pyftsubset d font bmyy.ttf text 1234567890...