教你快速上手Selenium爬虫,万物皆可爬

作者:Amo Xiang 时间:2022-01-02 18:44:31 

一、基本使用

selenium 的基本使用步骤:

  • 打开浏览器;

  • 获取浏览器页面的特定内容;

  • 控制浏览器页面上的控件,如向一个文本框中输入一个字符串;

  • 关闭浏览器。

示例:


from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
browser = webdriver.Chrome()
try:
   browser.get('https://www.jd.com')
   input_t = browser.find_element_by_id('key')
   input_t.send_keys('python爬虫')
   input_t.send_keys(Keys.ENTER)  # 模拟按下Enter键位
   wait = WebDriverWait(browser, 4)  # 设置最长等待时间4秒
   wait.until(ec.presence_of_all_elements_located((By.ID, 'J_goodsList')))
   print(browser.title)  # 显示搜索页面的标题
   print(browser.current_url)
   print(browser.page_source)
   browser.close()
except Exception as e:
   print(e)
   browser.close()

二、查找节点

2.1 查找单个节点

html 源码如下:


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>表单</title>
</head>
<body>
   <script>
       function onclick_form(){
           alert(document.getElementById('name').value +
               document.getElementById('age').value +
               document.getElementsByName('country')[0].value+
               document.getElementsByClassName('myclass')[0].value)
       }

</script>
   姓名:<input id="name"><p></p>
   年龄:<input id="age"><p></p>
   国家:<input name="country"><p></p>
   收入:<input class="myclass"><p></p>
   <button onclick="onclick_form()">提交</button>
</body>
</html>

样式如下图所示:

教你快速上手Selenium爬虫,万物皆可爬

python 代码自动填充上图中的表单:


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

# 不支持本地网页
browser = webdriver.Chrome()
try:
   # 这里我是用flask自己搭建的一个服务 访问该页面即可打开demo.html
   browser.get('http://127.0.0.1:5000/')
   input_t = browser.find_element_by_id('name')  # 通过id属性查找姓名input节点
   input_t.send_keys('Amo')  # 自动输入
   input_t = browser.find_element_by_id('age')
   input_t.send_keys('18')
   input_t = browser.find_element_by_name('country')  # 通过name属性查找国家input节点
   input_t.send_keys('中国')
   # 通过class属性查找收入input节点
   input_t = browser.find_element_by_class_name('myclass')
   input_t.send_keys('1850')
   # 或下面的代码
   input_t = browser.find_element(By.CLASS_NAME, 'myclass')
   # 要想覆盖前面的输入,需要清空input节点,否则会在input节点原来的内容后面追加新内容
   input_t.clear()
   input_t.send_keys('3500')
except Exception as e:
   print(e)
   browser.close()

效果如下图所示:

教你快速上手Selenium爬虫,万物皆可爬

2.2 查找多个节点

教你快速上手Selenium爬虫,万物皆可爬

示例代码如下:


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

# 不支持本地网页
browser = webdriver.Chrome()
try:
   browser.get('https://www.jd.com')  # 打开京东
   # 根据节点名查找所有名为li的节点
   li_list = browser.find_elements_by_tag_name('li')
   # 输出节点本身
   print(li_list)
   print(len(li_list))
   print(li_list[0].text)
   ul = browser.find_elements(By.TAG_NAME, 'ul')
   print(ul)
   print(ul[0].text)
   browser.close()
except Exception as e:
   print(e)
   browser.close()

三、节点交互

使用 selenium 通过模拟浏览器单击动作循环单击页面上的6个按钮,单击每个按钮后,按钮下方的 div 就会按照按钮的背景颜色设置 div 的背景色。

demo1.html 静态页面代码如下:


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>彩色按钮</title>
</head>
<body>
   <script>

