爬虫基础04 selenium

在使用selenium之前必须先配置浏览器对应版本的webdriver。

1. 初始化浏览器对象

from selenium.webdriver import Chrome

# 创建浏览器对象,并且打开一个空的页面
browser = Chrome()

# 关闭浏览器
browser.close()

2. 访问指定网页

from selenium import webdriver
 
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome()
 
# 访问百度首页
browser.get(r'https://www.baidu.com/')

# 浏览器截图
browser.get_screenshot_as_file('截图.png')
 
# 关闭浏览器
browser.close()

3. 设置浏览器大小

from selenium import webdriver
import time

browser = webdriver.Chrome()

# 设置浏览器大小:全屏
browser.maximize_window()
browser.get(r'https://www.baidu.com')
time.sleep(2)

# 设置分辨率 500*500
browser.set_window_size(500, 500)
time.sleep(2)

# 设置分辨率 1000*800
browser.set_window_size(1000, 800)
time.sleep(2)

# 关闭浏览器
browser.close()

4. 刷新页面

from selenium import webdriver
import time  
 
browser = webdriver.Chrome()
 
# 设置浏览器全屏
browser.maximize_window()   
browser.get(r'https://www.baidu.com')  
time.sleep(2)
 
try:
    # 刷新页面
    browser.refresh()  
    print('刷新页面')
except Exception as e:
    print('刷新失败')
   
# 关闭浏览器
browser.close()

5. 前进和后退

from selenium import webdriver
import time  
 
browser = webdriver.Chrome()
 
# 设置浏览器全屏
browser.maximize_window()   
browser.get(r'https://www.baidu.com')  
time.sleep(2)
 
# 打开淘宝页面
browser.get(r'https://www.taobao.com')  
time.sleep(2)
 
# 后退到百度页面
browser.back()  
time.sleep(2)
 
# 前进到淘宝页面
browser.forward() 
time.sleep(2)
 
# 关闭浏览器
browser.close()

6. 获取页面基本属性

from selenium import webdriver

browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')

# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
# 网页源码
print(browser.page_source)

7. 定位标签

#获取标签
'''
浏览器对像.finde_elements(获取方式,值) -根据指定方式查找所有满足条件的标签,返回一个列表,列表中元素是标签对象
浏览器对象.find_element(获取方式,值)  -根据指定方式查找第一个满足条件的标签返回一个标签对象
获取方式:
By.ID     -根据标签的ID属性值获取标签
By.CLASS_NAME    -根据标签的class属性值获取标签
By.CSS_SELECTOR   -根据css选择器获取标签
By.LINL_TEXT     -根据a标签内容获取标签(只能a)
'''
browser.find_element(By.ID,'kw')
browser.find_element(By.NAME,'wd')
browser.find_element(By.CLASS_NAME,'s_ipt')
browser.find_element(By.TAG_NAME,'input')
browser.find_element(By.LINK_TEXT,'新闻')
browser.find_element(By.PARTIAL_LINK_TEXT,'闻')
browser.find_element(By.XPATH,'//*[@id="kw"]')
browser.find_element(By.CSS_SELECTOR,'#kw')

8. get_attribute获取标签属性

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')

# 通过class属性值获取标签
logo = browser.find_element(By.CLASS_NAME,'index-logo-src')
print(logo)

# 获取标签的src属性
print(logo.get_attribute('src'))

# 关闭浏览器
browser.close()

9. 获取标签内容

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')

# 通过css选择器选中标签
logo = browser.find_element(By.CSS_SELECTOR, '#hotsearch-content-wrapper > li:nth-child(1) > a')
# 获取标签的标签内容
print(logo.text)
# 获取标签的href属性
print(logo.get_attribute('href'))

# 关闭浏览器
browser.close()

10. 获取其他属性

除了属性和文本值外,还有id、位置、标签名和大小等属性。

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

browser.get(r'https://www.baidu.com')

logo = browser.find_element(By.CLASS_NAME, 'index-logo-src')
# 获取标签的id
print(logo.id)
# 获取标签的位置
print(logo.location)
# 获取标签的标签名
print(logo.tag_name)
# 获取标签的大小
print(logo.size)

# 关闭浏览器
browser.close()

11. 页面交互操作

  1. 输入文本:标签.send_keys(输入内容)

  2. 点击:标签.click()

  3. 清空输入框:标签.clear()

  4. 回车确认:标签.submit()

  5. 单选:单选比较好操作,先定位需要单选的某个元素,然后点击一下即可。

  6. 多选:多选好像也比较容易,依次定位需要选择的元素,点击即可。

  7. 下拉框:下拉框的操作相对复杂一些,需要用到Select模块。

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
import time

url = 'file:///Users/yuting/Work/%E6%8E%88%E8%AF%BE/Python2206/01%E8%87%AA%E5%8A%A8%E5%8A%9E%E5%85%AC/day11-turtle%E7%9A%84%E4%BD%BF%E7%94%A8/demo.html'

