如何绕过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)模拟人类交互节奏
- 替换固定输入为逐字随机间隔输入,避免机械性的一次性输入:
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)) - 使用
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() - 移除不必要的
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
相关产品推荐
相关产品推荐

