【爬虫】 之 webdriver

使用requests、urllib等纯代码实现爬虫,经常会被反爬技术较强的网站禁用。

为了防止这种情况,我们可以使用selenium自动控制chrome等浏览器抓取网页数据,使用以上方式抓取网页内容的,还可以让浏览器动态的加载网页内容,这方便了抓取使用ajax动态加载的网页。

1.webdriver驱动

1.1 驱动下载 

在网上找浏览器对应版本的webdriver驱动,下载安装,并添加到环境变量中。

  • Chrome 浏览器驱动  下载地址:http://chromedriver.storage.googleapis.com/index.html
  • Firfox 浏览器驱动  下载地址:https://github.com/mozilla/geckodriver/releases
  • IE 浏览器驱动  下载地址:http://docs.seleniumhq.org/download/
  • Edge 浏览器驱动  下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

 1.2 使用驱动打开浏览器

  • 打开 Chrome浏览器 browser = webdriver.Chrome()
  • 打开 Firfox浏览器 browser = webdriver.Firefox()
  • 打开 IE浏览器 browser = webdriver.Ie()
  • 打开 Edge浏览器 browser = webdriver.Edge()
  • 打开 Safari浏览器 browser = webdriver.Safari()
  • 打开 Opera浏览器 browser = webdriver.Opera()

 1.3 控制浏览器关闭/退出

  • 当开启多个时,关闭当前页面    browser.close()
  • 退出并关闭所有页面驱动    browser.quit()

1.4 控制浏览器刷新

  • browser.refresh()

1.5 控制浏览器前进/后退

  • 页面前进  browser.forward()
  • 页面后退  browser.back()

1.6 执行JavaScript语句

  • browser.execute_script("JS语句")

1.7 获取浏览器的版本号

  • browser.capabilities['version']

1.8 浏览器串口设置

  • 设置窗口最大化    browser.maximize_window()
  • 设置窗口最小化    browser.minimize_window()
  • 通过像素设置浏览器的大小    browser.set_window_size(width, height)

 

  • 获取当前窗口针对于Windows的位置的坐标x,y    browser.get_window_position()
  • 设置当前窗口针对于Windows的位置的坐标x,y    browser.set_window_position(_x, _y)

 

  • 返回当前操作的浏览器句柄    browser.current_window_handle
  • 返回所有打开server的浏览器句柄    browser.window_handles

1.9截取当前页面

  • 获取当前页面的二进制图片数据,需要自己去写入文件    driver.get_screenshot_as_png()
  • 只需要传入图片名称自动写成图片    browser.get_screenshot_as_file('file_name.png')

1.10 获取参数

  • 当前url    browser.current_url
  • tag标题    browser.title
  • 页面源码    browser.page_source
  • 浏览器名称    browser.name

1.11 标签类操作

tag = browser.find_element_by_id(tag_id)

【注】:以下 tag 为一个实际的标签

  • 通过标签 [id] 查找标签    driver.find_element_by_id(tag_id)
  • 获取标签内容    tag.text
  • 获取标签尺寸    tag.size
  • 获取标签的属性值(id、 name、 type等)    tag.get_attribute('name')
  • 返回元素的结果是否可见(True / False)    tag.is_displayed()
  • 单击元素    tag.click()
  • 提交    tag.submit()

2.代码示例

from bs4 import BeautifulSoup
from selenium import webdriver

def get_data(url):
    browser = webdriver.Chrome('E:\workSoftware\chromedriver_win32\chromedriver.exe') #webdriver 目录
    browser.get(url)  # 请求页面
    strhtml = browser.page_source
    soup = BeautifulSoup(strhtml, 'lxml')
    data = soup.select('#mainBox > main > div.article-list > div')  # 选择标签
    for item in data:  # 输出内容
        try:
            print('标题' + item.h4.a.text[11:] + ' ' + item.h4.a['href'])
        except:
            continue

if __name__ == '__main__':
    url = 'https://blog.csdn.net/Aibiabcheng'
    get_data(url)

3.异常处理

webdriver的get方法会一直等待页面加载完毕才会进行后续操作,但是如果一直等待加载的话,会导致后续操作无法进行,影响爬虫效率。可以用以下方法来停止加载:

使用set_page_load_time()方法来设定时间 ——> 捕获timeout异常 ——> 通过执行JS来停止页面加载window.stop()

代码示例

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
import time

if __name__ == '__main__':
    browser = webdriver.Chrome()
    browser.set_page_load_timeout(5) # 使用set_page_load_time()方法来设定时间

    try:
        browser.get('https://blog.csdn.net/Aibiabcheng')
    except TimeoutException: # 捕获timeout异常
        browser.execute_script('window.stop()') # 通过执行JS来停止页面加载window.stop()
    except :
        print('Other Error')

 

你可能感兴趣的:(Python爬虫)