function onclick_color(e) {
           document.getElementById("bgcolor").style.background = e.style.background
       }
   </script>
 <button class="mybutton" style="background: red" onclick="onclick_color(this)">按钮1</button>
 <button class="mybutton" style="background: blue" onclick="onclick_color(this)">按钮2</button>
 <button class="mybutton" style="background: yellow" onclick="onclick_color(this)">按钮3</button>
 <br>
 <button class="mybutton" style="background: green" onclick="onclick_color(this)">按钮4</button>
 <button class="mybutton" style="background: blueviolet" onclick="onclick_color(this)">按钮5</button>
 <button class="mybutton" style="background: gold" onclick="onclick_color(this)">按钮6</button>
 <p></p>
 <div id="bgcolor" style="width: 200px; height: 200px">
 </div>
</body>
</html>

然后使用 Python 代码模拟浏览器的单击动作自动单击页面上的 6 个按钮。P

ython 代码如下所示:


from selenium import webdriver
import time

browser = webdriver.Chrome()
try:
   browser.get('http://127.0.0.1:5000/')
   buttons = browser.find_elements_by_class_name('mybutton')
   i = 0
   while True:
       buttons[i].click()
       time.sleep(1)
       i += 1
       if i == len(buttons):
           i = 0
except Exception as e:
   print(e)
   browser.close()

四、动作链

使用 selenium 动作链的 move_to_element 方法模拟鼠标移动的动作,自动显示京东商城首页左侧的每个二级导航菜单。

示例代码如下:


from selenium import webdriver
from selenium.webdriver import ActionChains
import time

browser = webdriver.Chrome()
try:
   browser.get('https://www.jd.com')
   actions = ActionChains(browser)
   li_list = browser.find_elements_by_css_selector(".cate_menu_item")
   for li in li_list:
       actions.move_to_element(li).perform()
       time.sleep(1)
except Exception as e:
   print(e)
   browser.close()

使用 selenium 动作链的 drag_and_drop 方法将一个节点拖动到另外一个节点上。

示例代码如下:


from selenium import webdriver
from selenium.webdriver import ActionChains

browser = webdriver.Chrome()
try:
   browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
   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()
except Exception as e:
   print(e)
   browser.close()

五、执行 JavaScript 代码

使用 selenium 的 execute_script 方法让京东商城首页滚动到最低端,然后弹出一个对话框。示

例代码如下:


from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.jd.com')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_async_script('alert("已经到达页面底端")')

六、获取节点信息

使用 selenium 的 API 获取京东商城首页 HTML 代码中 id 为 navitems-group1 的 ul 节点的相关信息以及 ul 节点中 li 子节点的相关信息。

示例代码如下:


from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('headless')

browser = webdriver.Chrome(chrome_options=options)
# browser = webdriver.PhantomJS('./webdriver/phantomjs')
browser.get('https://www.jd.com')
ul = browser.find_element_by_id("navitems-group1")
print(ul.text)
print('id', '=', ul.id)  # 内部id,不是节点id属性值
print('location', '=', ul.location)

print('tag_name', '=', ul.tag_name)
print('size', '=', ul.size)
li_list = ul.find_elements_by_tag_name("li")
for li in li_list:
   print(type(li))
   # 属性没找到,返回None
   print('<', li.text, '>', 'class=', li.get_attribute('class'))
   a = li.find_element_by_tag_name('a')
   print('href', '=', a.get_attribute('href'))
browser.close()

执行结果如下:

秒杀
优惠券
PLUS会员
品牌闪购
id = 6bb622fb-df60-4619-a373-b55e44dc27af
location = {'x': 203, 'y': 131}
tag_name = ul
size = {'height': 40, 'width': 294}
<class 'selenium.webdriver.remote.webelement.WebElement'>
< 秒杀 > class= fore1
href = https://miaosha.jd.com/
<class 'selenium.webdriver.remote.webelement.WebElement'>
< 优惠券 > class= fore2
href = https://a.jd.com/
<class 'selenium.webdriver.remote.webelement.WebElement'>
< PLUS会员 > class= fore3
href = https://plus.jd.com/index?flow_system=appicon&flow_entrance=appicon11&flow_channel=pc
<class 'selenium.webdriver.remote.webelement.WebElement'>
< 品牌闪购 > class= fore4
href = https://red.jd.com/

