爬虫Selenium

一.安装

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

官网:http://selenium-python.readthedocs.io

二、安装浏览器驱动

a..谷歌

1.点击下载chrome的webdriver:http://chromedriver.storage.googleapis.com/index.html

注意:对于chrome浏览器,有时候会有闪退的情况,有时候也许是版本冲突的问题

2.将下载文件,放入python文件 下的 Scripts文件,解压

 

或者在cmd,输入

这样,OK!

b.Firefo浏览器

 可下载地址:https://github.com/mozilla/geckodriver/releases/

三.开始

初步体验:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('http://www.jiemian.com/')  #在Chome,打开此网址

开始使用:

from selenium import webdriver  # 驱动浏览器
from selenium.webdriver import ActionChains  # 滑动验证
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  # 与EC联用,等待某个元素被加载
import time

browser = webdriver.Chrome()
try:
    wait = WebDriverWait(browser, 10)

    browser.get('https://www.taobao.com/')

    # By.CSS_SELECTOR
    # By.CLASS_NAME
    # By.XPATH
    # By.ID
    # By.TAG_NAME

    # inp_tag1=browser.find_element(By.CSS_SELECTOR,'#kw') #browser.find_element_by_id('kw')
    inp_tag1=browser.find_element(By.ID,'q') #browser.find_element_by_class('kw')
    inp_tag1.send_keys('iphoneX')

    button=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'btn-search')))
    # button.click()
    button.send_keys(Keys.ENTER)

    wait.until(EC.presence_of_element_located((By.CLASS_NAME,'inner')))

    page_next=browser.find_element(By.CSS_SELECTOR,'.next a')
    print(page_next)
    page_next.click()

    #拿到标签的属性
    attr=page_next.get_attribute('data-value')
    print(attr)

    #拿到标签的内容
    span = browser.find_element(By.CSS_SELECTOR, '.next span')
    print(span.text)

    time.sleep(100)

finally:
    browser.close()
输入框自动添加搜索内容1
from selenium import webdriver  #驱动浏览器
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By  #选择器
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait  #与EC连用,等待某个元素被加载

import time

browser = webdriver.Chrome()
wait = WebDriverWait(browser,10)

browser.get('https://www.baidu.com')
input_tag = browser.find_element_by_id('kw')

input_tag.send_keys('啤酒')  #输入搜索词

button = browser.find_element_by_id('su')  #点击搜索
button.click()

wait.until(EC.presence_of_element_located((By.ID,'content_left'))) #等标签content_left,加载完,

res = browser.page_source

with open('a.html','w',encoding='utf-8') as f:
    f.write(res)


time.sleep(20)
browser.close() #关闭
输入框自动添加搜索内容2

四.三种选择器

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()

browser.get('https://www.baidu.com')

#以下三种方式达到的都是同一种效果:查找id为kw的标签
input_tag1=browser.find_element(By.ID,'kw') #等同于:input_tag1=browser.find_element_by_id('kw')

input_tag2=browser.find_element(By.CSS_SELECTOR,'#kw') #等同于:input_tag2=browser.find_element_by_css_selector('#kw')

input_tag3=browser.find_element(By.XPATH,'//*[@id="kw"]') #等同于:input_tag3=browser.find_element_by_xpath('//*[@id="kw"]')

#注意:browser.find_elements系列与browser.find_element的区别就是,前者是查找多个,后者是只找第一个
div1=browser.find_element(By.CSS_SELECTOR,'div') #找到第一个div标签
div2=browser.find_elements(By.CSS_SELECTOR,'div') #找到所有的div标签,放到列表里

browser.close()
三种查找元素的方式
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()

browser.get('https://www.amazon.cn/')

wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'cc-lm-tcgShowImgContainer')))

tag=browser.find_element(By.CSS_SELECTOR,'#cc-lm-tcgShowImgContainer img')

#获取标签属性,
print(tag.get_attribute('src'))


#获取标签ID,位置,名称,大小(了解)
print(tag.id)
print(tag.location)
print(tag.tag_name)
print(tag.size)


browser.close()
获取标签属性

五.等待元素被加载

#1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待

#2、等待的方式分两种:
隐式等待:在browser.get('xxx')前就设置,针对所有元素有效
显式等待:在browser.get('xxx')之后设置,只针对某个元素有效
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()

#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.implicitly_wait(10)

browser.get('https://www.baidu.com')


input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)

contents=browser.find_element_by_id('content_left') #没有等待环节而直接查找,找不到则会报错
print(contents)

browser.close()
隐式等待
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')


input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)


#显式等待:显式地等待某个元素被加载
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left')))

contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
print(contents)


browser.close()
显示等待

六.元素交互操作

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
import time


browser = webdriver.Chrome()
try:

    browser.get('https://www.baidu.com')
    browser.execute_script('alert("hello world")')  #打印警告

finally:
    time.sleep(10)
    browser.close()
在交互动作比较难实现的时候可以自己写JS(万能方法)
原文地址:https://www.cnblogs.com/zhaochangbo/p/7586535.html