Selenium 爬虫

Selenium

Selenium可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用它才可以驱动浏览器。当然针对不同的浏览器有不同的driver。

以下列出了不同浏览器及其对应的driver:

Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads

Firefox:https://github.com/mozilla/geckodriver/releases

Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

安装完driver后,放到环境变量里。目录不要有中文

爬虫的基本使用

from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe")
driver.get("https://www.baidu.com")

time.sleep(4)

driver.quit() # 退出浏览器
driver.close() # 关闭整个页面

ChromeOptions

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.52.235.176:9999") # 添加代理
options.add_argument("--headless") # 无头模式
options.add_argument("--lang=en-US") # 网页显示英语
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2} # 禁止渲染
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options)

driver.get("http://httpbin.org/ip")

元素定位

from selenium import webdriver

driver = webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
driver.get("https://www.baidu.com")

# find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素
inputTag = driver.find_element_by_id("kw")
inputTags = driver.find_elements_by_class_name("s_ipt")[0]
print(inputTags)
inputTag = driver.find_element_by_name("wd")
inputTag = driver.find_element_by_tag_name("input")
inputTag = driver.find_element_by_xpath("//input[@id='kw']")
inputTag = driver.find_element_by_css_selector("#form #kw")

操作表单元素

# 操作输入框
inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')

# 操作checkbox
rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()

# 选择select
from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com")
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")

# 操作按钮 单击,双击,右击
inputTag = driver.find_element_by_id('su')
inputTag.click()
inputTag.doubleClick()
inputTag.contextClick()

行为链

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe")

driver.get("https://www.zhihu.com/signin?next=%2F")

actions = ActionChains(driver)
usernameTag = driver.find_element_by_name("username")
passwordTag = driver.find_element_by_name("password")
submitBtn = driver.find_element_by_class_name("SignFlow-submitButton")

actions.move_to_element(usernameTag)
actions.send_keys_to_element(usernameTag,"18888888888")
actions.move_to_element(passwordTag)
actions.send_keys_to_element(passwordTag,"xxxxxx")
actions.move_to_element(submitBtn)
actions.click(submitBtn)

actions.perform()

# click_and_hole(element)点击但不松开鼠标

cookie 操作

# 1.获取所有的cookie:
for cookie in driver.get_cookies():
    print(cookie)
# 2.根据cookie的key获取value:
value = driver.get_cookie(key)
# 3.删除所有的cookie:
driver.delete_all_cookies()
# 4.删除某个cookie:
driver.delete_cookie(key)
# 添加cookie:
driver.add_cookie({"name":"password","value":"111111"})

显示等待和隐式等待

现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。

隐式等待:调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒中的时间。
显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe")

# 1. 隐式等待:
driver.get("https://www.baidu.com/")
driver.implicitly_wait(10)
driver.find_element_by_id("afsdasdf")

# 2. 显式等待:
driver.get("https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc")

WebDriverWait(driver,100).until(
    EC.text_to_be_present_in_element_value((By.ID,"fromStationText"),"长沙")
)

WebDriverWait(driver,100).until(
    EC.text_to_be_present_in_element_value((By.ID,"toStationText"),"北京")
)

try:
    element = WebDriverWait(driver, 10).until(
         EC.presence_of_element_located((By.ID, "myDynamicElement"))
     )
finally:
    driver.quit()


btn = driver.find_element_by_id("query_ticket")
btn.click()

打开多窗口和页面切换

有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到
from selenium import webdriver

driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe")

driver.get("https://www.baidu.com/")
driver.implicitly_wait(2)
driver.execute_script("window.open('https://www.douban.com/')")
driver.switch_to.window(driver.window_handles[1])

print(driver.page_source)

节点定位

"""
目标:获取百度logo图片的左上角坐标,宽高,右上角的坐标
"""
import time
from selenium import webdriver

chrome_obj = webdriver.Chrome()
chrome_obj.get('https://www.baidu.com')
time.sleep(1)

# 窗口最大化
chrome_obj.maximize_window()

# 定位到百度的logo图片
img_obj = chrome_obj.find_element_by_id('s_lg_img')

# 获取左上角的坐标
location_  = img_obj.location
print('百度logo图片左上角坐标:',location_)

# 获取图片的宽高
size_ = img_obj.size
print('图片的宽高:',size_)

# 获取图片右下角的坐标
# 右下角的轴:左上角的x轴 + logo图片宽度
x_ = location_['x'] + size_['width']

# 右下角的y轴: 左上角的y轴 + logo图片调度

y_ = location_['y'] + size_['height']

time.sleep(5)

chrome_obj.quit()

滑动验证码案例

"""
目标:滑动验证码
1.定位按钮
2.按住滑块
3.滑动按钮
"""
import time
from selenium import webdriver


chrome_obj = webdriver.Chrome()
chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/')

# 1.定位滑动按钮
click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]')

# 2.按住
# 创建一个动作链对象,参数就是浏览器对象
action_obj = webdriver.ActionChains(chrome_obj)

# 点击并且按住,参数就是定位的按钮
action_obj.click_and_hold(click_obj)

# 得到它的宽高
size_ = click_obj.size
width_ = size_['width']

# 3.定位滑动坐标
action_obj.move_by_offset(width_,0).perform()

# 4.松开滑动
action_obj.release()

time.sleep(6)
chrome_obj.quit()

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值