Python3爬取起点中文网阅读量信息,解决文字反爬~~~附源代码
起点中文网,在“数字”上设置了文字反爬,使用了自定义的文字文件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爬取起点中文网阅读量信息,解决文字反爬~~~附源代码相关推荐
- pythonttf字体反爬虫_利用Python采集起点中文网小说,并解决字体反爬的问题
个人比较喜欢看小说,于是乎想利用Python爬取小说网站--起点中文网,在Python编程爬取定位过程中遇到了Python反爬虫,咨询了我旁边的前端大神,说下方法 当前页面接口返回的html源码 当前 ...
- 爬取起点中文网小说介绍信息
字数的信息(word)没有得到缺失 import xlwt import requests from lxml import etree import timeall_info_list=[] hea ...
- python 爬虫抓取网页数据导出excel_Python爬虫|爬取起点中文网小说信息保存到Excel...
前言: 爬取起点中文网全部小说基本信息,小说名.作者.类别.连载\完结情况.简介,并将爬取的数据存储与EXCEL表中 环境:Python3.7 PyCharm Chrome浏览器 主要模块:xlwt ...
- Python爬虫之爬取起点中文网
python之爬取起点中文网 最近学了爬虫,想实战一下就选取了最近经常看小说的起点中文网来进行爬取 过程如下: 分析爬取信息: 爬取网址:https://www.qidian.com/rank?chn ...
- scrapy爬取起点中文网24小时热销榜单
系列文章目录 第一章 scrapy爬取起点中文网24小时热销榜单. 文章目录 系列文章目录 前言 一.项目需求 二.项目分析 三.程序编写 1.编写item(数据存储) 2.编写spider(数据抓取 ...
- scrapy爬取起点中文网24小时热销榜单(将数据存到数据库)
系列文章目录 第一章:scrapy爬取起点中文网24小时热销榜单 第二章:scrapy爬取苏州二手房交易信息 第三章:scrapy爬取QQ音乐榜单歌曲及豆瓣电影信息 第四章:scrapy爬取起点中文网 ...
- python爬虫之爬取起点中文网小说
python爬虫之爬取起点中文网小说 hello大家好,这篇文章带大家来制作一个python爬虫爬取阅文集团旗下产品起点中文网的程序,这篇文章的灵感来源于本人制作的一个项目:电脑助手 启帆助手 ⬆是项 ...
- Go爬取起点中文网 解决文字反爬
Go语言的爬虫库不如Python强大,却也五脏俱全. 今天我们分析如何爬取起点中文网数据,以及遇到反爬如何处理. 作品链接:http://www.365yg.com/i6678092837810078 ...
- Scrapy 爬取起点中文网存储到 MySQL 数据库(自定义 middleware)
Scrapy 爬取起点中文网 1. 创建项目 2. 创建爬虫实例 3. 创建一个启动文件 main.py 4. 项目的总体树结构 5. settings.py 6. items.py 7. qidia ...
- scrapy 爬取起点中文网首页的本周强推作品的详情介绍
scrapy 爬取起点中文网首页的每周强推作品的详情介绍 从列表页跳转到详情页 保存的数据 封面图 小说名 作者 类型 简介 import scrapy# 起点首页 本周推荐 class Weektj ...
最新文章
- java同步与死锁_Java多线程 - 线程同步与死锁
- chmod g+s 、chmod o+t 、chmod u+s:Linux高级权限管理
- python hashlib模块
- 关于业务系统的架构思考
- iOS 各种系统文件目录 临时,缓存,document,lib,归档,序列化
- 通过零拷贝进行有效的数据传输(java、c)
- 《Puppet实战手册》——1.4 利用Git管理配置清单
- 如何架设Linux打印服务器
- 基于Python + Redis实现分布式锁
- C语言ftell()函数
- 线性分类器三种最优准则
- 使用友盟+实现第三方登录(QQ、微信、微博)
- leedcode.21合并两个有序链表
- 使用BIOS进行键盘输入和磁盘读写
- iphone更新运营商服务器,iphone更新运营商配置文件操作方法
- 字节跳动小程序对接环信IM遇到的问题
- 已知二叉树的后序序列和中序序列,求先序序列。
- Windows下将Tomcat8注册为系统服务
- 关于idea中maven jar包冲突的解决方法
- 基于Java+SpringBoot+vue+element驾校管理系统设计和实现