常见的反爬虫技术

爬虫和反爬的对抗一直在进行着…为了帮助更好的进行爬虫行为以及反爬,今天就来介绍一下网页开发者常用的反爬手段。

通过robots.txt来限制爬虫:

爬虫都遵守着一个协议: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]。
解决方法:

  • 这实际上只是一个”君子协议“,遵守与否,都在于爬虫的编写者。
通过User-Agent来控制访问:

无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers 这里面的大多数的字段都是浏览器向服务器”表明身份“用的
对于爬虫程序来说,最需要注意的字段就是:User-Agent
很多网站都会建立 user-agent白名单,只有属于正常范围的user-agent才能够正常访问。
解决方法:

  • 在发送请求时使用该网站user-agent白名单的的UA

可以使用python的第三方模块fake_useragent 随机生成UA,需手动安装

>>> from fake_useragent import FakeUserAgent
>>> ua = FakeUserAgent()
>>> ua.random
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36'
验证码:

最为经典的反爬虫策略当属“验证码”了。因为验证码是图片,用户登录时只需输入一次便可登录成功,而我们程序抓取数据过程中,需要不断的登
录,比如我们需要抓取1000个用户的个人信息,则需要填1000次验证码,而手动输入验证码是不现实的,所以验证码的出现曾经难倒了很多网络爬虫工程师。
解决方法:

  • 分析网站验证码机制,从网站后台或者前端获取验证码(文本形式),该方法只适用于少量网站,因为一般验证码我们很难拿到。
  • 利用图像识别技术,识别验证码文本(例如最近比较火的深度学习Tensorflow等)。
  • 往往一些网站不只有pc端,还有手机端网站,很有可能手机端是不包含验证码的。所以不妨试试手机端网站,也许会有意外收获
IP限制:

另外一种麻烦的反爬虫策略当属封ip和封账号了。本人初期曾经用一台机器抓取拉钩,导致短时间内账号被封,IP被封,所以遇到类似问题一定要多加小心。
解决方法:

  • 最简单的解决办法:限制程序抓取频率,每隔几秒登录一次(如果对抓取数量没有要求,则可以采用这种方法,如果想抓取大量数据,还不得抓取到猴年马月啊)。
  • 既然封账号封IP,那我就用多个账号、多台机器抓取呗,既解决了反爬虫问题,也相当于做了分流处理,降低单台机器带宽压力。
  • 事实证明,有些网站即使我们采用了1)2)方法,还是会被封,这种情况下我们只能去抓取代理IP了,可以写一个专门的爬虫程序用来抓取代理,用这些代理去抓取我们想要的数据。到此为止,基本上封账号、封IP的问题就可以解决了。

通过cookie限制抓取信息,比如我们模拟登陆之后,想拿到登陆之后某页面信息,千万不要以为模拟登陆之后就所有页面都可以抓了,有时候还需要请求一些中间页面拿到特定cookie,然后才可以抓到我们需要的页面。
解决方法:

  • 通过浏览器的F12查看器,观察具体整个过程都请求了哪些URL(主要包括HTML、JS、XHR),挨个试,试到成功为止。
JS渲染:

采用JS渲染页面。什么意思呢,就是返回的页面并不是直接请求得到,而是有一部分由JS操作DOM得到,所以那部分数据我们也拿不到咯。
解决方法:

  • 可以使用Phantomjs模拟浏览器请求返回渲染完JS的页面
  • 通过抓包抓取JS渲染的数据(不推荐)
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,有多种反爬技术的代码可以使用。其中一种常见的方法是使用请求头(User-Agent)伪装成浏览器发送请求,以避免被服务器检测为爬虫。例如,可以使用`requests`库发送请求时设置`headers`参数来模拟浏览器请求头。 ```python import requests url = "http://example.com" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" } response = requests.get(url, headers=headers) ``` 另一种常见反爬技术是验证码。可以使用Python的第三方库,如`tesseract`或`pytesseract`,来处理验证码。这些库可以帮助你识别并自动输入验证码,以绕过验证码的阻碍。 ```python import requests from PIL import Image import pytesseract url = "http://example.com/captcha.jpg" # 下载验证码图片 response = requests.get(url, stream=True) with open("captcha.jpg", "wb") as f: for chunk in response.iter_content(chunk_size=128): f.write(chunk) # 使用tesseract识别验证码 image = Image.open("captcha.jpg") captcha = pytesseract.image_to_string(image) # 发送带验证码的请求 data = { "captcha": captcha, # 其他请求参数 } response = requests.post(url, data=data) ``` 除了上述方法外,还可以使用IP代理池来轮流使用不同的IP地址发送请求,以避免被服务器限制。可以使用第三方库,如`requests-ProxyPool`或`proxypool`来实现。此外,还可以使用动态IP服务提供商提供的API来获取动态IP地址。 总的来说,Python反爬技术代码主要包括请求头伪装、验证码处理和IP代理等方法。根据具体的反爬虫策略和目标网站的防护措施,可以选择适合的代码实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python爬虫——反爬](https://blog.csdn.net/weixin_30906425/article/details/94801488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [python爬虫基本反爬](https://blog.csdn.net/weixin_73513579/article/details/128469988)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值