起点中文网,在“数字”上设置了文字反爬,使用了自定义的文字文件ttf通过浏览器的“检查”显示的是“□”,但是可以在网页源代码中找到映射后的数字正则爬的是网页源代码,xpath是默认utf-8解析网页数据,用xpath爬出来的也是方框,因此只能使用正则匹配爬取关键数字信息

本例以小说《斗罗大陆》为例 https://book.qidian.com/info/1115277,爬取阅读量等数字信息

爬取思路:1. 使用正则匹配爬取出网页源代码中的被设置反爬的数字信息(这里只能使用正则匹配)2. 寻找数字的映射关系  2.1 爬取出网页中的字体文件地址,并下载这个文件

  2.2 使用软件FontCreator(请度娘自行下载)打开文件,可以看到英文和数字的对应关系,写入字典  在本例中是按照习惯对应的(有可能有的文件自定义是打乱的)

#在fontcreator中查看此ttf文件中英文单词与阿拉伯数字的映射关系,写入字典
python_font_relation = {'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9,'zero':0,'period':'.'
}

  2.3 在python中安装fontTools包,网页源代码中的数字与英文单词的对应关系

def get_font(url):"""获取源代码中数字信息与英文单词之间的映射关系:param url: <str> 网页源代码中的字体地址:return: <dict> 网页字体映射关系"""time.sleep(1)response = requests.get(url)font = TTFont(BytesIO(response.content))web_font_relation = font.getBestCmap()font.close()return web_font_relation

结果是:

3. 通过2.2与2.3 可以看出来解码需要两步:

第一步:将正则匹配出来的6位数字先转换成英文单词

第二步:将英文单词转换成阿拉伯数字

然后就ok啦


源代码:

1. 正则匹配没有展开讲,自行度娘吧

2. 有一些简单的数据处理工作,细心点一步一步来,实在不行就每次都输出看一下

  1 """
  2 起点中文网,在“数字”上设置了文字反爬,使用了自定义的文字文件ttf
  3 浏览器渲染不出来,但是可以在网页源代码中找到映射后的数字
  4 正则爬的是网页源代码 xpath是默认utf-8解析网页数据;网页源代码有数据,使用浏览器"检查"是方框,用xpath爬出来的也是方框
  5 以小说《斗罗大陆》为例 https://book.qidian.com/info/1115277
  6 """
  7 import requests, time, re, pprint
  8 from fontTools.ttLib import TTFont
  9 from io import BytesIO
 10 from lxml import etree
 11
 12 #此代码使用bs和xpath均无法爬出,需使用正则匹配
 13 #selector = etree.HTML(html_data.text)
 14 #word1 = selector.xpath('//div[2]/div[6]/div[1]/div[2]/p[3]/em[1]/span/text()')
 15
 16 def get_font(url):
 17     """
 18     获取源代码中数字信息与英文单词之间的映射关系
 19     :param url: <str> 网页源代码中的字体地址
 20     :return: <dict> 网页字体映射关系
 21     """
 22     time.sleep(1)
 23     response = requests.get(url)
 24     font = TTFont(BytesIO(response.content))
 25     web_font_relation = font.getBestCmap()
 26     font.close()
 27     return web_font_relation
 28
 29
 30 #在fontcreator中查看此ttf文件中英文单词与阿拉伯数字的映射关系,写入字典
 31 python_font_relation = {
 32     'one':1,
 33     'two':2,
 34     'three':3,
 35     'four':4,
 36     'five':5,
 37     'six':6,
 38     'seven':7,
 39     'eight':8,
 40     'nine':9,
 41     'zero':0,
 42     'period':'.'
 43 }
 44
 45 def get_html_info(url):
 46     """
 47     解析网页,获取文字文件的地址和需要解码的数字信息
 48     :param url: <str> 需要解析的网页地址
 49     :return:    <str> 文字文件ttf的地址
 50                 <list> 反爬的数字,一维列表
 51     """
 52     headers = {
 53         'User-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
 54     }
 55     html_data = requests.get(url, headers=headers)
 56     # 获取网页的文字ttf文件的地址
 57     url_ttf_pattern = re.compile('<style>(.*?)\s*</style>',re.S)
 58     fonturl = re.findall(url_ttf_pattern,html_data.text)[0]
 59     url_ttf = re.search('woff.*?url.*?\'(.+?)\'.*?truetype', fonturl).group(1)
 60
 61     # 获取所有反爬的数字
 62     word_pattern = re.compile('</style><span.*?>(.*?)</span>', re.S)#制定正则匹配规则,匹配所有<span>标签中的内容
 63     numberlist = re.findall(word_pattern, html_data.text)
 64
 65     return url_ttf,numberlist
 66
 67
 68 def get_encode_font(numberlist):
 69     """
 70     把源代码中的数字信息进行2次解码
 71     :param numberlist: <list> 需要解码的一维数字信息
 72     :return:
 73     """
 74     data = []
 75     for i in numberlist:
 76         fanpa_data = ''
 77         index_i = numberlist.index(i)
 78         words = i.split(';')
 79         #print('words:',words)
 80         for k in range(0,len(words)-1):
 81             words[k] = words[k].strip('&#')
 82             #print(words[k])
 83             words[k] = str(python_font_relation[web_font_relation[int(words[k])]])
 84             #print(words[k])
 85             fanpa_data += words[k]
 86         #print(fanpa_data)
 87         data.append(fanpa_data)
 88     print(data[0],'万字')
 89     print(data[1], '万阅文总点击')
 90     print(data[2], '万会员周点击')
 91     print(data[3], '万总推荐')
 92     print(data[4], '万周推荐')
 93    # return data
 94
 95 """程序主入口"""
 96 if __name__=='__main__':
 97     url = 'https://book.qidian.com/info/1115277'  # 选取某一小说
 98     get_html_info(url)
 99     web_font_relation = get_font(get_html_info(url)[0])
