设为首页收藏本站language 语言切换
查看: 1373|回复: 0
收起左侧

[其他情况] 如何避免Selenium爬虫被网站识破

[复制链接]
发表于 2023-5-31 16:34:08 | 显示全部楼层 |阅读模式
在对一些需要进行登陆操作的网站爬取时,通常都会使用到Selenium。但是Selenium爬虫在爬取数据时也是会被网站检测到,这是因为Selenium模拟了浏览器行为,而相对于真实用户的浏览器,Selenium模拟无法识别JavaScript代码和CSS文件。此外,网站也可能通过检测请求头、IP地址、Cookie等信息来判断是否是爬虫。
接下来我们就详细的来了解下这些原因是怎么产生的。
1、请求头信息:一般情况下Selenium提供的请求头信息与正常的浏览器请求头略有不同,所以需要自定义User-Agent字段让请求头更像正常的浏览器。
2、IP封禁或限制访问:如果频繁使用同一个IP地址进行数据爬取,服务器可能会将该IP地址视为恶意IP并加入黑名单。
3、Cookie验证:部分网站可能会在登录后,在后续的每个请求中都要求携带相关的Cookie信息。
4、页面加载速度:如果程序访问频率过高,页面加载时间却显示异常迅速,网站越是往后就越容易加强反爬虫措施了。
以下就是针对上述问题而提供的解决方式:
1、更换User-Agent:可以在每个请求中使用不同的User-Agent字段,避免与其他请求相同IP和头部参数给网站接口留下“爬虫”的印象。
2、设置合理的间隔时间:通过设置适当间隔(如访问网站后1-5秒内不再访问),以模拟真实用户的行为,减少被检测到的概率。
3、使用代理IP:代理IP可以隐藏你的真实IP地址,但是如果时间较长或请求次数太频繁,代理IP也有被风控的危险,所以尽量使用更多,质量更好的IP池。
以下是一段使用代理IP的Selenium爬虫示例代码,可以在每次请求时更换一个随机代理IP,这种就是隧道转发模式的代理,需要注意的是,要使用合法、高质量的代理IP服务提供商比如亿牛云代理,以避免安全和质量问题。
  1.     from selenium import webdriver
  2.     import string
  3.     import zipfile

  4.     # 代理服务器(产品官网 www.16yun.cn)
  5.     proxyHost = "t.16yun.cn"
  6.     proxyPort = "3111"

  7.     # 代理验证信息
  8.     proxyUser = "username"
  9.     proxyPass = "password"


  10.     def create_proxy_auth_extension(proxy_host, proxy_port,
  11.                                     proxy_username, proxy_password,
  12.                                     scheme='http', plugin_path=None):
  13.         if plugin_path is None:
  14.             plugin_path = r'/tmp/{}_{}@t.16yun.zip'.format(proxy_username, proxy_password)

  15.         manifest_json = """
  16.         {
  17.             "version": "1.0.0",
  18.             "manifest_version": 2,
  19.             "name": "16YUN Proxy",
  20.             "permissions": [
  21.                 "proxy",
  22.                 "tabs",
  23.                 "unlimitedStorage",
  24.                 "storage",
  25.                 "<all_urls>",
  26.                 "webRequest",
  27.                 "webRequestBlocking"
  28.             ],
  29.             "background": {
  30.                 "scripts": ["background.js"]
  31.             },
  32.             "minimum_chrome_version":"22.0.0"
  33.         }
  34.         """

  35.         background_js = string.Template(
  36.             """
  37.             var config = {
  38.                 mode: "fixed_servers",
  39.                 rules: {
  40.                     singleProxy: {
  41.                         scheme: "${scheme}",
  42.                         host: "${host}",
  43.                         port: parseInt(${port})
  44.                     },
  45.                     bypassList: ["localhost"]
  46.                 }
  47.               };

  48.             chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

  49.             function callbackFn(details) {
  50.                 return {
  51.                     authCredentials: {
  52.                         username: "${username}",
  53.                         password: "${password}"
  54.                     }
  55.                 };
  56.             }

  57.             chrome.webRequest.onAuthRequired.addListener(
  58.                 callbackFn,
  59.                 {urls: ["<all_urls>"]},
  60.                 ['blocking']
  61.             );
  62.             """
  63.         ).substitute(
  64.             host=proxy_host,
  65.             port=proxy_port,
  66.             username=proxy_username,
  67.             password=proxy_password,
  68.             scheme=scheme,
  69.         )
  70.         print(background_js)

  71.         with zipfile.ZipFile(plugin_path, 'w') as zp:
  72.             zp.writestr("manifest.json", manifest_json)
  73.             zp.writestr("background.js", background_js)

  74.         return plugin_path


  75.     proxy_auth_plugin_path = create_proxy_auth_extension(
  76.         proxy_host=proxyHost,
  77.         proxy_port=proxyPort,
  78.         proxy_username=proxyUser,
  79.         proxy_password=proxyPass)

  80.     option = webdriver.ChromeOptions()

  81.     option.add_argument("--start-maximized")

  82.     # 如报错 chrome-extensions
  83.     # option.add_argument("--disable-extensions")

  84.     option.add_extension(proxy_auth_plugin_path)

  85.     # 关闭webdriver的一些标志
  86.     # option.add_experimental_option('excludeSwitches', ['enable-automation'])

  87.     driver = webdriver.Chrome(
  88.         chrome_options=option,
  89.         executable_path="./chromdriver"
  90.     )

  91.     # 修改webdriver get属性
  92.     # script = '''
  93.     # Object.defineProperty(navigator, 'webdriver', {
  94.     # get: () => undefined
  95.     # })
  96.     # '''
  97.     # driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script})


  98.     driver.get("https://httpbin.org/ip")
复制代码
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-2 18:12 , Processed in 0.056549 second(s), 23 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表