browser = webdriver.Chrome()

browser.get(url)
time.sleep(2)

# 获取下来列表对应的标签
select_tag = browser.find_element(By.NAME, "帅哥")

# 根据索引选择
Select(select_tag).select_by_index("2")
time.sleep(2)
# 根据value值选择
Select(select_tag).select_by_value("草儿")
time.sleep(2)
# 根据文本值选择
Select(select_tag).select_by_visible_text("才哥")
time.sleep(2)

# 关闭浏览器
browser.close()

12. 选项卡切换

我们在访问网页的时候会打开很多个页面,在Selenium中提供了一些方法方便我们对这些页面进行操作。

current_window_handle:获取当前窗口的句柄。

window_handles:返回当前浏览器的所有窗口的句柄。

switch_to_window():用于切换到对应的窗口。

from selenium import webdriver
import time

browser = webdriver.Chrome()

# 打开百度
browser.get('http://www.baidu.com')
# 新建一个选项卡
browser.execute_script('window.open()')
print(browser.window_handles)
# 跳转到第二个选项卡并打开知乎
browser.switch_to.window(browser.window_handles[1])
browser.get('http://www.zhihu.com')
# 回到第一个选项卡并打开淘宝(原来的百度页面改为了淘宝)
time.sleep(2)
browser.switch_to.window(browser.window_handles[0])
browser.get('http://www.taobao.com')

13. 模拟鼠标操作

既然是模拟浏览器操作,自然也就需要能模拟鼠标的一些操作了,这里需要导入ActionChains 类。

from selenium.webdriver.common.action_chains import ActionChains

13.1 左键:click()

这个其实就是页面交互操作中的点击click()操作。

13.2 右键:context_click()

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
time.sleep(2)

# 定位到要右击的元素,这里选的新闻链接
right_click = browser.find_element(By.LINK_TEXT, '新闻')

# 执行鼠标右键操作
ActionChains(browser).context_click(right_click).perform()
time.sleep(2)

# 关闭浏览器
browser.close()

在上述操作中:

ActionChains(browser):调用ActionChains()类,并将浏览器驱动browser作为参数传入

context_click(right_click):模拟鼠标双击,需要传入指定元素定位作为参数

perform():执行ActionChains()中储存的所有操作,可以看做是执行之前一系列的操作

13.3 双击:double_click() 

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
time.sleep(2)

# 定位到要双击的元素
double_click = browser.find_element(By.CSS_SELECTOR, '.accessibility-icon')

# 双击
ActionChains(browser).double_click(double_click).perform()
time.sleep(15)

# 关闭浏览器
browser.close()

13.4 拖拽:drag_and_drop(source,target)

drag_and_drop(source,target)拖拽操作,开始位置和结束位置需要被指定,这个常用于滑块类验证码的操作之类。

我们以菜鸟教程的一个案例来进行演示:

菜鸟教程在线编辑器

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser = webdriver.Chrome()
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
time.sleep(2)

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.perform()
# 拖拽
time.sleep(15)

# 关闭浏览器
browser.close()

13.5 悬停:move_to_element()

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser = webdriver.Chrome()
url = 'https://www.baidu.com'
browser.get(url)
time.sleep(2)

# 定位悬停的位置
move = browser.find_element(By.ID, "s-usersetting-top")

# 悬停操作
ActionChains(browser).move_to_element(move).perform()
time.sleep(5)

# 关闭浏览器
browser.close()

14. 模拟键盘操作

selenium中的Keys()类提供了大部分的键盘操作方法,通过send_keys()方法来模拟键盘上的按键。

引入Keys

from selenium.webdriver.common.keys import Keys

send_keys(Keys.BACK_SPACE):删除键(BackSpace)

send_keys(Keys.SPACE):空格键(Space)

send_keys(Keys.TAB):制表键(TAB)

send_keys(Keys.ESCAPE):回退键(ESCAPE)

send_keys(Keys.ENTER):回车键(ENTER)

send_keys(Keys.CONTRL,'a'):全选(Ctrl+A)

send_keys(Keys.CONTRL,'c'):复制(Ctrl+C)

send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)

send_keys(Keys.CONTRL,'v'):粘贴(Ctrl+V)

send_keys(Keys.F1):键盘F1

.....

send_keys(Keys.F12):键盘F12

15. 滚动页面

from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from time import sleep

# 1. 创建浏览器对象
b = Chrome()
b.implicitly_wait(10)

# 2. 打开商品搜索结果页面
b.get('<https://search.jd.com/Search?keyword=%E5%B8%90%E7%AF%B7&enc=utf-8&wq=%E5%B8%90%E7%AF%B7&pvid=fff18cce6fa8484eb408ab254e7980f4>')

sleep(5)

# 3. 滚动页面
for x in range(10):
    b.execute_script('window.scrollBy(0, 800)')
    sleep(0.5)

