python-使用selenium 和 pyppeteer 获取文本-入门级

目标网站: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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值