100     pprint.pprint(web_font_relation)#格式化打印网页文字映射关系
101     get_encode_font(get_html_info(url)[1])

转载于:https://www.cnblogs.com/aby321/p/10214123.html

Python3爬取起点中文网阅读量信息,解决文字反爬~~~附源代码相关推荐

  1. pythonttf字体反爬虫_利用Python采集起点中文网小说,并解决字体反爬的问题

    个人比较喜欢看小说,于是乎想利用Python爬取小说网站--起点中文网,在Python编程爬取定位过程中遇到了Python反爬虫,咨询了我旁边的前端大神,说下方法 当前页面接口返回的html源码 当前 ...

  2. 爬取起点中文网小说介绍信息

    字数的信息(word)没有得到缺失 import xlwt import requests from lxml import etree import timeall_info_list=[] hea ...

  3. python 爬虫抓取网页数据导出excel_Python爬虫|爬取起点中文网小说信息保存到Excel...

    前言: 爬取起点中文网全部小说基本信息,小说名.作者.类别.连载\完结情况.简介,并将爬取的数据存储与EXCEL表中 环境:Python3.7 PyCharm Chrome浏览器 主要模块:xlwt ...

  4. Python爬虫之爬取起点中文网

    python之爬取起点中文网 最近学了爬虫,想实战一下就选取了最近经常看小说的起点中文网来进行爬取 过程如下: 分析爬取信息: 爬取网址:https://www.qidian.com/rank?chn ...

  5. scrapy爬取起点中文网24小时热销榜单

    系列文章目录 第一章 scrapy爬取起点中文网24小时热销榜单. 文章目录 系列文章目录 前言 一.项目需求 二.项目分析 三.程序编写 1.编写item(数据存储) 2.编写spider(数据抓取 ...

  6. scrapy爬取起点中文网24小时热销榜单(将数据存到数据库)

    系列文章目录 第一章:scrapy爬取起点中文网24小时热销榜单 第二章:scrapy爬取苏州二手房交易信息 第三章:scrapy爬取QQ音乐榜单歌曲及豆瓣电影信息 第四章:scrapy爬取起点中文网 ...

  7. python爬虫之爬取起点中文网小说

    python爬虫之爬取起点中文网小说 hello大家好,这篇文章带大家来制作一个python爬虫爬取阅文集团旗下产品起点中文网的程序,这篇文章的灵感来源于本人制作的一个项目:电脑助手 启帆助手 ⬆是项 ...

  8. Go爬取起点中文网 解决文字反爬

    Go语言的爬虫库不如Python强大,却也五脏俱全. 今天我们分析如何爬取起点中文网数据,以及遇到反爬如何处理. 作品链接:http://www.365yg.com/i6678092837810078 ...

  9. Scrapy 爬取起点中文网存储到 MySQL 数据库(自定义 middleware)

    Scrapy 爬取起点中文网 1. 创建项目 2. 创建爬虫实例 3. 创建一个启动文件 main.py 4. 项目的总体树结构 5. settings.py 6. items.py 7. qidia ...

  10. scrapy 爬取起点中文网首页的本周强推作品的详情介绍

    scrapy 爬取起点中文网首页的每周强推作品的详情介绍 从列表页跳转到详情页 保存的数据 封面图 小说名 作者 类型 简介 import scrapy# 起点首页 本周推荐 class Weektj ...

最新文章

  1. java同步与死锁_Java多线程 - 线程同步与死锁
  2. chmod g+s 、chmod o+t 、chmod u+s:Linux高级权限管理
  3. python hashlib模块
  4. 关于业务系统的架构思考
  5. iOS 各种系统文件目录 临时,缓存,document,lib,归档,序列化
  6. 通过零拷贝进行有效的数据传输(java、c)
  7. 《Puppet实战手册》——1.4 利用Git管理配置清单
  8. 如何架设Linux打印服务器
  9. 基于Python + Redis实现分布式锁
  10. C语言ftell()函数
  11. 线性分类器三种最优准则
  12. 使用友盟+实现第三方登录(QQ、微信、微博)
  13. leedcode.21合并两个有序链表
  14. 使用BIOS进行键盘输入和磁盘读写
  15. iphone更新运营商服务器,iphone更新运营商配置文件操作方法
  16. 字节跳动小程序对接环信IM遇到的问题
  17. 已知二叉树的后序序列和中序序列,求先序序列。
  18. Windows下将Tomcat8注册为系统服务
  19. 关于idea中maven jar包冲突的解决方法
  20. 基于Java+SpringBoot+vue+element驾校管理系统设计和实现

热门文章

  1. networkx 有向图强连通_基于networkx分析Louvain算法的社团网络划分
  2. iOS 集成极光推送 (swift版)
  3. iOS swift 2048小游戏开发教程(一)
  4. 模拟集成电路大牛的经验
  5. Linux基础学习笔记整理——第二章 管理文件和目录
  6. sqlserver之创建视图
  7. GEE、USGS、地理空间数据云上下载武汉地区的影像数据
  8. GB35114-SIP部分技术预研
  9. pbrt gamma
  10. java 设置字符编码_java中的字符编码方式