首页 > 技术文章 > 爬虫——selenium模块

shof 2020-09-19 03:07 原文

selenium模块

能够帮你自动操作浏览器
selenium最初是一个自动化测试工具
而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

selenium本质是通过驱动浏览器,完全模拟浏览器的操作,
比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

1.需要下载模块
	pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
2.还需要下载一个控制浏览器的驱动
	http://npm.taobao.org/mirrors/chromedriver  
    # 注意下载的驱动一定要跟你浏览器的版本匹配 不然无法操作
3.下载好的驱动文件有两个存放位置
	1.直接放在你项目的目录下
    2.放到python安装路径的scripts目录中即可

使用方法

from selenium import webdriver
import time

bro=webdriver.Chrome()  # 生成谷歌浏览器的驱动对象

bro.get("http://www.baidu.com")  # 自动打开谷歌浏览器访问百度首页

bro.implicitly_wait(10)  # 设置一个等待时间 超出范围还没加载出来就放弃

find_element_by_id   				# 根据id找
find_element_by_link_text     		# 根据链接名字找到控件(a标签的文字)
find_element_by_partial_link_text   # 根据链接名字找到控件(a标签的文字)模糊查询
find_element_by_tag_name       		# 根据标签名
find_element_by_class_name     		# 根据类名
find_element_by_name           		# 根据属性名
find_element_by_css_selector   		# 根据css选择器

aEle = bro.find_element_by_link_text('登录')
# 点击a标签
aEle.click()

# 通过id获取p标签
pEle = bro.find_element_by_id('TANGRAM__PSP_11__footerULoginBtn')
# 点击p标签
pEle.click()

# 通过id找获取用户用户名的input框
UserEle = bro.find_element_by_id('TANGRAM__PSP_11__userName')
# 点击UserEle
UserEle.click()
# 输入用户名
UserEle.send_keys('**********')
time.sleep(1)

# 通过id找获取用户密码的input框
PwdEle = bro.find_element_by_id('TANGRAM__PSP_11__password')
# 点击PwdEle
PwdEle.click()
# 输入密码
PwdEle.send_keys('xxxxxx')

time.sleep(1)
SubEle = bro.find_element_by_id('TANGRAM__PSP_11__submit')
SubEle.click()
print(bro.get_cookies())  # 直接组织成字典里面有所有的键值对
print(bro.get_cookie())  # Get a single cookie by name

# 关闭浏览器
bro.close()

等待元素加载完毕

"""
有些页面的标签元素并不是直接写在html文件上的而是通过后续
js代码动态加载出来的 所以需要在查找标签的时候设置一个等待时间
"""
# 隐式等待:在查找所有元素时,如果尚未被加载,则等10秒(推荐使用)
# browser.implicitly_wait(10)   表示等待所有,

# 显式等待:显式地等待某个元素被加载(不推荐使用)
# wait=WebDriverWait(browser,10)
# wait.until(EC.presence_of_element_located((By.ID,'content_left')))

selenium其他方法补充

#获取属性:
tag.get_attribute('src')
#获取文本内容
tag.text
#获取标签ID,位置,名称,大小(了解)
print(tag.id)
print(tag.location)
print(tag.tag_name)
print(tag.size)

#模拟浏览器前进后退
browser.back()
time.sleep(10)
browser.forward()

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

#运行js
from selenium import webdriver
import time

bro=webdriver.Chrome()
bro.get("http://www.baidu.com")
bro.execute_script('alert("hello world")') #打印警告
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()
"""
window.open()  重新打开一个页面
	window.open(url,'','height=400,width=400,top=200,left=200')

window.close()  关闭一个页面
"""

滑动验证码

"""滑动验证码其实用代码破解还不如自己手动划一下,我们单纯的了解一下代码破解的方式"""
#动作链(滑动验证码没有代码破解的必要 不如手动滑获取cookie即可)
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
# actions.drag_and_drop(source, target)
actions.click_and_hold(source)
time.sleep(3)
for i in range(5):
    actions.move_by_offset(xoffset=17,yoffset=0).perform()
    time.sleep(0.5)

actions.release()

"""
为什么不直接一步到位 而需要设置间歇停顿?
	滑动验证码内部有检测机制,如果你速度太快并且很准
	那么后台会认为你是一个程序从而让你校验不通过
"""

获取cookie

url = 'https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F'
driver = webdriver.Chrome()
driver.get(url=url)
time.sleep(50)
driver.refresh()
c = driver.get_cookies()
print(c)
# 得到了登录之后网站给出的cookies
with open('xxx.txt','w') as f:
  json.dump(c,f)

"""
cookie池
	获取同一个网站很多授权之后的cookie存放于某处
	之后再访问该网站的时候都是从中随机获取一个访问
"""

破解登录的思路其实很明确 就是想法设法的拿到登录之后对方给你的cookie信息即可

验证码的破解

三种方式
	方式1(最繁琐)
  	代码破解
    	软件:Tesseract-ocr 
    	模块:pytesseract
  方式2
  	打码平台
    	eg:http://www.yundama.com
  方式3
  	人工打码

推荐阅读