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.baidu.com")
bro.execute_script('window.scrollTo(0,200)') # 鼠标滚轮移动
time.sleep(5)
选项卡管理
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()
动作链(滑动验证码没有代码破解的必要 不如手动滑动获取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界面
有的时候页面上会叠加其他完整的HTML页面
这个页面一般丢失iframe标签 内部含有完整的HTML文档结构
在查找这个标签内部的标签是需要指定一个参数
driver.switch_to.frame('iframeResult')
滑动验证码
针对滑动验证码也是可以通过selenuim自动完成的
滑动验证码很多时候不推荐使用程序破解 太过于繁琐
很多的时候不如自己亲自手动滑动来的方便
滑动验证码在拖动的时候速度不能太快 内部有检测机制
速度过快一步到位会被认为是爬虫程序
无界面操作
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)
cookie登录
selenuim用来拿cookie
requests用来拿cookie去模拟爬取数据
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)
图片验证码破解
方法1:完全使用代码破解
图像识别技术
软件:Tesseract-ocr
模块:pytesseract
方法2:打码平台
花钱就可以购买的第三方服务
网站内部的本质是先使用代码进行识别如果无法识别就转由人工肉眼识别
方法3:自己用肉眼识别
大型爬虫案例:b站
需要我们掌握他的思路
https://www.cnblogs.com/xiaoyuanqujing/articles/12016934.html
https://www.cnblogs.com/xiaoyuanqujing/articles/12014416.html
重点:
b站的视频是一分为二的
分为视频(只有画面没有声音)和音频(只有视频配套的声音)
红薯小说的案例
密码:xiaoyuanqujing@666
https://www.cnblogs.com/xiaoyuanqujing/protected/articles/11868250.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文件夹