设为首页 收藏本站
开启辅助访问 快捷导航
菜单
猿人部落 主页 资讯 查看内容

glidedsky 字体反爬虫

2019-7-25 17:32 发布者: admin 评论 0 查看 1433
# -*-coding:utf-8 -*-# Author : Jermey1994# Develop_Time : 2019/7/24 20:33# File_Name : font_scr.PY# Develop_Tool : PyCharmimport reimport timefrom fontTools.ttLib import TTFontimport requestsfrom bs4

  1. # -*-coding:utf-8 -*-
  2. # Author : Jermey1994
  3. # Develop_Time : 2019/7/24 20:33
  4. # File_Name : font_scr.PY
  5. # Develop_Tool : PyCharm

  6. import re
  7. import time
  8. from fontTools.ttLib import TTFont

  9. import requests
  10. from bs4 import BeautifulSoup
  11. from fake_useragent import UserAgent

  12. class Sky_Main(object):
  13.     def __init__(self):
  14.         """
  15.         初始化总和
  16.         headers
  17.         """
  18.         self.all_num = 0
  19.         self.header = {'user-agent':UserAgent().random,
  20.                        'Cookie': ''
  21.                        }


  22.     def get_html(self,url):
  23.         """
  24.         获取当前爬取的url的html源码
  25.         :param url: 爬取的url
  26.         :return: 返回html源码
  27.         """
  28.         time.sleep(2.5)
  29.         response = requests.get(url, headers=self.header).text
  30.         soup = BeautifulSoup(response,'lxml')
  31.         return soup


  32.     def soup_html(self,soup):
  33.         """
  34.         清算出源码数据的数组
  35.         :param response:
  36.         :return: 返回清算好的数组
  37.         """
  38.         new_list = list()
  39.         nums = soup.find_all('div',class_='col-md-1')
  40.         for temp in nums :
  41.             new_list.append(re.findall(r'(\d\d\d|\d\d)',str(temp))[0])
  42.         return new_list


  43.     def get_font_url(self,soup):
  44.         """
  45.         并把源码生存到本地,方便分析字体反爬
  46.         使用正则表达式打扫无用的字符串,获取字体地点
  47.         :param response: 传入get_html()源码
  48.         :return: 返回字体的下载地点
  49.         """
  50.         font_url = re.findall(r'url\("(.*?)"\)', soup.prettify())
  51.         return font_url[0]


  52.     def download_font(self,font_url):
  53.         """
  54.         下载字体生存到当前文件夹名为 font.woff 的字体文件
  55.         :param font_url: self.get_font_url()
  56.         :return: None
  57.         """
  58.         response = requests.get(font_url).content
  59.         with open('font.woff','wb') as f :
  60.             f.write(response)


  61.     def get_cmap(self,font_nums):
  62.         """
  63.         分析字体所映射的值
  64.         :param font_nums: 当前页面获取到的数组
  65.         :return:
  66.         """
  67.         num_str = ''
  68.         # 读取字体
  69.         font = TTFont("font.woff")

  70.         # 生存成xml文件 酿成python可读,举行分析
  71.         #font.saveXML('font.xml')

  72.         # 读取映射表
  73.         best_cmap = font['cmap'].getBestCmap()
  74.         best_glpy = font['cmap'].tables[2].ttFont.getReverseGlyphMap()
  75.         temp_cmap = dict()
  76.         for key, value in best_cmap.items():
  77.             temp_cmap[chr(key)] = value

  78.         for ns in font_nums :
  79.             for n in ns :
  80.                 num_str += str((best_glpy[temp_cmap[n]] - 2))
  81.             self.all_num += int(num_str)
  82.             num_str = ''


  83.     def start_main(self,page):
  84.         """
  85.         传入page后,实行内部函数开始分析数据
  86.         :param page: 传入页数
  87.         """
  88.         for pg in range(1,page + 1) :
  89.             print(pg)
  90.             url = 'http://glidedsky.com/level/web/crawler-font-puzzle-1?page=' + str(pg)
  91.             soup = self.get_html(url)
  92.             font_url = self.get_font_url(soup)
  93.             font_nums = self.soup_html(soup)
  94.             self.download_font(font_url)
  95.             self.get_cmap(font_nums)

  96.         print('答案是 : %d' % self.all_num)


  97. if __name__ == '__main__' :
  98.     start = Sky_Main()
  99.     start.start_main(1000)

路过

雷人

握手

鲜花

鸡蛋
收藏 邀请
上一篇:python爬图片的爬虫(新手代码)下一篇:报错

相关阅读

一周热门

头条攻略!

日排行榜

相关分类