起点中文网,在“数字”上设置了文字反爬,使用了自定义的文字文件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爬取起点中文网阅读量信息,解决文字反爬~~~附源代码的更多相关文章

  1. 爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中

    爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中 准备使用的环境和库Python3.6 + requests + bs4 + csv + multi ...

  2. Python3爬取起猫眼电影实时票房信息,解决文字反爬~~~附源代码

    上文解决了起点中文网部分数字反爬的信息,详细链接https://www.cnblogs.com/aby321/p/10214123.html 本文研究另一种文字反爬的机制——猫眼电影实时票房反爬 虽然 ...

  3. 零基础爬虫----python爬取豆瓣电影top250的信息(转)

    今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习.话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的. python环境:pytho ...

  4. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  5. 使用python爬取MedSci上的期刊信息

    使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...

  6. scrapy爬取全部知乎用户信息

    # -*- coding: utf-8 -*- # scrapy爬取全部知乎用户信息 # 1:是否遵守robbots_txt协议改为False # 2: 加入爬取所需的headers: user-ag ...

  7. 利用xpath爬取招聘网的招聘信息

    爬取招聘网的招聘信息: import json import random import time import pymongo import re import pandas as pd impor ...

  8. 亚马逊商品页面的简单爬取 --Pyhon网络爬虫与信息获取

    1.亚马逊商品页面链接地址(本次要爬取的页面url) https://www.amazon.cn/dp/B07BSLQ65P/ 2.代码部分 import requestsurl = "ht ...

  9. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

随机推荐

  1. Linux下mysql定时备份及恢复

    备份 1.数据库定时备份工作脚本:(日期时间作为名称的压缩文件,解压开是sql脚本) /root/backup/script/backup_mysql.sh 2.备份输出路径: /root/backu ...

  2. 使用Java生成带有下划线字体的文字

    HashMap<TextAttribute, Object> hm = new HashMap<TextAttribute, Object>(); hm.put(TextAtt ...

  3. windows 2012 r2 x64 安装IIS注意事项

    详细安装可以参考下面; https://jingyan.baidu.com/article/93f9803f234eade0e46f559f.html 下面只说一些注意事项,如果项目要用到wcf 的话 ...

  4. js 独立命名空间,私有成员和静态成员

    独立的命名空间   1可以避免全局变量污染. 全局变量污染不是 说 被全局变量污染,而是说不会污染全局变量.   2实现私有成员. 在js中函数 就可以满足独立的命名空间的两点需求.   如:     ...

  5. .bak文件数据还原

    .bak文件还原(见下图) 1.连接上数据库,右键数据库,选择新建数据库,输入你要还原数据库的名称 2.数据库右键-->任务-->还原-->数据库,弹出窗口选择[源设备],选择.ba ...

  6. Docker for mac 安装 kong

    首先安装一个 PostgreSQL,选的版本是 9.5 $ docker run -d --name kong-database \ -p : \ -e "POSTGRES_USER=kon ...

  7. maven(多个模块)项目 部署 开发环境 问题处理历程【异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE】

    maven(多个模块)项目 部署 开发环境 问题处理历程[异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE] 201 ...

  8. cf600E. Lomsat gelral(dsu on tree)

    题意 题目链接 给出一个树,求出每个节点的子树中出现次数最多的颜色的编号和 Sol dsu on tree的裸题. 一会儿好好总结总结qwq #include<bits/stdc++.h> ...

  9. ELF interpreter /libexec/ld-elf32.so.1 not found

    ELF interpreter /libexec/ld-elf32.so.1 not found错误, 其实就是在64位平台上运行32位软件的不兼容造成的.找个64的包安装就上ok了.

  10. 360、IE等浏览器对bootstrap的影响

    笔者开发的web程序部署上线后发现,bootstrap的菜单不显示,开发时候用chrome没有发现问题,在360浏览器上跑,发现360默认的是兼容模式,切换到极速模式就能够显示菜单了. 但是这样的用户 ...