【Python】使用selenium实现网页爬取

 

 

先来认识下Selenium  

Selenium  是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。

就是说Selenium  可以实现浏览器的模拟操作,我们就可以通过模拟实现网页爬取。

好处就是可以简单的绕过验证码机制(只需首次输入),去掉登录、cookie更新、重定向等的烦恼。

1、环境

我是使用chrome,下载Chrome驱动包:http://chromedriver.storage.googleapis.com/index.html,根据你的chrome版本下载,并放在python安装根目录

2、依赖库安装 

pip install selenium

3、依赖库引用

from selenium import webdriver

4、验证码登录,提供自动输入用户名、密码,手动控制台输入验证码

loginurl = 'http://XXX.cn'  # 登录页面
# 加载webdriver驱动,用于获取登录页面标签属性
driver = webdriver.Chrome()
driver.get(loginurl)  # 请求登录页面
driver.find_element_by_class_name('username').clear() # 获取用户名输入框,并先清空
driver.find_element_by_class_name('username').send_keys('用户名') # 输入用户名
driver.find_element_by_class_name('password').clear()  # 获取密码框,并清空
driver.find_element_by_class_name('password').send_keys('密码') # 输入密码
captcha = driver.find_element_by_class_name('yzm_img')  # 获取验证码标签
submit = driver.find_element_by_class_name('submit_btn')  # 获取提交按钮

# 判断是否需要验证码
if captcha:
    captcha_field = driver.find_element_by_class_name('yzm')  # 获取验证码输入框
    text = input("请输入验证码:")  # 控制栏输入验证码
    captcha_field.send_keys(text)  # 将输入的验证码传递给selenium打开的浏览器
    submit.click()  # 按钮提交并登录
else:
    submit.click()  # 无验证码则直接登录提交

5、注意事项1,浏览器加载问题,两种等待方法,常用方法二

time.sleep(3)  # 强制等待,休眠3秒
driver.implicitly_wait(60)  # 隐性等待,加载完就下一步否则最长等60秒,

5、注意事项2,八种选择方法

webdriver 提供了一系列的对象定位方法,常用的有以下几种:

  • id定位:find_element_by_id()
  • name定位:find_element_by_name()
  • class定位:find_element_by_class_name()
  • link定位:find_element_by_link_text()
  • partial link定位:find_element_by_partial_link_text()
  • tag定位:find_element_by_tag_name()
  • xpath定位:find_element_by_xpath()
  • css定位:find_element_by_css_selector()

详见https://www.cnblogs.com/eastonliu/p/9088301.html

6、注意事项3,获取一组元素记得使用find_elements,如

tr = div.find_elements_by_tag_name('tr')[1]
td = tr.find_elements_by_tag_name('td')
time = td[0].text

7、class含有空格时解决方法

在实际进行元素定位时,经常发现class name是有多个class组合的复合类,中间以空格隔开。如果直接进行定位会出现报错,可以通过以下方式处理:

driver.find_element_by_class_name('yzm_img')
#class属性唯一但是有空格,选择空格两边唯一的那一个


self.driver.find_elements_by_class_name('table-dragColumn')[0].click()
#若空格隔开的class不唯一可以通过索引进行定位


driver.find_element_by_css_selector('.dtb-style-1.table-dragColumns').click()
#通过css方法进行定位(空格以‘.’代替)

8、多层级元素获取

div = driver.find_element_by_id('tttggg')
tr = div.find_elements_by_tag_name('tr')[1]
td = tr.find_elements_by_tag_name('td')
time = td[0].text
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值