【基础】【Python网络爬虫】【9.Selenium进阶】下拉滚动条、鼠标动作链、键盘事件、无头模式、应对检测、Pyppeteer异步爬虫(附大量案例代码)(建议收藏)

Python网络爬虫基础

  • Selenium 进阶
    • 1. 嵌套网页页面
    • 2. 下拉滚动条
        • 案例 - selenium京东
    • 3. 鼠标动作链
        • 案例 - 码云登录后解决消息提示框
    • 4. 键盘事件
    • 5. 下拉框处理
    • 6. 弹窗的处理
    • 7. 无头模式
    • 8. selenium应对检测
        • 案例 - 网易云评论selenium
        • 案例 - selenium问卷星
  • Pyppeteer简介
    • 1. 环境安装
    • 2. 快速上手
    • 3. 详细用法
      • 开启浏览器
      • 处理页面显示问题:访问某宝首页
      • 规避检测
    • 4. 节点交互
        • 案例 - 异常selenium爬虫
    • 5. 滑动验证

Selenium 进阶

1. 嵌套网页页面

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://music.163.com/#/song?id=1450083773')

"""切换进入到嵌套网页有两种方法"""
# 方式1
# frame(0)  根据索引进入到嵌套网页, 索引从0开始, 索引的值不能超过当前网页已有的嵌套网页数量
# driver.switch_to.frame(0)


# 方式2
iframe_label = driver.find_element(By.CSS_SELECTOR, '#g_iframe')
driver.switch_to.frame(iframe_label)

driver.switch_to.parent_frame()  # 从嵌套网页切换到父级网页
print(driver.page_source)

input()
driver.quit()

"""
如果当前网页有好几层嵌套结构, 那么需要一层一层进入, 退出也要一层一层退出

div + css 

嵌套网页常见于注册或者登录的区域

后续用selenium操作任何一个网页, 首先第一步就是要查看网页有没有嵌套结构
"""

2. 下拉滚动条

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.douban.com/')

# document.documentElement.scrollTop   指定滚动条的位置
# document.documentElement.scrollHeight 获取当前页面的最大高度
js = 'document.documentElement.scrollTop=3000'
js_all = 'document.documentElement.scrollTop = document.documentElement.scrollHeight'
driver.execute_script(js_all)

input()
driver.quit()
案例 - selenium京东
import csv
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

def search_product(key):
    """指定关键字搜索商品"""

    # 找到搜索框输入商品关键字
    driver.find_element(By.CSS_SELECTOR, '#key').send_keys(key)
    # 点击搜索按钮
    driver.find_element(By.CSS_SELECTOR, '.button>i').click()

def drop_down():
    """实现页面的下拉操作"""
    # js_all = 'document.documentElement.scrollTop = document.documentElement.scrollHeight'
    # driver.execute_script(js_all)

    for i in range(1, 10, 2):  # 13579
        j = i / 14  # 1/9  3/9  5/9  7/9  9/9
        js_all = 'document.documentElement.scrollTop = document.documentElement.scrollHeight*%f' % j
        driver.execute_script(js_all)
        time.sleep(0.5)  # 给一定的时间渲染加载数据


def parse_data():
    """解析数据函数"""
    lis = driver.find_elements(By.CSS_SELECTOR, '.gl-item')
    for li in lis:
        try:
            title = li.find_element(By.CSS_SELECTOR, 'div.p-name>a>em').text  # 商品名字
            title = title.replace('京品电脑', '').replace('京东超市', '').replace('\n', '')

            price = li.find_element(By.CSS_SELECTOR, 'div.p-price>strong>i').text  # 价格
            deal = li.find_element(By.CSS_SELECTOR, 'div.p-commit>strong>a').text  # 评论数量
            name = li.find_element(By.CSS_SELECTOR, 'span.J_im_icon>a').text  # 店铺名字

            print(title, price, deal, name, sep=' | ')

            with open('某东.csv', mode='a', encoding='utf-8', newline='') as f:
                csv_write = csv.writer(f)
                csv_write.writerow([title, price, deal, name])

        except Exception as e:
            print(e)

def get_next():
    """点击下一页"""
    driver.find_element(By.CSS_SELECTOR, '.pn-next>em').click()

if __name__ == '__main__':
    word = input('请输入你那药搜索商品的关键字:')
    driver = webdriver.Chrome()
    driver.get('https://www.jd.com/')
    driver.implicitly_wait(10)
    driver.maximize_window()

    # 调用商品搜索功能函数
    search_product(word)

    for i in range(100):
        time.sleep(1)
        # 调用页面下拉函数
        drop_down()

        # 调用解析数据函数
        parse_data()

        # 点击下一页
        get_next()

    input()
    driver.quit()

3. 鼠标动作链

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains  # 导入鼠标动作链对象

driver = webdriver.Chrome()
driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

# 进入嵌套网页
driver.switch_to.frame(0)

# 找到可以拖动的标签
drag = driver.find_element(By.CSS_SELECTOR, '#draggable')

# 找到需要放置的标签
drop = driver.find_element(By.CSS_SELECTOR, '#droppable')

"""动作链对象操作"""
# 以下是分开写的, 后续可以直接链式调用
# 1. 实例化动作链对象, 括号内部需要传递当前driver浏览器对象
action = ActionChains(driver)

# 2. 编排一个鼠标动作, 但是这个动作还没执行
action.drag_and_drop(drag, drop)

# 3. 执行动作
action.perform()

input()
driver.quit()

"""
消息提示框和弹窗
"""
案例 - 码云登录后解决消息提示框
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://gitee.com/')
driver.implicitly_wait(10)
driver.maximize_window()
driver.find_element(By.LINK_TEXT, '登录').click()
driver.find_element(By.CSS_SELECTOR, '#git-login>input').send_keys('输入的用户名')
time.sleep(2)
driver.find_element(By.CSS_SELECTOR, '#user_password').send_keys('输入的密码')
time.sleep(2)
driver.find_element(By.NAME, 'commit').click()

""" 处理消息提示框 """
# time.sleep(3)
# context_click 确定位置, click坐标点击
# ActionChains(driver).move_by_offset(200, 200).context_click().perform()
# ActionChains(driver).move_by_offset(1047, 370).context_click().perform()
ActionChains(driver).move_by_offset(1047, 370).click().perform()

input()
driver.quit()

4. 键盘事件

# 在百度搜索框输入  python ,全选,复制,剪切,粘贴 跳转到搜狗输入框进行搜索
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys  # 键盘事件功能

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')

driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('python')
time.sleep(3)

driver.find_element(By.CSS_SELECTOR, '#kw').send_keys(Keys.CONTROL, 'a')  # 全选
time.sleep(3)

driver.find_element(By.CSS_SELECTOR, '#kw').send_keys(Keys.CONTROL, 'c')  # 复制
time.sleep(3)

driver.find_element(By.CSS_SELECTOR, '#kw').send_keys(Keys.CONTROL, 'x')  # 复制
time.sleep(3)

driver.get('https://www.sogou.com/')
driver.find_element(By.CSS_SELECTOR, '#query').send_keys(Keys.CONTROL, 'v')  # 粘贴

# 按回车键搜索
driver.find_element(By.CSS_SELECTOR, '#stb').send_keys(Keys.ENTER)

input()
driver.quit()

5. 下拉框处理

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select  # 下拉框功能

driver = webdriver.Chrome()
driver.get('https://www.jq22.com/demo/shengshiliandong/')

# 找下拉框对应的