提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
学习爬虫的时候,会遇到各种各样的加密,对于番茄来说,它的加密主要体现在文字上,也是平常所说的文字加密。
一、什么是文字加密?
文字加密是网站的一种常用的反爬手段,会让提取的内容不能正确的显示出来。
二、步骤
1.引入库
import requests
import parsel
2.构建请求头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0',
}
url = 'https://fanqienovel.com/page/7081535608648109069'
response = requests.get(url=url, headers=headers)
在调试者界面里的network下找到静态资源并构建一个简单的请求头。这个是最简单的请求头,如果希望更安全不被检测到,可以使其更详细一点,具体构造请看前两篇请求头构造方法。
3.构建url列表以及章节目录列表
# 把text转化为可解析内容
re = parsel.Selector(response.text)
# 用CSS节点选择器找到章节名称的位置,getall()获取该节点下所有文本内容
title_list = re.css('.chapter-item .chapter-item-title::text').getall()
# 用CSS节点选择器找到子章节url的位置,getall()获取该节点下所有文本内容
url_list = re.css('.chapter-item .chapter-item-title::attr(href)').getall()
# 看看效果
for title, url in zip(title_list, url_list):
print(title, url)
4.先对第一章进行分析,看看内容是否正确
url = 'https://fanqienovel.com/reader/7402826212915039294'
# 构建请求头
response = requests.get(url=url, headers=headers)
# 转化为解析内容
selector = parsel.Seletor(response.text)
# 获取文章内容
text = selector.css('.muye-reader-content.noselect div div p::text').getall()
# 打印章节内容
print(text)
发现内容有乱码,我们可以通过一个字一个字输出unicode码去看一下,(也可以把列表里面内容各个元素放到一起,具体用join方法):
# 输出每个word的unicode
for line in text:
for wd in line:
print('word:', wd, 'unicode:', ord(wd))
我们可以看到,显示不出来的文字的unicode码明显和正常显示的文字不在一个范围里,这时候我们就需要看url里面的字体文件了。
找到woff2结尾的文件,复制url到网页搜索框中,回车下载下来。然后把下载下来的文件导入到FontCreator中,就会看到unicode码以及对应的汉字了,然后把映射关系导成一个字典,最后循环替换。
# 定义一个空字符串
novel_list = ''
# 在text列表里面循环每一句
for line in text:
# 在每一句里面循环每一个文字
for wd in line:
try:
# 如果能找到相对应的unicode码,说明这个文字是显示不正常的
word = dit_data[str(ord(wd))]
novel_list += word
except:
# 如果找不到,那就是正常显示的汉字,按照原来的汉字就可
word = wd
novel_list += word
# 每一行加个换行
novel_list += '\n'
# 看看效果
print(novel_list)
这里显示都变正常了。
5.构建完整的爬虫
所有的url和标题都爬下来了,章节内容也正常了,现在需要做的就是循环去爬,然后保存就可以了。
总结
以上就是今天要讲的内容,文字加密是的一种最简单反爬机制,只有两套编码,多的三四套也是有的,这样就更麻烦了。在保证能把内容爬下来的前提下,再去分析内容是否有问题,有问题一层一层的解决问题。