91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲

發布時間:2021-11-19 14:44:23 來源:億速云 閱讀:260 作者:iii 欄目:編程語言

本篇內容主要講解“使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲”吧!

  1.字體反爬

  字體反爬也就是自定義字體加密映射,通過調用自定義的字體文件來渲染網頁中的文字,而網頁中的文字不再是文字,而是相應的字體編碼,通過復制或者簡單的采集是無法采集到編碼后的文字內容的。

  2.查看字體軟件font creator 可下載,也可不下載,借助網頁版工具

  3.CSS處理前后的字體

  我們看到的網頁上的數據是正常的

  但是當我們打開開發者工具檢查字體時 ,金額和票房數據卻變成了類似亂碼的字符

  我們再檢查網頁源碼,發現數據和上面的都不一樣,而且每次請求金額還被加密成不同的密文

使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲

  多次請求,發現返回的字體文件重復概率太低(仔細觀察是有的,就是少)

  4.解決思路

  了解CSS 的應該會知道(我不知道),CSS 中有一個 @font-face,它允許網頁開發者為其網頁指定在線字體。原本是用來消除對用戶電腦字體的依賴,現在有了新作用——字體反爬。CN/docs/Web/CSS/@font-face 再觀察源碼中的數據,像是編碼過后的數據。

  仔細觀察發現是一些特定span中的數據經過處理,如下圖

使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲

  所以我們就查找該class名,找到了其字體樣式

使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲

  其中的woff就是字體文件,還有其他的,比如ttf字體,woff2,svg等,這里僅有woff ,可在font欄查看

  將該字體下載過來,在json字體編輯器中打開,https://font.qqe2.com/,可看到字體,多次刷新的話同樣的數字還不一樣

