网络爬虫基础-selenium

selenium模块

selenium模块的基本使用

问题:selenium模块和爬虫之间具有怎样的关联?

  • 便捷的获取网站中动态加载的数据

  • 便捷的实现模拟登陆

什么是selenium模块?

  • 基于浏览器自动化的一个模块。

    selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。

selenium使用流程

  • 环境安装: pip install selenium
  • 下载一个浏览器的驱动程序(谷歌浏览器)
    • 下载路径:http://chromedriver.storage.googleapis.com/index.html
    • 查看驱动和浏览器版本的映射关系:http://blog.csdn.net/huilan_same/article/details/51896672
  • 通过selenium模块实例化一个浏览器对象
from selenium import webdriver
# 实例化一个浏览器对象(传入浏览器的驱动程序)
bro = webdriver.Chrome(excutable_path='驱动程序路径')
  • 编写基于浏览器自动化的操作代码

    • 发起请求:get(url)
  • 标签定位:find系列的方法

    • 标签交互:send_keys(‘xxx’) 录入信息
  • 执行js程序:execute_script(‘js_code’)

    • 前进、后退:forward(), back()
  • 关闭浏览器:quit()

示例1:基本操作

from selenium import webdriver
from time import sleep

bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://www.taobao.com/')

# 标签定位
# 定位input标签
search_input = bro.find_element_by_id('q')
# 标签交互(录入商品名称)
search_input.send_keys('青年大学习')

# 执行一组js程序
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2)

# 定位button标签
button = bro.find_element_by_class_name('btn-search')
# 点击搜索按钮
button.click()

bro.get('https://www.baidu.com')
sleep(2)

# 回退
bro.back()
sleep(2)
# 前进
bro.forward()

# 关闭浏览器
sleep(5)
bro.quit()

示例2:爬取药监局数据

from selenium import webdriver
from lxml import etree
from time import sleep
# 实例化一个浏览器对象(传入浏览器的驱动程序) 
bro = webdriver.Chrome(excutable_path='驱动程序路径')
# 让浏览器发起一个指定url对应的请求
url = 'http://scxk.nmpa.gov.cn:81/xk/'
bro.get(url)
# 获取浏览器当前页面的页面源码数据
page_text = bro.page_source
# 解析企业名称
tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@id="gzlist"]/li')
for li in li_list:
    name = li.xpath('./dl/@title')[0]
    print(name)
# 关闭浏览器
sleep(5)
bro.quit()

selenium处理iframe

  • 如果定位标签存在于iframe标签之中,则必须使用switch_to.frame(id)切换作用域,再进行标签定位。

  • 动作链(拖动)

    • from selenium.webdriver import ActionChains
  • 实例化一个动作链对象:action = ActionChains(bro)

    • click_and_hold(标签):长按且点击
  • move_by_offset(xoffset, yoffset):左右移动

    • perform():立即执行动作链操作
  • action.release():释放动作链对象

示例:

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

url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get(url)

# div = bro.find_element_by_id('draggable')  # 找不到标签
# 如果定位的标签是存在iframe标签之中的则必须通过如下操作再进行标签定位
bro.switch_to.frame('iframeResult')  # 切换浏览器标签定位的作用域
div = bro.find_element_by_id('draggable')

# 动作链
# 1.实例化动作链对象
action = ActionChains(bro)
# 2.点击长按指定的标签
action.click_and_hold(div)
# 3.移动标签
for i in range(5):
    # action.move_by_offset(xoffset, yoffset)
    # perform立即执行动作链操作
    action.move_by_offset(17, 0).perform()  # 一次偏移17个像素
    sleep(0.3)
# 4.释放动作链
action.release()
bro.quit()

示例2:模拟登陆qq空间

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


url = 'https://qzone.qq.com/'
bro = webdriver.Chrome('./chromedriver.exe')
bro.get(url)
# 切换作用域
bro.switch_to.frame('login_frame')
# 定位到账号密码登陆超链接
a_tag = bro.find_element_by_id('switcher_plogin')
a_tag.click()
# 输入账号及密码登陆
userName_tag = bro.find_element_by_id('u')
password_tag = bro.find_element_by_id('p')
userName_tag.send_keys('736832556')
sleep(1)
password_tag.send_keys('ZH1127zh.')
sleep(1)
submit_btn = bro.find_element_by_id('login_button')
submit_btn.click()
sleep(3)
bro.quit()

无头浏览器+规避监测

谷歌的无头浏览器,是一款无界面的谷歌浏览器。

使用方法如下:

from selenium import webdriver
from time import sleep
# 实现无可视化界面
from selenium.webdriver.chrome.options import Options
# 实现规避监测
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

'''实现无可视化界面操作'''
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

'''如何让selenium规避被监测的风险'''
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])


bro = webdriver.Chrome('./chromedriver.exe', options=chrome_options)
# 无可视化界面(无头浏览器) phantomJS
bro.get('https://www.baidu.com')
print(bro.page_source)
sleep(2)
bro.quit()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值