使用Selenium+Requests获页面截图遇阻,如何执行目标站点POST请求?
解决kad.arbitr.ru站点Selenium屏蔽及POST请求问题
我需要获取页面截图,但目标站点https://kad.arbitr.ru/屏蔽了Selenium。点击搜索按钮后页面无任何反应,通过开发者工具可发现该操作是通过XHR发送POST请求实现的。我是Python新手,请问如何在该站点执行POST请求?或者有没有其他解决方案?
用户提供的代码:
fp = webdriver.FirefoxProfile() options = Options() #options.headless = True driver = webdriver.Firefox(options=options, executable_path=r'FILES\\geckodriver.exe', firefox_profile=fp) driver.get('https://kad.arbitr.ru/') #pickle.dump( driver.get_cookies() , open("cookies.pkl","wb")) #Cookies #response = webdriver.request('POST', 'https://kad.arbitr.ru/Kad/SearchInstances') #print(response) for request in driver.requests: if request.response: print( request.url, request.response.status_code, request.response.headers['Content-Type'] )
方案一:直接用requests库发送POST请求(新手友好)
既然搜索逻辑是通过XHR的POST请求完成的,完全可以跳过Selenium,直接用requests库模拟这个请求,步骤如下:
- 先安装requests库:
pip install requests
- 抓包获取关键信息:
- 打开浏览器开发者工具(F12),切换到Network标签,点击站点的搜索按钮,找到
SearchInstances这个POST请求 - 复制请求头(Headers)里的
Cookie、User-Agent,以及Form Data里的搜索参数(比如关键词、筛选条件)
- 打开浏览器开发者工具(F12),切换到Network标签,点击站点的搜索按钮,找到
- 编写代码发送请求:
import requests # 请求地址为抓包到的URL url = "https://kad.arbitr.ru/Kad/SearchInstances" # 填入抓包得到的请求头,至少包含以下几项 headers = { "User-Agent": "你的浏览器User-Agent,例如Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0", "Cookie": "从浏览器复制的完整Cookie字符串", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" } # 搜索参数,根据抓包的Form Data填充,比如搜索关键词 data = { "SearchString": "你要搜索的内容", # 其他必填参数从抓包结果中复制补充 } # 发送POST请求并获取响应 response = requests.post(url, headers=headers, data=data) # 打印响应内容,确认请求是否成功 print(response.text)
注意:Cookie存在过期时间,过期后需要重新从浏览器复制;如果请求被拦截,可补充更多抓包得到的请求头字段。
方案二:优化Selenium绕过检测,实现截图
如果必须使用Selenium完成截图,可以通过配置浏览器选项绕过站点的自动化检测,以Firefox为例:
from selenium import webdriver from selenium.webdriver.firefox.options import Options options = Options() # 关闭Selenium的自动化特征标记 options.set_preference("dom.webdriver.enabled", False) options.set_preference('useAutomationExtension', False) options.add_argument('--disable-blink-features=AutomationControlled') # 设置与真实浏览器一致的User-Agent options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0") # 初始化浏览器,新版本Selenium无需使用firefox_profile driver = webdriver.Firefox(options=options) driver.get('https://kad.arbitr.ru/') # 模拟搜索操作(需根据页面实际元素调整选择器) search_box = driver.find_element("id", "SearchString") # 假设搜索框id为SearchString search_box.send_keys("你的搜索关键词") search_button = driver.find_element("id", "searchButton") # 假设搜索按钮id为searchButton search_button.click() # 等待页面加载完成后截图 driver.implicitly_wait(10) driver.save_screenshot("搜索结果截图.png") # 关闭浏览器 driver.quit()
如果Firefox仍被检测,可尝试使用undetected-chromedriver库,该库专门针对反爬检测做了优化,安装后用法与普通Chrome驱动类似。
内容的提问来源于stack exchange,提问作者Руслан Зиборов
相关产品推荐
相关产品推荐

