大家是不是也和我一样 在遇到一些有反爬和JS比较复杂的网站就头疼 总想着用简单的selenium去解决呢、
可就算我们用selenium自动爬取也会呗发现并出现人机验证
那他们是怎么分辨我们的爬取活动呢
就是上边这个东西把我们暴露了
还有就是 谷歌控制台输入window.navigator.webdriver
如果显示ture 则表示 是自动化脚本在运行谷歌浏览器 会被检测到 可能会被网站做人机处理
如果显示flase 或者 undefined 就代表 没有被检测到时自动脚本运行
# 就是上边这个东西把我们暴露了
# 我也来分享下我在遇到这种问题的一个跳过办法吧
from selenium import webdriver
from lxml import etree
#这里我把他直接写成一个函数了 直接调用赋值就好了
def get_options():
options = webdriver.ChromeOptions()
# 设置参数
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
# 带入参数和插件地址 并执行Chrome
driver = webdriver.Chrome(options=options, executable_path='D:/python37/chromedriver.exe')
# 方法可以用来执行Chrome开发这个工具命令。
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
# 这里的操作大概就是把控制台中的window.navigator.webdriver =undefined 赋值 因为人机操作会认为是Ture
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
return driver
# 使用谷歌插件打开你想要的进入的网站
brower = get_options()
browser.get('https://www.baidu.com')
# 查看网页的数据源码
browser.page_source
for x in browser.find_elements_by_xpath('//div/a'):
# 获取xpath属性 //div/a 下的文本
x.get_attribute('textContent'))
# 获取xpath属性 //div/a 下的@href内容
x.get_attribute('href'))
# 或者直接用lxml的xpath
'''
resp = browser.get('https://www.baidu.com')
html = etree.HTML(resp)
cont = html.xpath('//div/a/text()')
href = html.xpath('//div/a/@href')
'''
用的时候直接调用即可