You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绕过58同城反爬检测,使用Selenium完成搜索操作?

问题描述

我尝试使用Selenium从南京58同城(nj.58.com)抓取数据,可访问首页及部分内部链接,但在访问特定URL时,即便模拟人类交互操作,仍被网站识别为网络爬虫。

我已基于undetected_chromedriver编写Selenium脚本,但在点击搜索按钮(search_btn)时触发了反爬响应,陷入瓶颈。

我的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.ui import Select
import undetected_chromedriver as uc
import time
import pandas as pd

driver = uc.Chrome()
website = 'https://nj.58.com/'

driver.get(website)
driver.implicitly_wait(4)
wait = WebDriverWait(driver, 10)
driver.maximize_window()

switch_city = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#commonTopbar_ipconfig > a"))).click()

city_location = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#selector-search-input')))
city_location.clear()
city_location.send_keys('南京' + Keys.RETURN)

keyword = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#keyword')))
keyword.clear()
keyword.send_keys('"废纸回收"')
time.sleep(2)

search_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#searchbtn')))
search_btn.click()

点击search_btn后,我期望看到目标物品列表,却在该环节被识别为网络爬虫,请问如何在此节点绕过反爬/反人类检测?

解决方案

针对58同城的反爬机制,可从以下几个维度优化脚本:

  • 强化浏览器伪装配置
    undetected_chromedriver的默认参数仍有被检测的风险,添加更贴近真实浏览器的启动配置:

    import random
    from selenium.webdriver.common.action_chains import ActionChains
    
    options = uc.ChromeOptions()
    # 禁用自动化特征检测
    options.add_argument("--disable-blink-features=AutomationControlled")
    # 设置真实用户代理(替换为当前主流Chrome的UA)
    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")
    # 禁用扩展、沙箱等非必要组件
    options.add_argument("--disable-extensions")
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")
    # 启用图片加载,避免无图模式触发检测
    options.add_argument("--blink-settings=imagesEnabled=true")
    # 启动时直接最大化窗口
    options.add_argument("--start-maximized")
    
    driver = uc.Chrome(options=options)
    
  • 模拟人类交互节奏

    1. 替换固定输入为逐字随机间隔输入,避免机械性的一次性输入:
      keyword = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#keyword')))
      keyword.click()  # 先点击输入框,模拟人类激活输入的动作
      # 逐字输入关键词,每个字符间隔随机时间
      for char in '废纸回收':
          keyword.send_keys(char)
          time.sleep(0.1 + random.uniform(0.05, 0.2))
      # 输入完成后随机停顿1-3秒
      time.sleep(random.uniform(1, 3))
      
    2. 使用ActionChains模拟真实点击流程:先移动到按钮,停顿片刻再点击,而非直接调用click():
      search_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#searchbtn')))
      ActionChains(driver).move_to_element(search_btn).pause(random.uniform(0.3, 0.7)).click(search_btn).perform()
      
    3. 移除不必要的clear()操作:首页关键词输入框默认为空,人类不会额外执行清空动作。
  • 优化等待逻辑
    移除driver.implicitly_wait(4),避免与WebDriverWait的显式等待产生冲突,所有等待都使用WebDriverWait确保元素就绪后再操作。

  • 添加随机化延迟
    把所有固定的time.sleep()替换为随机范围的延迟,比如time.sleep(random.uniform(1.2, 2.8)),让操作节奏更接近人类的自然停顿。

  • Cookie会话复用
    手动打开浏览器访问南京58同城,完成可能的人机验证或浏览后,导出当前Cookie,在脚本启动后导入这些Cookie,跳过初始检测环节:

    # 示例:导入Cookie(需替换为你手动获取的Cookie内容)
    cookies = [
        {"name": "cookie_name1", "value": "cookie_value1", "domain": ".58.com"},
        # 更多Cookie项...
    ]
    driver.get("https://nj.58.com/")
    for cookie in cookies:
        driver.add_cookie(cookie)
    driver.refresh()
    

内容的提问来源于stack exchange,提问作者Temidayo Amure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:56:11