前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网络爬虫 | selenium 爬取动态加载信息

网络爬虫 | selenium 爬取动态加载信息

作者头像
数据STUDIO
发布2021-06-24 10:32:10
1.1K0
发布2021-06-24 10:32:10
举报
文章被收录于专栏:数据STUDIO

使用selenium实现动态渲染页面的爬取。selenium是浏览器自动测试框架,模拟浏览器,驱动浏览器执行特定的动作,并可获取浏览器当前呈现的页面的源代码,可见即可爬。该工具支持IE浏览器、Mozilla Firefox及Google Chrome等

selenium安装

通过 pip install selenium 命令安装selenium模块

下载浏览器驱动 "https://chromedriver.chromium.org/downloads"

这里需要根据已经安装的Google Chrome浏览器的版本,以及自己的电脑的系统安装浏览器驱动。

下载完成后,需要将文件保存在与python文件同级路径中,如下图所示。


如果出现如下报错。Message: session not created: This version of ChromeDriver only supports Chrome version 79 请查看谷歌浏览器与驱动不一致解决方案。此处笔者是重新安装谷歌浏览器79版本。

声明浏览器对象

代码语言:javascript
复制
import os
os.chdir(r'/Users/jim/Desktop/代码')
from selenium import webdriver # 导入浏览器驱动模块
browser=webdriver.Chrome() # 会打开浏览器

selenium模块的常用方法

driver.find_element_by_

常用方法

描述

driver.find_element_by_id()

根据id获取节点,参数为字符类型id对应的值

driver.find_element_by_name()

根据name获取节点,参数为字符类型name对应的值

driver.find_element_by_xpath()

根据XPath获取节点,参数为字符类型的XPath

driver.find_element_by_link_text()

根据链接文本获取节点,参数为字符类型链接文本

driver.find_element_by_tag_name()

根据节点名称获取节点,参数为字符类型的节点名称

driver.find_element_by_class_name()

根据class获取节点,参数为字符类型class对应的值

driver.find_element_by_css_selector

根据CSS选择器获取节点,参数为字符类型的CSS选择器语法

如需要获取符合条件的多个节点时,在对应方法中element后面添加s。

driver.find_element(by='id', value=None)

by: 获取节点的方式

value: 获取方式对应的值(理解为条件)

获取多个节点时使用find_elements()

By属性

用法

By.ID

根据id值获取对应的节点

By.LINK_TEXT

根据链接文本获取对应的节点

By.PARTIAL_LINK_TEXT

根据部分链接文本获取对应的节点

By.NAME

根据name值获取对应的单个或多个节点

By.TAG_NAME

根据节点名获取节点

By.CLASS_NAME

根据class值获取节点

By.CSS_SELECTOR

根据CSS选择器获取节点,对应的value字符串字符串CSS位置

By.XPATH

根据By.XPATH获取节点,对应的value字符串节点位置

获取某个节点中的某个属性对应的值时,可以使用get_attribute()方法来实现。

代码语言:javascript
复制
#根据name
_input=browser.find_element_by_name("q")
#根据css获取,id名
input_second=browser.find_element_by_css_selector("#q")
#根据id获取
input_third=browser.find_element(By.ID,"q")

打开百度浏览器,并查找元素

通过选择元素按钮找到百度搜索框的HTML代码,这里通过他的id='kw'寻找到浏览框,输完内容后需点击"百度一下"id='su'

代码语言:javascript
复制
import time
from selenium import webdriver
browser=webdriver.Chrome()#会打开浏览器
browser.get('https://www.baidu.com/')
_input = browser.find_element_by_id('kw')#找百度的输入框
# print(_input)
_input.send_keys('python')
_input=browser.find_element_by_id('su').click()#回车
time.sleep(10)
browser.close()#关闭浏览器

效果图如下

获取元素信息,获取属性

代码语言:javascript
复制
#获取元素信息,获取属性
from selenium import webdriver
browser=webdriver.Chrome()
url="https://www.zhihu.com/explore"
browser.get(url)
logo=browser.find_element_by_class_name("ZhihuLogoLink")
print(logo)
print(logo.get_attribute("class"))
print(logo.text)
print(logo.id) #id
print(logo.location) #位置
print(logo.tag_name) #标签名
print(logo.size) #大小

<selenium.webdriver.remote.webelement.WebElement (session="b07f3d23e5f830581deddfa8a568631c", element="71a5b5b9-dc75-4bac-846a-484ba879ac48")> ZhihuLogoLink 71a5b5b9-dc75-4bac-846a-484ba879ac48 {'x': 16, 'y': 10} a {'height': 33, 'width': 64}

元素交互、下拉进度条

先找到搜索框位置,和点击搜索位置
代码语言:javascript
复制
import time
from selenium import webdriver
browser=webdriver.Chrome() #打开浏览器
browser.get('https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_27b1bb5bc1cb4d2faf65fc59cdbfd1cc')
_input=browser.find_element_by_id('key')#
_input.send_keys('羽绒服')
_input.clear()
_input.send_keys('aj')
browser.find_element_by_class_name('button').click()#回车
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
browser.execute_script('window.scrollTo(0,0)')
#browser.close()#关闭浏览器

