selenium主要的用途就是控制浏览器,模仿真人操作浏览器的行为

模块安装:pip3 install selenium

 

需要控制的浏览器

from selenium import webdriver  # 调用这个模块

browser=webdriver.Chrome() # 控制谷歌浏览器

 

PS:调用谷歌浏览器需要下载一个驱动:http://npm.taobao.org/mirrors/chromedriver/2.38/  # 下载对应版本的即可

PS:解压后得到一个exe程序,可以放到项目的根路径,也可以放到python的根路径下(python需要已经添加到环境变量

browser=webdriver.Firefox() # 控制火狐浏览器

browser=webdriver.PhantomJS() 

browser=webdriver.Safari()  # 控制苹果的浏览器

browser=webdriver.Edge() # 控制ie浏览器

 

from selenium.webdriver.common.keys import Keys  # 导入这个模块就是可以模拟键盘操作

from selenium import webdriver # 导入这个模块可以控制浏览器

 

 

selenium模块下的所有方法

 



find_element和find_elements的区别,没有s的就是只找出匹配的第一个,有s的就是找出匹配到所有的



 

find_element_by_id  # 根据id查找控件
find_element_by_link_text # 根据链接的名字模糊查找控件
PS:注意这个链接就是只link类型的标签,非链接标签用这个是无法找到控件的
find_element_by_partial_link_text # 模糊匹配
find_element_by_tag_name # 通过标签名查找
find_element_by_class_name # 根据类名查找控件
find_element_by_name  # 根据标签名查找控件
find_element_by_css_selector # 通过css选择器取控件
find_element_by_xpath
上述均可以改写成find_element(By.ID,'kw')的形式
find_elements_by_xxx的形式是查找到多个元素,结果为列表

 

selenium 模块的基本使用

from selenium import webdriver
import time
bro = webdriver.Chrome()  # 实例化对象,这个对象就是需要控制的浏览器
bro.get('http://www.baidu.com') # 向一个地址发送一个请求
print(bro.page_source) # 拿到的页面内容用page_source
time.sleep(5)

bro.close() # 这个就是关闭浏览器,一定要写

 



根据id查找控件



from selenium import webdriver
import time

'''打开百度在百度搜索西瓜'''
try:
    bro = webdriver.Chrome()  # 实例化对象,这个对象就是需要控制的浏览器
    bro.get('http://www.baidu.com') # 向一个地址发送一个请求
    input_k = bro.find_element_by_id('kw') # 根据id找到控件
    key = input('请输入内容: ')
    input_k.send_keys(key) # 向控件写入内容
    time.sleep(10)
except Exception as e:
    print(e)

# finally就是不管在什么情况下都关闭浏览器
finally:
    bro.close() # 这个就是关闭浏览器,一定要写
from selenium import webdriver
import time


自动登录百度
try:
    bro = webdriver.Chrome()  # 实例化对象,这个对象就是需要控制的浏览器

 # 隐式等待,一般都用隐式等待
    bro.implicitly_wait(3)  # 隐示等待 所有标签在找的时候,没有加载就等三秒

    bro.get('http://www.baidu.com') # 向一个地址发送一个请求
    time.sleep(3)

    login_btn = bro.find_element_by_link_text('登录') # 通过链接名查找到登陆的控件
    login_btn.click() # 点击控件
    login_user = bro.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn') # 通过di找到用户名登陆的控件
    login_user.click() # 点击控件
    username_input = bro.find_element_by_id('TANGRAM__PSP_10__userName') # 通过id找到输入账号的控件
    username_input.send_keys('15618935321') # 输入账号
    password_input = bro.find_element_by_id('TANGRAM__PSP_10__password') # 通过id找到输入密码的控件
    password_input.send_keys('Pq12344321') # 输入密码
    time.sleep(3) # 这里一定要等待几秒,因为验证码的页面时动态生成的,所以程序直接走是取不到验证码发送控件的,隐式等待无效,如果不等待几秒,则程序直接报错取不到验证码的控件
    login_code = bro.find_element_by_id('TANGRAM__PSP_10__submit') # 找到登陆确定的控件
    login_code.click() # 点击控件
    time.sleep(5)
    click_ver_code = bro.find_element_by_id('TANGRAM__39__button_send_mobile') # 找到发送验证码的控件
    click_ver_code.click() # 点击控件
    ver_code = bro.find_element_by_id('TANGRAM__39__input_vcode') # 找到输入验证码的控件
    ver_input = input('请输入验证码: ') # 让用户输入验证码
    time.sleep(30) 
    ver_code.send_keys(ver_input) # 将输入的内容写到控件
    log_10 = bro.find_element_by_id('TANGRAM__39__button_submit') # 找到确定控件
    log_10.click() # 点击确定登陆成功
    time.sleep(30)
except Exception as e:
    print(e)

# finally就是不管在什么情况下都关闭浏览器
finally:
    bro.close() # 这个就是关闭浏览器,一定要写

PS:程序走的很快,一瞬间,但是页面加载内容需要时间,所以需要用到隐式等待
wait = WebDriverWait(broswer, 3)# 显示等待,元素没加载出来,就等三秒,指定控件等待,每个控件都要写比较麻烦
broswer.implicitly_wait(3)# 隐示等待 所有标签在找的时候,没有加载就等三秒,只要在开头写一个比较方便

PS:对于动态生成的页面隐式等待是无效的,所以针对这种页面在程序中必须让程序time.sleep等待几秒才能取到控件

 

爬取京东手机商品的信息
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 控制键盘需要这个模块
from selenium.webdriver import ActionChains # 控制键盘需要这个模块组合Keys模块使用
import time,requests

# 首页的操作
def spider():
    try:
# 进入首页输入搜索信息
        bro = webdriver.Chrome() # 指定浏览器
        bro.implicitly_wait(5) # 隐式等待
        bro.get('https://www.jd.com/') # 打开首页
        bro.maximize_window() # 这个参数是将浏览器全屏
        input_serch = bro.find_element_by_id('key') # 获取输入框
        input_serch.send_keys('手机') # 输入内容
        input_serch.send_keys(Keys.ENTER) # 这个就是对着输入框模拟前盘敲回车
        time.sleep(3)
        actions = ActionChains(bro) # 实例化对象用来模拟浏览器的滚动条向下拉
        for i in range(0,5):
            time.sleep(1)
            actions.key_down(Keys.PAGE_DOWN).perform() # 这个方法是按一次键盘PgDn的按键,方法每次只能按一下,所以需要for循环让页面到底部
# 调用方法
        get_goods(bro)
    except Exception as e:
        print(e)
    finally:
        bro.close()


count = 0 # 这个是计数器


def get_goods(bro):
# 取出商品信息
    li_list = bro.find_elements_by_class_name('gl-item')
    global count
    for li in li_list:
# 通过css选择器找出控件
        p_name = li.find_element_by_css_selector('.p-name a').get_attribute('title') # 取标签里面的属性
        price = li.find_element_by_css_selector('.p-price i').text # 取出控件里面的字符
        commit = li.find_element_by_css_selector('.p-commit strong a').text # 取出控件里面的字符
        url =li.find_element_by_css_selector('.p-name a').get_attribute('href') # 驱取出控件里面的属性的值
        img_url = li.find_element_by_css_selector('.p-img a img').get_attribute('src') # 取到标签内的属性
# 调用保存图片方法
# save_img(img_url)
        count += 1
        print(
            '''
            序号:%s
            商品名称: %s
            商品价格:%s
            商品地址: %s
            商品评论数: %s
            商品图片地址: %s
            '''%(count,p_name,price,url,commit,img_url)
        )

 # 点击下一页
    click_next = bro.find_element_by_css_selector('.pn-next em')
    time.sleep(2)
    click_next.click()
    time.sleep(5)
# 这里调用进入首页函数,这就是递归
    get_goods(bro)
def save_img(data):
 '''保存函数'''
    import time
    res = requests.get(data)
    with open('img/%s.jpg'%(time.time()),'wb')as f:
        f.write(res.content)


if __name__ == '__main__':
    spider()

 

selenium的其他方法

清空输入框
import time
time.sleep(3)

input_tag=browser.find_element_by_id('twotabsearchtextbox')
input_tag.clear() #清空输入框
input_tag.send_keys('iphone7plus')
button=browser.find_element_by_css_selector('#nav-search > form > div.nav-right > div > input')
button.click()

调用js代码:可以用js代码获取页面的信息
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素


try:
    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.execute_script('alert("hello world")') #打印警告
finally:
    browser.close()
打开选项卡和选项卡的切换
import time
from selenium import webdriver

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()') # window.open就是新建一个选项卡,调用的就是windows

print(browser.window_handles) #获取所有的选项卡
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(10)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.sina.com.cn')
browser.close()