# 4. 获取商品对应的小盒子
all_goods = b.find_elements(By.CLASS_NAME, 'gl-item')
print(len(all_goods))

# 5. 等待用户输入,以便查看结果
input()

# 6. 关闭浏览器
b.quit()

16. 配置浏览器设置

from selenium.webdriver import Chrome, ChromeOptions

# 1. 创建配置对象
options = ChromeOptions()

# 2. 添加配置选项
# 1) 图片不加载,提高网页加载速度
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})

# 2) 设置取消测试环境
options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 3) 无头模式(不显示浏览器内容)
# options.add_argument('--headless')

# 3. 创建浏览器对象
b = Chrome(options=options)

# 4. 打开网页
b.get('<https://search.jd.com/Search?keyword=%E5%B8%90%E7%AF%B7&enc=utf-8&wq=%E5%B8%90%E7%AF%B7&pvid=fff18cce6fa8484eb408ab254e7980f4>')

print(b.page_source)

input('end:')

17. 数据接口

 

 17.1 获取网页数据的技术选型步骤

  • 找数据接口,如果有接口直接用requests对借楼发送请求获取数据
  • 用requests对网页数据发生请求,获取网页源代码,看网页源代码中是否保存需要的数据(注意添加headers,加user-agent,cookie
  • 使用selenium打开网页获取网页源代码
  • 放弃

17.2 找数据接口的方法

import requests

url = '<https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js>'
response = requests.get(url)
print(response.json())

18. 用os创建文件夹

import os
#该代码尝试创建名为"abc"的文件夹,如果文件夹已经存在,则通过FileExistsError异常进行捕获,使用pass语句跳过异常。
try:
    os.mkdir('./abc')
except FileExistsError:
    pass

18.1 判断文件或者文件夹是否存在

import os
'''
通过os.path.exists()函数判断指定路径下的文件或文件夹是否存在,
并将结果存储在result变量中。然后根据判断条件,
如果"./abc"文件夹不存在,则创建一个新的"./abc"文件夹。
'''
result = os.path.exists('./files')
print(result)

if not os.path.exists('./abc'):
    os.mkdir('./abc')

19. 案例

19.1 使用Selenium和BeautifulSoup爬取豆瓣Top250电影标题

#使用Selenium和BeautifulSoup爬取豆瓣Top250电影标题
import requests
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from time import sleep
from csv import writer

b = Chrome()
b.get('https://movie.douban.com/top250')
'''
浏览器对像.finde_elements(获取方式,值) -根据指定方式查找所有满足条件的标签,返回一个列表,列表中元素是标签对象
浏览器对象.find_element(获取方式,值)  -根据指定方式查找第一个满足条件的标签返回一个标签对象
获取方式:
By.ID     -根据标签的ID属性值获取标签
By.CLASS_NAME    -根据标签的class属性值获取标签
By.CSS_SELECTOR   -根据css选择器获取标签
By.LINL_TEXT     -根据a标签内容获取标签(只能a)
'''
for _ in range(10):
    sleep(1)
    # 获取源代码
    result = b.page_source
    # print(result)

    # 解析数据
    soup = BeautifulSoup(result, 'lxml')
    all_movie = soup.select('.item')
    for div in all_movie:
        title = div.select_one('.title').text
        print(title)
        with open('files/movies.csv','a',newline='',encoding='utf-8') as f:
            w1 = writer(f)
            w1.writerow([title])
    #点击下一页
    # page1 = b.find_elements(By.CLASS_NAME, 'title')
    fanye = b.find_element(By.LINK_TEXT, '后页>')
    fanye.click()

input()

19.2 使用Selenium操作浏览器实现在中国知网搜索并获取详情页内容

#打开然后关闭当前页又打开下一页
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from time import sleep
from bs4 import BeautifulSoup
b = Chrome()
#设置隐式等待时间(浏览器获取标签的时候如果找不到
b.implicitly_wait(10)

b.get('https://www.cnki.net/')

sleep(1)
#搜索数据分析
b.find_element(By.ID,'txt_SearchText').send_keys('数据分析\n')
#找到第一个搜索结果然后点击
sleep(2)

all_search_result = b.find_elements(By.CLASS_NAME,'fz14')
for i in all_search_result:
    i.click()
    sleep(2)
#切换选项卡,让浏览器对象指向详情页对应的窗口
#浏览器对象.switch_to.window(窗口名称)  -让浏览器对象指向指定的窗口
# 浏览器对象.window_handles   -获取当前浏览器中所有窗口的名字,返回值是一个列表
#注意:浏览器对象默认指向第一次打开的页面对应的窗口,在没有写切换选项卡的代码情况下,它的指向不会发生变化
    b.switch_to.window(b.window_handles[-1])
    result = b.page_source
    soup =BeautifulSoup(result,'lxml')
    b.close()
    b.switch_to.window(b.window_handles[0])
#获取详情页内容
sleep(1)

input()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值