结果动态演示

等待

当进入一个网站时,网页刷新没有那么快,文字先出来,图片后出来。当网速很慢时尤其明显,因此此时需要加入等待,等待分两种,一种是隐式等待,一种是显示等待。

隐式等待

即等待固定的时间

代码语言:javascript
复制
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.implicitly_wait(3) # 等待固定时间
_input = browser.find_element_by_class_name('zu-button-more')

显示等待

根据实际情况,可设置最大等待时间,知道某个目标元素加载完成。

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser,10) # 最多等待十秒
# 等待到id='q'加载完成
_input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
# 等待到'.btn-search'可以点击
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))

浏览器的前进和后退

代码语言:javascript
复制
from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("https://www.taobao.com")
time.sleep(2)
browser.get("https://www.baidu.com")
browser.back()#后退
time.sleep(2)
browser.forward()#前进
time.sleep(3)
browser.refresh()#刷新
time.sleep(3)
browser.close()

选项卡管理

代码语言:javascript
复制
from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
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(1)
browser.switch_to_window(browser.window_handles[0])
browser.get("https://www.jd.com")
browser.close()
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.close()

异常处理

代码语言:javascript
复制
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException
browser=webdriver.Chrome()
try:
    browser.get("https://www.zhihu.com/explore")
except TimeoutException:
    print("Time out")
try:
    browser.find_element_by_id("hello")
except NoSuchElementException:
    print("No Element")
finally:
    browser.close()

常用操作

代码语言:javascript
复制
#常用键的操作
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)

driver.find_element_by_id('kw').send_keys('selenium')  
#在搜索框中输入"selenium"
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.SPACE)  
#输入空格键
time.sleep(3)
driver.find_element_by_id('kw').send_keys('python')  
#在搜索框中输入"python"
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')  
#输入Control+a模拟全选
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c')  
#输入Control+c模拟复制
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v')  
#输入Control+v模拟粘贴
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.ENTER)  
#输入回车代替点击搜索按钮
time.sleep(3)
driver.close()

下面是一些常用的键盘事件

代码

含义

Keys.BACK_SPACE

回退键(BackSpace)

Keys.TAB

制表键(Tab)

Keys.ENTER

回车键(Enter)

Keys.SHIFT

大小写转换键(Shift)

Keys.CONTROL

Control键(Ctrl)

Keys.ALT

ALT键(Alt)

Keys.ESCAPE

返回键(Esc)

Keys.SPACE

空格键(Space)

Keys.PAGE_UP

翻页键上(Page Up)

Keys.PAGE_DOWN

翻页键下(Page Down)

Keys.END

行尾键(End)

Keys.HOME

行首键(Home)

Keys.LEFT

方向键左(Left)

Keys.UP

方向键上(Up)

Keys.RIGHT

方向键右(Right)

Keys.DOWN

方向键下(Down)

Keys.INSERT

插入键(Insert)

DELETE

删除键(Delete)

NUMPAD0 ~ NUMPAD9

数字键1-9

F1 ~ F12

F1 - F12键

(Keys.CONTROL, ‘a’)

组合键Control+a,全选

(Keys.CONTROL, ‘c’)

组合键Control+c,复制

(Keys.CONTROL, ‘x’)

组合键Control+x,剪切

(Keys.CONTROL, ‘v’)

组合键Control+v,粘贴

登录操作

代码语言:javascript
复制
browser=webdriver.Chrome()
url='''
https://passport.jd.com/new/login.aspx?
ReturnUrl=https%3A%2F%2Fwww.jd.com%2F%3Fcu%3
Dtrue%26utm_source%3Dbaidu-pinzhuan%26utm_me
dium%3Dcpc%26utm_campaign%3Dt_288551095_baid
upinzhuan%26utm_term%3D0f3d30c8dba7459bb52f2
eb5eba8ac7d_0_5c595fde6f6743c1a1878bfeaf4f21
5f'''
browser.get(url)
time.sleep(3)
button=browser.find_element_by_link_text('账户登录').click()
browser.find_element_by_id('loginname').send_keys('')#自己的用户名
time.sleep(2)
browser.find_element_by_id("nloginpwd").send_keys('')#密码
time.sleep(2)
browser.find_element_by_id('loginsubmit').click()#登录
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据STUDIO 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • selenium安装
  • 声明浏览器对象
  • selenium模块的常用方法
    • 打开百度浏览器,并查找元素
      • 先找到搜索框位置,和点击搜索位置
  • 获取元素信息,获取属性
  • 元素交互、下拉进度条
  • 等待
    • 隐式等待
      • 显示等待
        • 浏览器的前进和后退
        • 选项卡管理
        • 异常处理
        • 常用操作
          • 下面是一些常用的键盘事件
          • 登录操作
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档