selenuim补充知识与爬虫知识拓展

目录

  • selenuim其他操作

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

  • 大型复杂爬虫案例讲解

 

selenuim其它操作

获取属性

tag.get_attribute('src')

获取文本内容

tag.text

获取标签ID,位置,名称,大小

print(tag.id)
print(tag.location)
print(tag.tag_name)
print(tag.size)

模拟浏览器前进后退

browser.back()
browser.forward()

 cookies管理

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

运行js

from selenium import webdriver
import time
bro=webdriver.Chrome()
bro.get("http://www.taobao.com")
bro.execute_script('window.scrollTo(0,200)') # 鼠标滚轮移动
time.sleep(5)
View Code

 

 选项卡管理

import time
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)  # 获取所有的选项卡
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(3)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.sina.com.cn')
browser.close()
View Code

 

 动作链

方式一

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()
View Code

基于同一个动作链串行执行(速度太快不合理)

 方式二

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.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()
View Code

不同的动作链,每次移动的位移都不同

 

iframe界面

有时候一个页面上还会叠加其他完整的html页面
该页面一般都是iframe标签 内部含有完整的html文档结构

# 在查找该标签内部的标签时需要指定一个参数
driver.switch_to.frame('iframeResult')

滑动验证码

# 针对滑动验证码也是可以通过selenuim自动完成的

# 滑动验证码很多时候不推荐使用程序破解,太过繁琐
很多时候还不如自己亲自手动滑动来的方便

# 滑动验证码在拖动的时候速度不能太快,内部有监测机制
速度过快一步到位会被认为是爬虫程序

无界面操作

from selenium.webdriver.chrome.options import Options
from selenium import webdriver
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://www.baidu.com')
print(driver.page_source)
View Code

 

针对selenuim防爬

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

 

cookie登录

第一步使用selenium打开网址,然后让用户完成手工登录,再获取cookie

url = 'https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F'
driver = webdriver.Chrome()
driver.get(url=url)
time.sleep(30)  # 预留时间让用户输入用户名和密码
driver.refresh()  # 刷新页面
c = driver.get_cookies()  # 获取登录成功之后服务端发返回的cookie数据
print(c)
with open('xxx.txt', 'w') as f:
    json.dump(c, f)
View Code

第二步将获取的cookie数据写入文本文件内

cookies = {}
with open('xxx.txt', 'r') as f:
    di = json.load(f)

第三步获取cookie中的name和value,转化成requests可以使用的形式

for cookie in di:
    cookies[cookie['name']] = cookie['value']

第四步使用该cookie完成请求

response = requests.get(url='https://i-beta.cnblogs.com/api/user', cookies=cookies)
response.encoding = response.apparent_encoding
print(response.text)

完整代码

import requests
from selenium import webdriver
import time
import json

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

cookies = {}
with open('xxx.txt', 'r') as f:
    di = json.load(f)
# 获取cookie中的name和value,转化成requests可以使用的形式
for cookie in di:
    cookies[cookie['name']] = cookie['value']

# # 使用该cookie完成请求
# response = requests.get(url='https://i-beta.cnblogs.com/api/user', cookies=cookies)
# response.encoding = response.apparent_encoding
# print(response.text)
View Code

 

图片验证码

思路1: 完全使用代码破解

图像识别技术
        软件:Tesseract-ocr 
        模块:pytesseract

 

 思路2:  打码平台

花钱买第三方服务
先使用代码识别如果不想其实还有一帮员工肉眼识别

思路3:  自己人工智能识别

 

b站视频案例

思路

1.寻找任意一个视频地址
2.分析页面在network中发现该地址发送请求后有两个视频和音频文件比较可疑
研究下来发现b站的视频是一分为二的,分为视频和音频
3.然后用requests模块模拟即可,打开文件不停的发送请求加载数据写入即可

 

红薯网小说案例

思路

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 21:25  陌若安然  阅读(67)  评论(0)    收藏  举报