七、管理 Cookies

使用 selenium API 获取 cookie 列表,并添加新的 cookie,以及删除所有的 cookie。

示例代码如下:


from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.jd.com')
print(browser.get_cookies())
browser.add_cookie({'name': 'name',
                   'value': 'jd', 'domain': 'www.jd.com'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())  # 大部分删除了,可能还剩下一些

八、改变节点属性的值

通过 javascript 代码改变百度搜索按钮的位置,让这个按钮在多个位置之间移动,时间间隔是2秒。

示例代码如下:


from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_button = driver.find_element_by_id("su")  # 百度搜索按钮
# arguments[0]对应的是第一个参数,可以理解为python里的%s传参,与之类似
x_positions = [50, 90, 130, 170]
y_positions = [100, 120, 160, 90]
for i in range(len(x_positions)):
   js = '''
    arguments[0].style.position = "absolute";
    arguments[0].style.left="{}px";
    arguments[0].style.top="{}px";
   '''.format(x_positions[i], y_positions[i])
   driver.execute_script(js, search_button)
   time.sleep(2)

使用 javascript 代码修改京东商城首页顶端的前两个导航菜单的文本和链接,分别改成 ‘3天极速掌握 Scala 语言:First Day' 和 ‘数据仓库 Hive 从入门到小牛(一)',导航链接也会发生改变。


from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.jd.com")
ul = driver.find_element_by_id('navitems-group1')
li_list = ul.find_elements_by_tag_name('li')
a1 = li_list[0].find_element_by_tag_name('a')
a2 = li_list[1].find_element_by_tag_name('a')
js = '''
arguments[0].text = '3天极速掌握 Scala 语言:First Day'
arguments[0].href = 'https://blog.csdn.net/xw1680/article/details/118743183'
arguments[1].text = '数据仓库 Hive 从入门到小牛(一)'
arguments[1].href = 'https://blog.csdn.net/xw1680/article/details/118675528'
'''
driver.execute_script(js, a1, a2)

效果如下图所示:

教你快速上手Selenium爬虫,万物皆可爬

来源:https://blog.csdn.net/xw1680/article/details/118931255

标签:Selenium,爬虫
0
投稿

猜你喜欢

  • python单例模式的多种实现方法

    2023-05-01 12:05:04
  • Pycharm中配置Anaconda解释器的完整步骤

    2021-12-16 16:37:38
  • PHP中使用FFMPEG获取视频缩略图和视频总时长实例

    2023-11-16 18:57:46
  • Python基础教程之增加和去除数字的千位分隔符

    2021-12-04 13:46:12
  • 详谈Python基础之内置函数和递归

    2021-12-19 21:55:40
  • 微信小程序wxml列表渲染原理解析

    2023-07-17 14:28:08
  • Python3实现的回文数判断及罗马数字转整数算法示例

    2023-07-07 05:10:06
  • asp如何制作一个股票滚屏显示面板?

    2010-07-07 12:27:00
  • Python三元运算与lambda表达式实例解析

    2023-06-14 16:34:09
  • sqlserver附加.mdf权限问题解决

    2024-01-17 15:46:20
  • 基于Python实现Hash算法

    2023-09-21 17:29:58
  • JS实现点击下拉菜单把选择的内容同步到input输入框内的实例

    2023-09-08 19:50:10
  • PyTorch安装与基本使用详解

    2023-05-09 03:20:51
  • Quickwork For Asp -实战之后台管理

    2009-12-31 19:13:00
  • python实现点击按钮修改数据的方法

    2023-08-18 20:46:08
  • vscode配置setting.json文件实现eslint自动格式代码

    2022-06-14 00:53:05
  • 聊聊golang的defer的使用

    2023-07-21 13:15:02
  • python装饰器原理与用法深入详解

    2021-01-13 09:17:19
  • pycharm内无法import已安装的模块问题解决

    2021-08-28 08:53:17
  • python画图把时间作为横坐标的方法

    2021-06-17 08:13:28
  • asp之家 网络编程 m.aspxhome.com