常见反爬应对处理

  1. 处理cookie
    coolie作为前端常用的本地存储方式之一,在各网站往往发挥着很重要的作用,比如:保存用户信息以及登录状态。
  • 部分站点会在前端发起http请求时携带cookie,以此来验证用户是否登录,以及登录用户。并对站点信息进行限制,比如某些信息仅在登录状态可见。
  • 还有部分网站同一cookie访问频率过高会被封,此时则需要禁用cookie
  • 实际情况允许条件下利用Selenium实现自动化生成cookie。如下:自动获取boos直聘网站cookie
from selenium import webdriver

 def getCookie(self):
      cookie_dict = {}

      chrome_options = webdriver.ChromeOptions()
      chrome_options.add_argument('--headless')
      chrome_options.add_argument('--disable-gpu')
      self.brower = webdriver.Chrome(chrome_options=chrome_options)
      self.brower.get('http://www.zhipin.com')
      cookies_list = self.brower.get_cookies()
      self.brower.close()
      for cookie in cookies_list:
          cookie_dict[cookie['name']] = cookie['value']
      return cookie_dict
  • 维护cookie列表使用时,随机抽取
  1. User-Agent
    http请求头的一部分,向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。许多网站会对该信息进行识别,以判断是否为爬虫程序。
    因此在爬虫程序发起http请求时,常设置伪装User-Agent,来模拟真实浏览器。可自己维护一个列表存储虚假的User-Agent,使用时随机抽取,或使用第三方库,例如: fake_useragent

demo

import random

user_agent = [
            "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
            "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
            "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
            "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
            "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
            "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
            "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
            "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
            "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10",
            "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)",
            "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB5",
            "Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E)",
            "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
            "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
            "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0",
            "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110622 Firefox/6.0a2",
            "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"                   
        ]

def getUserAgent():
    return random.choice(user_agent)
  1. 设置代理ip
    当对目标网站访问频率过高时,往往会被默认识别为网络爬虫。而禁止高频率访问ip访问往往是最常用的反爬手段。此时则需要使用代理ip来访问目标站点。
    可自维护ip代理池或购买代理ip,在ip被封后更换代理ip,继续爬取。

  2. 控制爬取频率
    高频率请求目标站点则容易被目标站点封锁,而对于一些小站点还可能会造成服务器瘫痪的问题。因此要适当控制请求频率。建议休眠时间为一个随机值
    可使用例如:

#2~6s随机休眠来控制
time.sleep(random.randrange(2, 6)) 
  1. 分类处理多套前端项目结构
    部分网站会识别访问者为疑似爬虫代码,于是会返回不同页面结构的网页,对于此种情况可进行类型判断,实现分类爬取。

  2. Selemium
    Selenium是一自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击,拖动等。现在网站多为前后端分离项目,部分数据需要AJAX请求获取,而通过AJAX 接口的数据多为加密数据,因此需要模拟浏览器行为来获取目标数据。此时Selenium十分适合。总之利用该工具,尽可能模拟实际用户操作。

资料

selenium文档

  1. 验证码识别(实际体验不是很理想,提供相关资料参考

极验验证demo

#     # boos直聘模拟滑动登录
#     @classmethod
#     def userLogin(cls, browser):
#         mySetting = get_project_settings()
#         indexLoginBtn = browser.find_element_by_xpath("//a[@ka='header-login']")
#         indexLoginBtn.click()
#         accountIpt = browser.find_element_by_xpath("//input[@name='account']")
#         passwordIpt = browser.find_element_by_xpath("//input[@name='password']")
#         slider = browser.find_element_by_css_selector('.btn_slide')
#         loginBtn = browser.find_element_by_css_selector('.btn')
#         accountIpt.send_keys(mySetting.get('USER_NAME'))
#         passwordIpt.send_keys(mySetting.get('USER_PASSWORD'))
#         ActionChains(browser).click_and_hold(slider).perform()
#         tracks = cls.get_track(280)
#         for x in tracks:
#             ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()
#         time.sleep(0.5)
#         ActionChains(browser).release().perform()
#         time.sleep(1)
#         loginBtn.click()
#
#     # 获取轨迹
#     @classmethod
#     def get_track(cls, distance):
#         # 移动轨迹
#         track = []
#         # 当前位移
#         current = 0
#         # 减速阈值
#         mid = distance * 4 / 5
#         # 计算间隔
#         t = 0.2
#         # 初速度
#         v = 0
#
#         while current < distance:
#             if current < mid:
#                 a = 2
#             else:
#                 a = -3
#             v0 = v
#             v = v0 + a * t
#             move = v0 * t + 1 / 2 * a * t * t
#             current += move
#             track.append(round(move))
#         return track

资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

衣乌安、

嘿嘿,好心人赏俩钱儿~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值