selenium
selenium
概念:基于浏览器自动化的一个模块.
selenium和爬虫之间的关联是什么?
便捷的获取页面中动态加载的数据
- requests模块进行数据爬取:可见非可得
- selenium:可见即可得
主要用于爬取动态加载的数据,直接用selenium就可以获取
注意点:selenium完全对浏览器进行操作,因此速度非常慢,可以会由于数据没有加载出来而获取失败
selenium的基本操作
1.实例化浏览器对象:bro = webdriver.Chrome(executable_path)
需要参数:要访问浏览器的浏览器驱动程序路径。
谷歌浏览器驱动程序下载地址:http://chromedriver.storage.googleapis.com/index.html
程序和谷歌版本的映射关系表:https://blog.csdn.net/huilan_same/article/details/51896672
2.要访问的url,并发送请求
3.定位标签,find系列的函数用作于标签定位,
与指定标签进行数据交互,获取内容或者赋值给标签
4.可以添加事件
btn = bro.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
btn.click()
5.也可以执行js操作
jsCode = 'window.scrollTo(0,document.body.scrollHeight)'
bro.execute_script(jsCode)
selenium基本操作示例
from selenium import webdriver
from time import sleep
#实例化一个浏览器对象
bro = webdriver.Chrome(executable_path=r'C:\Users\oldboy-python\Desktop\爬虫+数据\day04\chromedriver.exe')
url = 'https://www.jd.com/'
bro.get(url) #用户发起请求
#定位标签
search_input = bro.find_element_by_id('key')
#对指定标签进行数据交互
search_input.send_keys('macPro')
btn = bro.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
btn.click()
sleep(2)
#执行js代码
jsCode = 'window.scrollTo(0,document.body.scrollHeight)'
bro.execute_script(jsCode)
sleep(3)
bro.quit()
selenium爬取动态加载数据示例
from selenium import webdriver
from lxml import etree
from time import sleep
#实例化一个浏览器对象
page_text_list = []
bro = webdriver.Chrome(executable_path=r'C:\Users\oldboy-python\Desktop\爬虫+数据\day04\chromedriver.exe')
url = 'http://125.35.6.84:81/xk/'
bro.get(url)
sleep(2)
#page_source返回的就是当前浏览器打卡页面对应的页面源码数据
page_text = bro.page_source
page_text_list.append(page_text)
for i in range(2):
bro.find_element_by_id('pageIto_next').click()
sleep(2)
page_text = bro.page_source
page_text_list.append(page_text)
for page_text in page_text_list:
tree = etree.HTML(page_text)
li_list = tree.xpath('//*[@id="gzlist"]/li')
for li in li_list:
name = li.xpath('./dl/@title')[0]
print(name)
sleep(3)
bro.quit()
动作链
一系列的行为动作,比如点击长按拖动事件不间隔执行
1.实例化出一个动作链对象,需要将浏览器对象加载进去
from selenium.webdriver import ActionChains
action = ActionChains(bro)
2.给动作链对象添加事件
action.click_and_hold(div_tag)
3.让动作链立即执行
action.move_by_offset(17,0).perform()
4.释放动作链对象
action.release()
动作链操作示例
from lxml import etree
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
#实例化一个浏览器对象
page_text_list = []
bro = webdriver.Chrome(executable_path=r'C:\Users\oldboy-python\Desktop\爬虫+数据\day04\chromedriver.exe')
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
bro.get(url)
#如果定位的标签是存在于iframe对应的子页面中的话,在进行标签定位前一定要执行一个switch_to的操作
bro.switch_to.frame('iframeResult')
div_tag = bro.find_element_by_id('draggable')
#1.实例化动作链对象
action = ActionChains(bro)
action.click_and_hold(div_tag)
for i in range(5):
#让动作链立即执行
action.move_by_offset(17,0).perform()
sleep(0.5)
action.release()
sleep(3)
bro.quit()
无头浏览器
无可视化界面的浏览器,浏览器程序执行了,但是我们看不到,后台执行
1.创建一个参数对象,用来控制chrome以无界面模式打开
from selenium.webdriver.chrome.options import Options
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
2.将参数传入浏览器对象中
bro =webdriver.Chrome(executable_path=r'',chrome_options=chrome_options)
无头浏览器示例
from selenium.webdriver.chrome.options import Options
from time import sleep
from selenium import webdriver
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#实例化一个浏览器对象
bro = webdriver.Chrome(executable_path=r'C:\Users\oldboy-python\Desktop\爬虫+数据\day04\chromedriver.exe',chrome_options=chrome_options)
bro.get('https://www.baidu.com')
sleep(2)
bro.save_screenshot('1.png')
print(bro.page_source)
sleep(2)
bro.quit()
反爬机制-检测selenium操作
1.创建参数对象,用于规避风险
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
2.传递参数到浏览器对象中
bro = webdriver.Chrome(executable_path=r'',options=option)
selenium规避风险
from time import sleep
from selenium import webdriver
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
#实例化一个浏览器对象
bro = webdriver.Chrome(executable_path=r'C:\Users\oldboy-python\Desktop\爬虫+数据\day04\chromedriver.exe',options=option)
bro.get('https://www.taobao.com/')