最全反爬虫技术介绍(代码片段)

Lovebugs的小园子 Lovebugs的小园子     2022-10-30     736

关键词:

反爬虫 的技术大概分为四个种类:

 

注:文末有福利!

一、通过User-Agent来控制访问:

无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers,比如知乎的requests headers:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,da;q=0.2,la;q=0.2
Cache-Control:max-age=0
Connection:keep-alive
Cookie: **********
Host:http://zhuanlan.zhihu.com
Referer:Ehco - 知乎
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Query String Parameters
view source
view URL encoded

这里面的大多的数的字段都是浏览

这里面的大多数的字段都是浏览器向服务器”表明身份“用的
对于爬虫程序来说,最需要注意的字段就是:User-Agent
很多网站都会建立 user-agent白名单,只有属于正常范围的user-agent才能够正常访问。

比如知乎:

import requests
import bs4
import random


def get_html(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "Someting Wrong!"
        
print(get_html(\'https://zhuanlan.zhihu.com\'))

# OUT:
\'\'\'
<html><body><h1>500 Server Error</h1>
An internal server error occured.
</body></html>
\'\'\'

可以看到,这里的请求被拒绝了,并且返回了一个500的错误码:
这里就是因为requests库本身的headers是这样的:

\'Date\': \'Tue, 09 May 2017 12:13:00 GMT\', \'Content-Type\': \'text/html\', \'Transfer-Encoding\': \'chunked\', \'Connection\': \'keep-alive\', \'Set-Cookie\': \'aliyungf_tc=AQAAAPDDXQnf6AEAHaBXcP1tHo5z1uta; Path=/; HttpOnly, acw_tc=AQAAAAM
89GeptQMAHaBXcJiyTK3l8c5g; Path=/; HttpOnly\', \'Cache-Control\': \'no-cache\'

这里面并没有user-agent字段,自然不被知乎的服务器所接受了。

解决方法:

可以自己设置一下user-agent,或者更好的是,可以从一系列的user-agent里随机挑出一个符合标准的使用,代码如下:

def get_agent():
    \'\'\'
    模拟header的user-agent字段,
    返回一个随机的user-agent字典类型的键值对
    \'\'\'
    agents = [\'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;\',
              \'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv,2.0.1) Gecko/20100101 Firefox/4.0.1\',
              \'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11\',
              \'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11\',
              \'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)\']
    fakeheader = 
    fakeheader[\'User-agent\'] = agents[random.randint(0, len(agents))]
    return fakeheader
    
    # 注意看新的请求函数:
    
    def get_html(url):
    try:
        r = requests.get(url, timeout=30,headers=get_agent())
        r.raise_for_status
        r.encoding = r.apparent_encoding
        return r.status_code    
    except:
        return "Someting Wrong!"
       
    \'\'\'
    OUT:
    200
    \'\'\' 

二、通过IP限制来反爬虫:

如果一个固定的ip在短暂的时间内,快速大量的访问一个网站,那自然会引起注意,管理员可以通过一些手段把这个ip给封了,爬虫程序自然也就做不了什么了。

解决方法:

比较成熟的方式是:IP代理池
简单的说,就是通过ip代理,从不同的ip进行访问,这样就不会被封掉ip了。
可是ip代理的获取本身就是一个很麻烦的事情,网上有免费和付费的,但是质量都层次不齐。如果是企业里需要的话,可以通过自己购买集群云服务来自建代理池。

这里实现了一个简单的代理转换,代码如下:

def get_proxy():
    \'\'\'
    简答模拟代理池
    返回一个字典类型的键值对,
    \'\'\'
    proxy = ["http://116.211.143.11:80",
             "http://183.1.86.235:8118",
             "http://183.32.88.244:808",
             "http://121.40.42.35:9999",
             "http://222.94.148.210:808"]
    fakepxs = 
    fakepxs[\'http\'] = proxy[random.randint(0, len(proxy))]
    
    return fakepxs

三、通过JS脚本来防止爬虫:

这个可以说是终极的办法了,因为,爬虫终归只是一段程序,它并不能像人一样去应对各种变化,如验证码,滑动解锁之类的。
举个例子:如果想爬取某个网站,但是在进入网站之前,它会有一个验证页面来验证你是不是机器。
它是怎么验证的呢:

他会通过js代码生成一大段随机的数字,然后要求浏览器通过js的运算得出这一串数字的和,再返回给服务器.

可想而知,这么简单和最基础的一个验证步骤,会是写的代码完成不了的。

解决方法:
这里就要请出一个大杀器:”PhantomJS“

PhantomJS是一个Python包,他可以在没有图形界面的情况下,完全模拟一个”浏览器“,js脚本验证什么的再也不是问题了。

四、通过robots.txt来限制爬虫:

世界上做爬虫最大最好的就是Google了,搜索引擎本身就是一个超级大的爬虫,Google开发出来爬虫24h不间断的在网上爬取着新的信息,并返回给数据库,但是这些搜索引擎的爬虫都遵守着一个协议:robots.txt

robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。
robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。robots.txt允许使用类似"Disallow: *.gif"这样的通配符[1][2]。

wiki上说的已经很清楚了,这实际上只是一个”君子协议“,遵守与否,都在于爬虫的编写者。

来看一下京东的\'robots.txt\':

User-agent: * 
Disallow: /?* 
Disallow: /pop/*.html 
Disallow: /pinpai/*.html?* 
User-agent: EtaoSpider 
Disallow: / 
User-agent: HuihuiSpider 
Disallow: / 
User-agent: GwdangSpider 
Disallow: / 
User-agent: WochachaSpider 
Disallow: /

可以看到,京东的robots协议里明确的指出四个”user-agent”是禁止访问的,
事实上,这四个user-agent也是四个臭名昭著的恶性爬虫。

所以最好遵守这个规则!,互联网上的很多资源都是免费的,但是如果因为个人的利益,而损害到别人,这是很不对的!

当然有种情况是例外的,比如说我们爬虫的获取网页的速度,和人类浏览网页是差不多的,这并不会给服务器造成太大的性能损失,在这种情况下,我们是可以不用恪守 robots协议的。

 

最后,给大家推荐一个良心公众号【IT资源社】:

本公众号致力于免费分享全网最优秀的视频资源,学习资料,面试经验等,前端,PHP,JAVA,算法,Python,大数据等等,你想要的这都有

IT资源社-QQ交流群:601357554

微信搜索公众号:ITziyuanshe 或者扫描下方二维码直接关注,

里面基本什么资料都有,基础到进阶到项目实战,如果觉得不够还可以加群跟群主要,最重要的是全部免费!

 

pythonscrapy反爬虫常见解决方案(包含5种方法)(代码片段)

爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫。比如前面介绍的通过User-Agent请求头验证是否为浏览器、使用 JavaScript动态加载资源等,这些都是... 查看详情

反爬虫(代码片段)

反爬虫反爬虫:就是使用任何技术手段阻止批量获取网站信息的方式;其实我们做的就是了解反爬虫的技术,继而反反爬虫。反爬虫的方式(1)不返回网页;网站通过ip访问量反爬虫,对访问进行统计,单个ip访问量超过阈值,... 查看详情

网络爬虫常用技术(下)(代码片段)

...是因为这些网页为了防止恶意采集信息,所使用的反爬虫设置。此外可以通过模拟浏览器的头部信息来进行访问,这样就能剞劂以上反爬设置问题。下面以requests模块为例介绍头部headers的处理 查看详情

爬虫与反爬虫技术简介(代码片段)

互联网的大数据时代的来临,网络爬虫也成了互联网中一个重要行业,它是一种自动获取网页数据信息的爬虫程序,是网站搜索引擎的重要组成部分。通过爬虫,可以获取自己想要的相关数据信息,让爬虫协... 查看详情

python爬虫最全总结(代码片段)

python爬虫–总结前文回顾python爬虫–类级别写法python爬虫–爬取9某1看剧网电视剧python爬虫–爬取网易云音乐评论python爬虫–scrapy(再探)python爬虫–scrapy(初识)python爬虫–selenium模块python爬虫–异步文章目录pyt... 查看详情

python爬虫最全总结(代码片段)

python爬虫–总结前文回顾python爬虫–类级别写法python爬虫–爬取9某1看剧网电视剧python爬虫–爬取网易云音乐评论python爬虫–scrapy(再探)python爬虫–scrapy(初识)python爬虫–selenium模块python爬虫–异步文章目录pyt... 查看详情

scrapy突破反爬虫的限制(代码片段)

7-1爬虫和反爬的对抗过程以及策略基本概念爬虫:自动获取网站数据的程序,关键是批量的获取反爬虫:使用技术手段防止爬虫程序的方法误伤:反爬技术将普通用户识别为爬虫,如果误伤过高,效果再好也不能用一般ip地址禁... 查看详情

反-反爬虫:用几行代码写出和人类一样的动态爬虫

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~作者:李大伟 Phantomjs简介什么是PhantomjsPhantomjs官网介绍是:不需要浏览器的完整web协议栈(FullwebstackNobrowserrequired),也就是常说的无头浏览器——或者好听点... 查看详情

史上最最最最最最最最全python爬虫总结(代码片段)

(1)普通的内容爬取(2)保存爬取的图片/视频和文件和网页(3)普通模拟登录(4)处理验证码登录(5)爬取js网站(6)全网爬虫(7)某个网站的站内所有目录爬虫(8)多线程 (9)爬虫框架Scrapy  一,普通的内容... 查看详情

python爬虫技术之selenium自动化测试及模拟点击页面爬虫最全知识(代码片段)

Python爬虫之Selenium一、基础认识1、解释2、流程3、安装库3.1下载selenium库的命令3.2下载谷歌浏览器Chrome对应的驱动3.3样例4、implicitly_wait和time.sleep二、元素的选择1、通过id来选择对应元素1.1解释1.2样例2、根据class属性、tag名选择元... 查看详情

❤️这些反爬技术,你能搞定多少?❤️(对应看看你的爬虫技术修炼到哪个阶段了!)(代码片段)

👉在爬虫技术泛滥的今天,有不少小伙伴或是因为兴趣,或是因为工作所需,决定去学习爬虫,一入爬虫坑~👈《一篇万字博文带你入坑爬虫这条不归路【万字图文】》💩<-🐷但是,从最近... 查看详情

❤️这些反爬技术,你能搞定多少?❤️(对应看看你的爬虫技术修炼到哪个阶段了!)(代码片段)

👉在爬虫技术泛滥的今天,有不少小伙伴或是因为兴趣,或是因为工作所需,决定去学习爬虫,一入爬虫坑~👈《一篇万字博文带你入坑爬虫这条不归路【万字图文】》💩<-🐷但是,从最近... 查看详情

爬虫与反爬(代码片段)

爬虫与反爬(1)基本的概念爬虫:自动获取网站数据的程序关键是定时,定量的,批量的获取反爬虫:使用技术手段防止爬虫程序的方法存在误伤,即反爬技术将普通用户识别为爬虫如果误伤高---效果再好也不能使用例子: 比... 查看详情

知识卡片|最全rip动态路由协议技术详解(代码片段)

前言上一章节我们介绍了静态路由协议,如何通过静态路由实现负载分担和主备路由?|内附知识卡片总结。今天我们一起来看下RIP动态协议,其实不管时静态路由协议还是动态路由协议,他们最终的目的都是生成路由,路由器... 查看详情

反爬虫——使用chromeheadless时一些需要注意的细节(代码片段)

以前我们介绍过chromeheadless的用法(https://www.cnblogs.com/apocelipes/p/9264673.html)。今天我们要稍微提一下其中一个细节。 反爬和window.navigator对象navigator对象,一个对大家来说既熟悉又陌生的名词,熟悉是因为在学BOM对象的时候... 查看详情

python爬虫学习框架介绍(代码片段)

...往变化较小,今天我们以自学的角度来了解一下Python爬虫的知识体系吧。    一、python爬虫提取信息的基本步骤:    1,获取数据    2,解析数据    3&#x 查看详情

一个依赖搞定springboot反爬虫,防止接口盗刷!(代码片段)

...kk-anti-reptile是适用于基于spring-boot开发的分布式系统的反爬虫组件系统要求基于spring-boot开发(spring-boot1.x,spring-boot2.x均可)需要使用redis工作流程kk-anti-reptile使用基于Servlet规范的的Filter对请求进行过滤,在其内部通过spring- 查看详情

常见的一些反爬虫策略(上篇)-java网络爬虫系统性学习与实战系列

...系方式概述反爬虫策略通过User-Agent校验反爬(附上网上最全User-Agent爬虫名单)网上最全User-Agent爬虫名单设置访问频率限制IP限制Cookie限制Referer通过蜜罐资源反爬动态变换网页结构基于用户行为反爬虫通过JS动态渲染反爬验证码... 查看详情