selenuim进阶操作与大型复杂爬虫案例分析

概要

  • selenuim其他操作

  • 图片验证码与滑动验证码的破解思路

  • 大型复杂爬虫案例讲解


详细

  • selenuim其他操作

1、tag.get_attribute('href') 获取指定标签的属性

2、tag.text 获取文本内容

3、 tag.id 获取标签ID

  tag.location 获取标签位置

  tag.tag_name 获取标签名称

  tag.size 获取标签大小

4、browser.back() 模拟浏览器后退

  browser.forward() 模拟浏览器前进

5、browser.get_cookies()             获取cookie

     browser.add_cookie({'k1': 'xxx', 'k2': 'yyy'})     设置cookie

6、运行js(括号内为js代码)

   bro.execute_script('window.scrollTo(0,200)')   鼠标滚轮移动

   time.sleep(5)

7、选项卡管理

  browser.execute_script('window.open()')          打开一个新网页/选项卡

  browser.window_handles                  获取所有的选项卡

  browser.switch_to_window(browser.window_handles[1])    切换指定的选项卡,[]内为选项卡的索引

 


  • 图片验证码与滑动验证码的破解思路

滑动验证码没有代码破解的必要 不如手动滑获取cookie即可。

iframe标签:页面上嵌套页面

# 动作链
from selenium import webdriver
from selenium.webdriver import ActionChains
import time

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

driver.switch_to.frame('iframeResult')  # 必须要指定iframe标签
# 起始位置
sourse = driver.find_element_by_id('draggable')
# 目标位置
target = driver.find_element_by_id('droppable')
# 方式一:基于同一个动作链串行执行(速度太快不合理)
# actions = ActionChains(driver)  # 拿到动作链对象
# actions.drag_and_drop(sourse, target)  # 把动作放到动作链中,准备串行执行
# actions.perform()
# 方式二:不同的动作链,每次移动的位移都不同
actions = ActionChains(driver)
actions.click_and_hold(sourse)
distance = target.location['x'] - sourse.location['x']
track = 0
while track < distance:
    actions.move_by_offset(xoffset=2, yoffset=0).perform()
    track += 5
    time.sleep(0.5)
actions.release()

driver.close()

iframe页面

注意事项

1.有时候一个页面上还会叠加其他完整的html页面
2.该页面一般都是iframe标签 内部含有完整的html文档结构
3.在查找该标签内部的标签时需要指定一个参数
    driver.switch_to.frame('iframeResult')

无界面操作

from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
bro = webdriver.Chrome(chrome_options=chrome_options)
bro.get('https://www.baidu.com')
# 如何获取页面html代码
driver.page_source  
'''可以去药品许可证界面尝试'''

针对selenuim防爬机制

很多程序是可以分辨出来当前浏览器是否被selenuim操作 我们可以在代码中添加如下配置即可避免被识别
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitchers',['enable-automation'])
bro = webdriver.Chrome(options=option)

图片验证码

# 解决方法
1、完全使用代码破解
  全自动,一步到位
2、打码平台(第三方服务)   其实这类第三方服务一般也是先使用代码识别,不行就员工自己看。 3、自己看
  可以事先利用代码预留肉眼识别并输入验证码的时间


  •  大型复杂爬虫案例讲解

cookie登录

思路:1、通过seleuinm拿cookie
      2、使用requests模块携带cookie去模拟爬取数据

import requests
from selenium import webdriver
import time
import json

"""
    使用selenium打开登录界面的网址,然后让用户完成手工登录,再获取cookie
"""
url = 'https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2F'
driver = webdriver.Chrome()
driver.get(url=url)
time.sleep(30)  # 预留时间让用户输入用户名和密码
driver.refresh()
# 获取登录成功之后服务端发回的cookie数据
cookiesB = driver.get_cookies
# 保存获得的cookie
with open('boKeYuan.txt', 'w') as f:
     json.dump(c, f)

"""
    处理获得的cookie
"""
cookies = {}
with open('boKeYuan.txt', 'r') as f:
    di = json.load(f)
# 获取cookie中的name和value,转化成requests可以使用的形式
for cookie in di:
    cookies[cookie['name']] = cookie['value']
print(cookies)
"""
    使用该cookie完成请求
"""
response = requests.get(url='https://i-beta.cnblogs.com/api/user', cookies=cookies)
response.encoding = response.apparent_encoding
print(response.text)

一、B站视频案例

b站有很多视频是一分为二的,分为视频(只有画面没有声音)和音频(只有与视频配套的声音)。

教学文档

1、下载单个视频文件与音频文件

https://www.cnblogs.com/xiaoyuanqujing/articles/12016934.html

2、批量下载页面上的视频与音频并合并
https://www.cnblogs.com/xiaoyuanqujing/articles/12014416.html

二、红薯网小说案例

目标网页

https://www.hongshu.com/content/3052/3317-98805.html

教学文档

https://www.cnblogs.com/wyhb/p/15353266.html

# 主要思路分析
1.小说详情页面鼠标左右键全部禁用
    但是支持按F12调出控制台
2.小说文字不是直接加载
    查找相关二次请求
3.在请求中发现可疑数据
    https://www.hongshu.com/bookajax.do
    content:加密数据
     other:加密数据
     bid: 3052
    jid: 3317
    cid: 98805
4.文字内容的解密过程发送在浏览器本地
    涉及到数据解密肯定需要写js代码 并且一般都会出现关键字decrypt
    通过浏览器查找相应的js代码
     文字主要内容的界面
        utf8to16(hs_decrypt(base64decode(data.content), key))
    解密之后仍然存在数据缺失的情况
        utf8to16(hs_decrypt(base64decode(data.other), key))
    解密之后是一段js代码
    # 怀疑缺失的数据与解析出来js代码有很大的关系
5.自己新建一个html文件
    将content内部拷贝只body内
    将js代码引入到该html文件夹

 

posted @ 2021-09-29 19:17  Leguan001  阅读(115)  评论(0)    收藏  举报