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. 有一些简单的数据处理工作,细心点一步一步来,实在不行就每次都输出看一下
"""
起点中文网,在“数字”上设置了文字反爬,使用了自定义的文字文件ttf
浏览器渲染不出来,但是可以在网页源代码中找到映射后的数字
正则爬的是网页源代码 xpath是默认utf-8解析网页数据;网页源代码有数据,使用浏览器"检查"是方框,用xpath爬出来的也是方框
以小说《斗罗大陆》为例 https://book.qidian.com/info/1115277
"""
import requests, time, re, pprint
from fontTools.ttLib import TTFont
from io import BytesIO
from lxml import etree #此代码使用bs和xpath均无法爬出,需使用正则匹配
#selector = etree.HTML(html_data.text)
#word1 = selector.xpath('//div[2]/div[6]/div[1]/div[2]/p[3]/em[1]/span/text()') 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 #在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':'.'
} def get_html_info(url):
"""
解析网页,获取文字文件的地址和需要解码的数字信息
:param url: <str> 需要解析的网页地址
:return: <str> 文字文件ttf的地址
<list> 反爬的数字,一维列表
"""
headers = {
'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'
}
html_data = requests.get(url, headers=headers)
# 获取网页的文字ttf文件的地址
url_ttf_pattern = re.compile('<style>(.*?)\s*</style>',re.S)
fonturl = re.findall(url_ttf_pattern,html_data.text)[0]
url_ttf = re.search('woff.*?url.*?\'(.+?)\'.*?truetype', fonturl).group(1) # 获取所有反爬的数字
word_pattern = re.compile('</style><span.*?>(.*?)</span>', re.S)#制定正则匹配规则,匹配所有<span>标签中的内容
numberlist = re.findall(word_pattern, html_data.text) return url_ttf,numberlist def get_encode_font(numberlist):
"""
把源代码中的数字信息进行2次解码
:param numberlist: <list> 需要解码的一维数字信息
:return:
"""
data = []
for i in numberlist:
fanpa_data = ''
index_i = numberlist.index(i)
words = i.split(';')
#print('words:',words)
for k in range(0,len(words)-1):
words[k] = words[k].strip('&#')
#print(words[k])
words[k] = str(python_font_relation[web_font_relation[int(words[k])]])
#print(words[k])
fanpa_data += words[k]
#print(fanpa_data)
data.append(fanpa_data)
print(data[0],'万字')
print(data[1], '万阅文总点击')
print(data[2], '万会员周点击')
print(data[3], '万总推荐')
print(data[4], '万周推荐')
# return data """程序主入口"""
if __name__=='__main__':
url = 'https://book.qidian.com/info/1115277' # 选取某一小说
get_html_info(url)
web_font_relation = get_font(get_html_info(url)[0])
pprint.pprint(web_font_relation)#格式化打印网页文字映射关系
get_encode_font(get_html_info(url)[1])
Python3爬取起点中文网阅读量信息,解决文字反爬~~~附源代码的更多相关文章
- 爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中
爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中 准备使用的环境和库Python3.6 + requests + bs4 + csv + multi ...
- Python3爬取起猫眼电影实时票房信息,解决文字反爬~~~附源代码
上文解决了起点中文网部分数字反爬的信息,详细链接https://www.cnblogs.com/aby321/p/10214123.html 本文研究另一种文字反爬的机制——猫眼电影实时票房反爬 虽然 ...
- 零基础爬虫----python爬取豆瓣电影top250的信息(转)
今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习.话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的. python环境:pytho ...
- Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息
本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...
- 使用python爬取MedSci上的期刊信息
使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...
- scrapy爬取全部知乎用户信息
# -*- coding: utf-8 -*- # scrapy爬取全部知乎用户信息 # 1:是否遵守robbots_txt协议改为False # 2: 加入爬取所需的headers: user-ag ...
- 利用xpath爬取招聘网的招聘信息
爬取招聘网的招聘信息: import json import random import time import pymongo import re import pandas as pd impor ...
- 亚马逊商品页面的简单爬取 --Pyhon网络爬虫与信息获取
1.亚马逊商品页面链接地址(本次要爬取的页面url) https://www.amazon.cn/dp/B07BSLQ65P/ 2.代码部分 import requestsurl = "ht ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
随机推荐
- 提高PHP编程效率的20个要点
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中 ...
- 《C#高效编程》读书笔记05-为类型提供ToString()方法
System.Object.ToString()是.NET环境中最常用的方法之一.编写类型时,要提供一个合理的ToString版本,否则使用者就不得不自己构造一套可以阅读的表示. public cla ...
- 什么是Spring
之前已经学习过web三层(数据库链接层dao,业务逻辑控制层service,用户层web). 在开发过程中,我们不断引入更加优秀的工具的目的都是在安全.高效的基础上,简化开发,和易于维护. 所以引入s ...
- nodejs的会话总结
前言: http是一个无状态协议,所以客户端每次发出请求时,下一次请求就无法得知上一次请求所包含的状态数据,那么如何能把一个用户的状态数据关联起来?1.cookie 一开始,人们采用cookie这门技 ...
- Java有关List的stream基本操作
参考博客: https://www.jianshu.com/p/9fe8632d0bc2 Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有I ...
- orbbec astra ros
install instruction: https://www.ncnynl.com/archives/201703/1444.html problem: [ERROR] [1481169521.4 ...
- 微信iOS端无法执行jquery on()方法
微信iOS端无法执行jquery on()方法,click方法可以, 如下代码是不会执行的: $(function(){ $('body').on('click','.cka',function(){ ...
- 实战:ADFS3.0单点登录系列-前置准备
本文为本系列第二篇,主要分为两部分进行介绍, 一.网络拓扑 二.证书制作 还是将本系列目录贴出来,方便导航 实战:ADFS3.0单点登录系列-总览 实战:ADFS3.0单点登录系列-前置准备 实战:A ...
- 获得session中的用户信息
由于每个系统都有往session中放入用户信息以及把用户信息取出来的模块,而且在session中取出用户信息的地方非常之多,所以有必要把session中对用户的操作封装成为一个工具类,以便在以后的使用 ...
- 日常-acm-排列
用1-9组成三个数abc,def,ghi,每个数字恰好出现一次,要求abc:def:ghi=1:2:3.按照“abc def ghi”输出所有解,每行一个解. #include <iostrea ...