使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲
使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲

  我們再次拿處理前后的部分數字拿來進行對比:

  最初數字 2 4 0 1 . 3

  加密后  ? ? ? . ?

  字體中 $E290 $ED17 $F1A7 $EFBD $EFBD

  uniE290 uniED17 uniF1A7 uniEFBD uniEFBD

  發現規律了吧,但是我們知道每次數字位置都是動態...

  5.用TTfont把woff文件轉化成xml文件

  先將字體轉化成xml文件。

  import requests

  from fontTools.ttLib import TTFont

  def woff_xml():

  url = "https://vfile.meituan.net/colorstone/167b59ea53b59e17be72018703b759c32284.woff"

  woff_dir = r"./colorstone/"

  file_name = url.split("/")[-1]

  xml_name = file_name.replace(file_name.split(".")[-1], "xml")

  save_woff = file_name

  save_xml = xml_name

  resp = requests.get(url=url)

  with open(woff_dir+save_woff, "wb") as f:

  f.write(resp.content)

  f.close()

  font = TTFont(woff_dir+save_woff)

  font.saveXML(woff_dir+save_xml)

  轉換成的數據如圖:

  仔細查看后,確定和我們字體相關的標簽: 和 ,其中標簽中的數據在上圖,我們對進行查看:

  其中有x,y,Xmin,Ymin,Xmax,Ymax等值,很明顯是一些坐標點的信息,其實他就是確定字體形狀的坐標,不信我們可以畫一下:鄭州人流醫院 http://www.120zzzzyy.com/

  import matplotlib.pyplot as plt

  import re

  str = """"

  相應內容復制上來

  """

  x = [int(i) for i in re.findall(r'

  獲取10套基準字體,最初是存到XML中的,后面發現沒必要

  :return: None

  '''

  for i in range(0,10):#獲取10套字體作為基準字體

  time.sleep(1)

  res = requests.get(url=self.start_url,headers=self.headers,proxies=self.proxies)

  res.encoding = "utf-8"

  part_font_url = re.findall(r"url\('(.{,100}?\.woff)",res.text,re.S)

  #請求一次獲得部分url

  if part_font_url:

  font_url = "https:" + part_font_url[0]

  file_name = str(i+1)+".woff" #字體文件1.woff

  save_woff = file_name

  resp = requests.get(url=font_url,proxies=self.proxies)

  try:

  with open(r"./colorstone/" + save_woff, "wb") as f:#將woff文件保存

  f.write(resp.content)

  f.close()

  # font = TTFont(r"./colorstone/" + save_woff)

  # font.saveXML(r"./colorstone/base" + str(i+1)+ ".xml") #保存為base1.xml這樣的文件名

  print("第{}套基準字體保存完畢!".format((i+1)))

  except Exception as e:

  print(e)

  else:

  print("第{}次請求失敗,請檢查網站是否禁止訪問等".format((i+1)))

  6.2.提取樣本字體中的數字 + 坐標:

  def base_font(self):

  '''

  獲取10套基準字體中數字對應的x,y值

  :return: None

  '''

  # 查看10套基準字體, 獲取數字順序

  # base_num1 = [3,8,9,2,0,1,7,5,4,6]

  # base_num2 = [3,6,5,2,4,8,9,1,7,0]

  # base_num3 = [6,0,4,8,1,9,5,2,3,7]

  # base_num4 = [1,8,2,5,7,9,4,6,3,0]

  # base_num5 = [0,9,8,6,1,4,7,3,2,5]

  # base_num6 = [9,7,5,8,3,4,6,1,2,0]

  # base_num7 = [6,5,9,4,0,2,8,3,1,7]

  # base_num8 = [6,5,1,0,4,7,8,2,9,3]

  # base_num9 = [0,6,9,5,3,8,4,1,2,7]

  # base_num10 = [0,6,2,8,5,9,5,3,1,7]

  base_num = [[3,8,9,2,0,1,7,5,4,6],[3,6,5,2,4,8,9,1,7,0],[6,0,4,8,1,9,5,2,3,7],[1,8,2,5,7,9,4,6,3,0],

  [0,9,8,6,1,4,7,3,2,5],[9,7,5,8,3,4,6,1,2,0],[6,5,9,4,0,2,8,3,1,7],[6,5,1,0,4,7,8,2,9,3],

  [0,6,9,5,3,8,4,1,2,7],[0,6,2,8,5,9,5,3,1,7]]

  num_coordinate = []

  for i in range(0,10):

  woff_path = "./colorstone/"+str(i+1)+".woff"

  font = TTFont(woff_path)

  obj1 = font.getGlyphOrder()[2:] #過濾到前兩個不需要的

  for j, g in enumerate(obj1):

  coors = font['glyf'][g].coordinates

  coors = [_ for c in coors for _ in c]

  coors.insert(0, base_num[i][j])

  num_coordinate.append(coors)

  return num_coordinate

  6.3. 在函數knn(self)中:

  6.3.1 獲取特征值,目標值

  num_coordinate = self.base_font()

  data = pd.DataFrame(num_coordinate)

  data = data.fillna(value=0)

  x = data.drop([0],axis=1)

  y = data[0]

  6.3.2 進行數據的分割:訓練集和測試集

  x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

  6.3.3 調用KNN算法(這里n的參數由網格驗證得出,最優參數為1):

使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲

  knn = KNeighborsClassifier(n_neighbors=1)

  knn.fit(x_train, y_train)

  6.4.建立映射,將數字和對應的編碼建成字典形式:

  def get_map(self):

  font = TTFont("./colorstone/target.woff")

  glyf_order = font.getGlyphOrder()[2:]

  info = []

  for g in glyf_order:

  coors = font['glyf'][g].coordinates

  coors = [_ for c in coors for _ in c]

  info.append(coors)

  print(info)

  knn,length = self.knn()

  df = pd.DataFrame(info)

  data = pd.concat([df, pd.DataFrame(np.zeros(

  (df.shape[0], length - df.shape[1])), columns=range(df.shape[1], length))])

  data = data.fillna(value=0)

  y_predict = knn.predict(data)

  num_uni_dict = {}

  for i, uni in enumerate(glyf_order):

  num_uni_dict[uni.lower().replace('uni', '&#x') + ';'] = str(y_predict[i])

  return num_uni_dict

  6.5.采集數據并替換,獲取正確數據:

  根據網頁結構,提取數據:

  def get_info(self):

  res = requests.get(url=self.start_url, headers=self.headers)

  res.encoding = "utf-8"

  part_font_url = re.findall(r"url\('(.{,100}?\.woff)", res.text, re.S)

  # 請求一次獲得部分url

  if part_font_url:

  font_url = "https:" + part_font_url[0]

  resp = requests.get(url=font_url,proxies=self.proxies)

  with open(r"./colorstone/target.woff", "wb") as f: # 保存需要分析的字體文件

  f.write(resp.content)

  f.close()

  html = res.text

  map_dict = self.get_map()

  for uni in map_dict.keys():

  html = html.replace(uni, map_dict[uni])

  parse_html = etree.HTML(html)

  for i in range(0,11):

  name = parse_html.xpath('//dd[{}]//p[@class="name"]/a/@title'.format(i))

  star = parse_html.xpath('//dd[{}]//p[@class="star"]/text()'.format(i))

  releasetime = parse_html.xpath('//dd[{}]//p[@class="releasetime"]/text()'.format(i))

  realtime_amount= parse_html.xpath('//dd[{}]//p[@class="realtime"]//text()'.format(i))

  total_amount = parse_html.xpath('//dd[{}]//p[@class="total-boxoffice"]//text()'.format(i))

  print("".join(name)," ","".join(star)," ","".join(releasetime),"".join(realtime_amount).replace(" ","").replace("\n",""),"".join(total_amount).replace(" ",""))

  打印結果

  對比原網頁

  數據完全是一樣的,此次動態字體反爬到此就結束了。

到此,相信大家對“使用K近鄰算法與CSS動態字體加密后Python怎么反爬蟲”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰县| 古丈县| 潮州市| 陇南市| 清徐县| 家居| 马公市| 体育| 都匀市| 临洮县| 内乡县| 宜兴市| 弥渡县| 西平县| 柯坪县| 福州市| 楚雄市| 塔城市| 靖宇县| 惠来县| 陆良县| 高邑县| 七台河市| 昌黎县| 梅河口市| 玉溪市| 潢川县| 闽侯县| 溧阳市| 抚宁县| 堆龙德庆县| 仙桃市| 高淳县| 喀什市| 定日县| 清新县| 七台河市| 乾安县| 正宁县| 临潭县| 齐齐哈尔市|