目标网站:http://www.porters.vip/features/webdriver.html
发现只能用自动化测试工具进行获取......
from selenium import webdriver
import time
"""
WebDriver识别原理
网页只要设置了检查webdriver的Javascript方法,就很容易发现爬虫。
使用的方法就是Navigator对象的webdriver属性,用这个属性来判断客户端是否通过WebDriver驱动浏览器。
如果监测到客户端的webdriver属性存在,则无法继续操作获取数据。selenium,pyppeteer都存在WebDriver属性。
监测结果有3种,分别是true、false和undefind。
当我们使用渲染工具有webdriver属性时,navigation.webdriver的返回值时true。
反之则会返回false或者undefind。
WebDriver识别的绕过方法
了解了WebDriver识别的原理和返回值后,我们就能相处应对的办法。
既然web Driver的识别依赖navigation.webdriver的返回值,
那么我们在触发Javascript办法前将navigation.webdriver的返回值改为false或者undefind,问题就解决了。
注意:
这种修改该属性值的办法只在当前页面有效,当浏览器打开新标签或新窗口时需要重新执行改变navigator.webdriver值的JavaScript代码。
"""
def selenium_spider():
# 创建chrome参数对象
chrome_options = webdriver.ChromeOptions()
# 设置chrome浏览器无界面模式
chrome_options.add_argument('--headless')
# 禁用GPU
chrome_options.add_argument('--disable-gpu')
# 不加载图片, 提升速度
chrome_options.add_argument('blink-settings=imagesEnabled=false')
driver = webdriver.Chrome(options=chrome_options)
url = 'http://www.porters.vip/features/webdriver.html'
driver.get(url)
# 运行Javascript,避免WebDriver被检测
driver.execute_script('Object.defineProperty(navigator,"webdriver",{get:() => false})')
driver.find_element_by_css_selector('.btn.btn-primary.btn-lg').click()
#定位到文章内容元素
elements = driver.find_element_by_css_selector('#content')
time.sleep(1)
print(elements.text)
driver.close()
selenium_spider()
import asyncio
from pyppeteer import launch
async def pyppeteer_spider():
width, height = 1366, 768 # 无界面 # 设置浏览器窗口大小
browser = await launch(headless=True,args=['--disable-infobars',f'--window-size={width},{height}'])
# 启动一个选项卡
page = await browser.newPage()
# 设置显示区域大小
await page.setViewport({'width': width, 'height': height})
# 运行Javascript,避免WebDriver被检测
await page.evaluateOnNewDocument('Object.defineProperty(navigator,"webdriver",{get:() => false})')
# 输入网址
await page.goto('http://www.porters.vip/features/webdriver.html')
# 等待节点加载
await page.waitForSelector('.btn.btn-primary.btn-lg')
# 点击按键
await page.click('.btn.btn-primary.btn-lg')
elements = await(await page.querySelector('#content')).getProperty('textContent')
# 获取文本
print(await elements.jsonValue())
# await asyncio.sleep(3)
await browser.close()
asyncio.get_event_loop().run_until_complete(pyppeteer_spider())