一次Python爬虫实战,解决反爬问题!_多多防爬

本文讲述了如何通过Python应对论坛的字体反爬策略,涉及User-Agent、IP代理和字体替换技术。作者分享了从分析需求、发起请求、识别字体替换机制到数据抓取的过程,并提倡系统化学习的重要性。最后推荐了一份免费的Python学习资源和一个技术交流社区。
摘要由CSDN通过智能技术生成

人生苦短,快学Python!

随着互联网的发展,Python的崛起,很多网站经常被外面的爬虫程序骚扰,有什么方法可以阻止爬虫吗?

阻止爬虫也就称之为反爬虫,反爬虫涉及到的技术比较综合,说简单也简单,说复杂也复杂,看具体要做到哪种保护程度了。

针对于不同的网站,它的反爬措施不一样,常见的反爬有User-Agent、ip代理、cookie认证,js加密等等,与之对应所保护的数据也不一样。比如某宝某猫等电商网站,那么店铺信息用户信息就比较重要了,像是某眼电影网站,它对于电影评分,票房等信息做了反爬处理。

我们今天的采集目标网站是某论坛,当对其文章的文本数据进行采集时,但是发现有字体反爬措施,就是有的文本数据被替换了。(文末附python学习资料)

一、需求分析

我们是需要爬取论坛文本数据,如下图所示:
在这里插入图片描述
部分网页源码展示:
在这里插入图片描述
我们发现文本数据是在网页源码里面的。

二、发起请求

import requests
url = "https://club.autohome.com.cn/bbs/thread/665330b6c7146767/80787515-1.html"
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"}
r = requests.get(url, headers=header)
html = etree.HTML(r.text)  
content = html.xpath("//div[@class='tz-paragraph']//text()")
print(content)

然后得到如下数据(部分数据截图):
在这里插入图片描述
虽然在网页源码里面存在目标数据,但是通过requests简单请求之后发现有的文字被特殊字符替换掉了,此时再次查看Elenments对应的标签里的数据,如下图所示:
在这里插入图片描述
由图可以发现有的字被替换掉了,所以我们需要找到汉字被替换的方式,然后替换回去。

三、字体替换

我们知道系统字体一般都是xxxx.ttf的文件形式,如下图所示:
在这里插入图片描述
通过检查发现该网站中使用的字体对应的是myfont,这个很明显是网站为了反爬设置的自定义的字体:
在这里插入图片描述
了解css的伙计应该知道,网页的字体样式放在了style标签里面,如下图所示:
在这里插入图片描述
然后拿到url对应属性(xxx57…ttf),

//k3.autoimg.cn/g1/M02/D0/99/wKgHFVsUz1eAH_VRAABj9PS-ubk57…ttf

查看后发现是一个字体文件:
在这里插入图片描述
然后打开字体查看文件,把字体文件拖拽进去,如下图所示:(使用软件为FontCreator,可以查看字体的软件)

如果不想使用软件,可以打开百度字体平台网站,对应页面和软件打开是一样的
在这里插入图片描述
粗略一看其实发现不了什么,所以我们需要使用fontTools第三方库查看字体文件:

from fontTools.ttLib import TTFont
font = TTFont('./wKgHFVsUz1eAH_VRAABj9PS-ubk57..ttf')
print(font.getGlyphOrder())

结果如下图所示:
在这里插入图片描述
然后我们发现比如在先前的特殊字符表中,
在这里插入图片描述
这三个字应该分别对应于,大 、的、一,首先大对应的后缀为edb8,在字体文件的输出的列表中中有一个uniEDB8,对应于第六个,然后再FontCreator软件中刚好对应第六个汉字大,如下图所示:
在这里插入图片描述
所以规律就是这样的。

四、数据抓取

1、先把对应的汉字打出来储存在一个列表中;

word_list = ['很', '五', '多', '远', '大', '十', '更', '了', '的', '矮', '不', '少', '九', '三', '八', '一', '右', '坏', '近', '着', '呢','左', '是', '长', '六', '上', '短', '七', '高', '二', '得', '好', '下', '和', '四', '地', '小', '低']

2、把字体文件对应的特殊字符保存到另一个列表中,边进行处理;

font = TTFont('wKgHFVsUz1eAH_VRAABj9PS-ubk57..ttf')
unilist = font.getGlyphOrder()
uni_list = []
for i in unilist[1:]:
    s = r'\u' + i[3:]
    uni_list.append(s)
print(uni_list)

但是问题出现了,结果如下:
在这里插入图片描述
我们发现出现了两个反斜线,所以需要使用eval函数简单修改:

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值