文章目录

  • 前言
  • 又称为动态渲染⻚⾯爬取
  • Selenium的介绍
  • Selenium的使⽤
  • 尾声1


前言

公司最近一个项目一直在重复一个网页操作,想起了selenium库。
之前用来模拟浏览器执行网页爬取,来跳过反扒处理。是通过完全模拟浏览器进行渲染,也就是服务器会完全认为是用户在用浏览器进行操作,这样的话也就可以进行公司的项目,自动化处理网页的操作

又称为动态渲染⻚⾯爬取

  • 对于访问Web时直接响应的数据(就是response内容可⻅),我们使⽤urllib、requests或Scrapy
    框架爬取。
  • 对应⼀般的JavaScript动态渲染的⻚⾯信息(Ajax加载),我们可以通过分析Ajax请求来抓取信
    息。
  • 即使通过Ajax获取数据,但还有会部分加密参数,后期经过JavaScript计算⽣成内容,导致我们难
    以直接找到规律,如淘宝⻚⾯。
  • 为了解决这些问题,我们可以直接使⽤模拟浏览器运⾏的⽅式来实现信息获取。
  • 在Python中有许多模拟浏览器运⾏库,如:Selenium、Splash、PyV8、Ghost等

Selenium的介绍

  • Selenium是⼀个⾃动化测试⼯具,利⽤它可以驱动浏览器执⾏特定的动作,如点击,下拉,等操
    作。
  • Selenium可以获取浏览器当前呈现的⻚⾯源代码,做到可⻅既可爬,对应JavaScript动态渲染的信息爬取⾮常有效。
    官⽅⽹址:http://www.seleniumhq.org
    官⽅⽂档:http://selenium-python.readthedocs.io
    中⽂⽂档:http://selenium-python-zh.readthedocs.io
    安装: pip install selenium
  • Selenium⽀持⾮常多的浏览器,如Chrome、Firefox、Edge等,还⽀持⽆界⾯浏览器
    PhantomJS。
  • ChromeDriver浏览器驱动的安装:(注意浏览器版本:)
    ⾸先查看当前⾕歌Chrome浏览器的版本V61V67(对应2.352.38),再到下⾯⽹址下载
    ⽹址: https://chromedriver.storage.googleapis.com/index.html
    Windows安装:将解压的⽂件: chromedriver.exe 放置到Python的Scripts⽬录下。
    Mac/Linux安装:将解压的⽂件: chromedriver 放置到 /usr/local/bin/ ⽬录下

chromedriver.exe 放置到到指定目录下后webdriver.Chrome()
不放到指定目录也可以这样做:webdriver.Chrome(‘ chromedriver.exe的所在目录‘)

  • PhantomJS驱动的下载地址:http://phantomjs.org/download.html

Selenium的使⽤

  1. 初次体验:模拟⾕歌浏览器访问百度⾸⻚,并输⼊python关键字搜索
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
#初始化⼀个浏览器(如:⾕歌,使⽤Chrome需安装chromedriver)
driver = webdriver.Chrome()
#driver = webdriver.PhantomJS() #⽆界⾯浏览器
try:#请求⽹⻚
driver.get("https://www.baidu.com") #查找id值为kw的节点对象(搜索输⼊框)
input = driver.find_element_by_id("kw") #模拟键盘输⼊字串内容
input.send_keys("python") #模拟键盘点击回⻋键
input.send_keys(Keys.ENTER) #显式等待,最⻓10秒
wait = WebDriverWait(driver,10) #等待条件:10秒内必须有个id属性值为content_left的节点加载出来,否则抛异常。
wait.until(EC.presence_of_element_located((By.ID,'content_left')))
# 输出响应信息
print(driver.current_url)
print(driver.get_cookies())
print(driver.page_source)
finally: #关闭浏览器
#driver.close()
pass
  1. 声明浏览器对象
from selenium import webdriver
driver = webdriver.Chrome() #⾕歌 需:ChromeDriver驱动
driver = webdriver.FireFox() #⽕狐 需:GeckoDriver驱动
driver = webdriver.Edge() 
driver = webdriver.Safari() 
driver = webdriver.PhantomJS() #⽆界⾯浏览器
  1. 声明浏览器对象
from selenium import webdriver
driver = webdriver.Chrome()
#driver = webdriver.PhantomJS()
driver.get("http://www.taobao.com")
print(driver.page_source)
#driver.close()
  1. 查找节点:
  • 获取单个节点的⽅法:
    find_element_by_id()
    find_element_by_name()
    find_element_by_xpath()
    find_element_by_link_text()
    find_element_by_partial_link_text()
    find_element_by_tag_name()
    find_element_by_class_name()
    find_element_by_css_seletor()
from selenium import webdriver
from selenium.webdriver.common.by import By
#创建浏览器对象
driver = webdriver.Chrome()
#driver = webdriver.PhantomJS()
driver.get("http://www.taobao.com") #下⾯都是获取id属性值为q的节点对象
input = driver.find_element_by_id("q")
print(input)
input = driver.find_element_by_css_selector("#q")
print(input)
input = driver.find_element_by_xpath("//*[@id='q']")
print(input) #效果同上
input = driver.find_element(By.ID,"q")
print(input)
#driver.close()
  • 获取多个节点的⽅法:
    find_elements_by_id()
    find_elements_by_name()
    find_elements_by_xpath()
    find_elements_by_link_text()
    find_elements_by_partial_link_text()
    find_elements_by_tag_name()
    find_elements_by_class_name()
    find_elements_by_css_seletor()
  1. 节点交互:
from selenium import webdriver
import time
#创建浏览器对象
driver = webdriver.Chrome()
#driver = webdriver.PhantomJS()
driver.get("http://www.baidu.com") #下⾯都是获取id属性值为q的节点对象
input = driver.find_element_by_id("kw") #模拟键盘输⼊iphone
input.send_keys('iphone')
time.sleep(3) #清空输⼊框
input.clear()
#模拟键盘输⼊iPad
input.send_keys('iPad') #获取搜索按钮节点
botton = driver.find_element_by_class_name("btn-search") #触发点击动作
botton.click()
#driver.close()

尾声1

这些为最基础的操作,可以举一反三,觉得好玩或者什么新奇的操作可以评论交流
会继续更新更深入操作