Python爬虫浏览器自动化模拟

Selenium是一个用于Web应用程序测试的工具。当我们使用爬虫爬取一些动态网站时,有时候会出现爬取不到东西的情况,这时候我们就可以使用浏览器模拟的方法来进行网页内容的爬取。selenium可以模拟浏览器的点击、输入、验证、打开等操作,就像真实用户所操作的一样。下面我们就介绍一下selenium的具体使用方法。

安装

pip install selenium

此处我们使用火狐浏览器进行模拟,使用浏览器模拟需要下载geckodriver.exe驱动。注意要下载适合自己火狐版本的geckodriver。

下载地址

          https://github.com/mozilla/geckodriver/releases

导入库

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.firefox.options import Options as FOptions

创建对象

options = FOptions()
#此处路径写你下载的geckodirver.exe所在的路径。(linux系统无需加.exe后缀,注意'/'与'\')
brower = webdriver.Firefox(executable_path='E:\FireFox\geckodriver\geckodriver.exe',firefox_options=options)

基本使用查找元素

brower.get("http://example.webscraping.com/places/default/view/China-47")
#使用xpath选出符合条件的内容
print(brower.find_element_by_xpath('//tr[@id="places_neighbours__row"]/td[@class="w2p_fw"]').text)
#页面源码 相当于requests.get().text
print(brower.page_source)
brower.get("http://example.webscraping.com/dynamic")
#使用css选择器选出符合条件的内容
print(brower.find_element_by_css_selector("#results").text)
#关闭网页
brower.close()

元素交互

在淘宝中模拟输入内容,然后清空之后,再次输入其他内容,最后点击搜索。

brower.get("https://www.taobao.com")
input = brower.find_element_by_id('q')
#在输入框中输入内容
input.send_keys('苹果')
time.sleep(10)
#清空输入框内容
input.clear()
#再次在输入框中输入内容
input.send_keys('香蕉')
button = brower.find_element_by_class_name("btn-search")
#点击搜索按钮
button.click()
time.sleep(10)
#关闭网页
brower.close()

鼠标模拟悬停并点击

在爬虫爬取内容时,有些内容是需要将鼠标移到特定的地方才会显示出来的,若想要获取这类的内容,就需要鼠标模拟悬停然后选出出现的内容,进行点击或者直接获取内容。

#为防止内容不全,先将浏览器最大化
brower.maximize_window()
brower.get('http://example.webscraping.com')
#链接名字
article = brower.find_element_by_link_text('Log In')
ActionChains(brower).move_to_element(article).perform()
#为防止内容未加载出来,先强制睡眠2秒
time.sleep(2)
menu = brower.find_element_by_xpath('//a[@href="/places/default/user/register?_next=/places/default/index"]')
menu.click()

动作链进阶

在我们进行浏览器模拟时可能会遇到这种情况:需要拖动一个东西到指定的地方。这时候我们使用动作链,将这一系列操作联系起来,最后再执行。

browser.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
browser.switch_to.frame("iframeResult")
source = browser.find_element_by_id("draggable")
target = browser.find_element_by_id("droppable")
actions = ActionChains(browser)
# 动作链将一系列动作组织起来,形成一组测试,当调用perform的时候开始执行
actions.drag_and_drop(source,target)
# 执行
actions.perform()
time.sleep(2)
t = browser.switch_to.alert
print(t.text)
t.accept()
time.sleep(10)
browser.close()

执行JavaScript

browser.get("http://www.zhihu.com/explore")
time.sleep(5)#强制休眠
#把页面拉到最下边
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
browser.execute_script("alert('To Button')")
browser.close()

selenium中存在三种睡眠方式,上面我们已经接触到了一种,就是使用 'time.sleep()'强制睡眠,但这种方法在selenium中我们不推荐。下面介绍一下剩下的两种。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
#1.隐式休眠是全局的,如果找不到就等待设置的秒数,再次找不到抛出异常
browser.implicitly_wait(2)
url = 'https://www.taobao.com'
browser.get(url)
#2.wait对象可以有多个,指明达成条件休眠的时间
wait = WebDriverWait(browser,5)
# wait1 = WebDriverWait(browser,10)
#判断页面是否有'q'属性
input1 = wait.until(EC.presence_of_element_located((By.ID,"q")))#满足条件返回元素
#判断元素是否能够点击
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn-search")))
print(input1,button)
browser.close()

我们在运行爬虫时当然不需要让浏览器一直显示,这时候我们可以使用浏览器无头模式,无头模式跟我们平常访问浏览器触发的事件是一样的,唯一的不同就是一个有页面,一个没有页面。

我们只需在创建对象之后加入下面这行代码即可。

options = FOptions()
#无头模式
options.add_argument('-headless')
brower = webdriver.Firefox(executable_path='E:\FireFox\geckodriver\geckodriver.exe',firefox_options=options)

猜你喜欢

转载自blog.csdn.net/j123__/article/details/82811918