爬⾍之selenium模块
⼀、selenium模块
之前,我们爬⾍是模拟浏览器,但始终不是⽤的浏览器,但今天我们要说的是另⼀种爬⾍⽅式,这次不是模拟浏览器,⽽是⽤程序去控制浏览器进⾏⼀些列操作,也就是selenium。selenium是python的⼀个第三⽅库,对外提供的接⼝可以操控浏览器,⽐如说输⼊、点击,跳转,下拉等动作。
在使⽤selenium模块之前要做两件事,⼀是安装selenium模块,可以⽤终端⽤pip,也可以在pycharm⾥的setting安装;⼆是我们需要下载⼀款浏览器驱动程序,下载的驱动程序要和浏览器的版本⼀致
⼆、⽤⾕歌驱动程序来展⽰selenium模块的⽤法
1,下载⾕歌浏览器的驱动程序
⽹上的映射图:
所以我选择⼀个v2.45的驱动程序,去驱动程序下载页⾯选择v2.45,点击,如果是windows系统的,选择32位是可以⽤(只有32位供你选择)
2,简单⽰例
from selenium import webdriver
#⾸先要实例化⼀个对象,参数为驱动程序所在位置的路径
driver=webdriver.Chrome(r'E:\Google\Chrome\')
<('www.baidu/')
#给input标签赋值
search=input('请输⼊想要下载的类型,如美⼥')
#这是通过id属性到搜索框标签,并且给他赋值
driver.find_element_by_id('kw').send_keys(search)
#通过id属性到‘百度⼀下’点击标签,可点击事件触发操作
driver.find_element_by_id('su').click()
driver.close()#关闭驱动程序
3,到标签
find_element_by_id() #通过id属性
find_element_by_name() #通过name属性
find_element_by_class_name() #通过class名字
find_element_by_tag_name() #通过标签名字
find_element_by_link_text() #通过链接标签的⽂本
find_element_by_partial_link_text() #通过链接标签的部分⽂本
find_element_by_xpath() #通过xpath
find_element_by_css_selector() #通过css选择器
注意:
1,find_element_by_到的第⼀个,find_elements_by_到的是所有
2,find_element(By.ID,id)和find_element_by_id(id)是⼀样的
4,到的标签可⽤⽅法
#这是到⼀个搜索框的标签
input=driver.find_element_by_id('ww')
#给这个搜索框输⼊值
input.send_keys('myname')
#把搜索框的值给清空
input.clear()
#这是到⼀个按钮标签
button=driver.find_element_by_id('cc')
#触发点击事件
button.click()
5,动作链
上⾯的动作只是输⼊啊,点击等单个动作的实现,其实还有⼀些连续的动作,⽐如说⿏标拖动等,这就是⼀个动作链。
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
browser = webdriver.Chrome()
url = 'www.runoob/try/try.php?filename=jqueryui-api-droppable'
<(url)
#这是特例,这个页⾯相当于有两层HTML,这是进⼊iframeResult的HTML
browser.switch_to.frame('iframeResult')
#到source标签
source = browser.find_element_by_css_selector('#draggable')
#到target标签
target = browser.find_element_by_css_selector('#droppable')
#实例化⼀个action对象
actions = ActionChains(browser)
#点击source标签,然后不放开
actions.click_and_hold(source).perform()
#把刚才点击不放的标签移动到target标签
#然后再把source标签往x轴⽅向移动50
#这是释放动作链,也就是松开⿏标
6,执⾏js代码
from selenium import webdriver
browser = webdriver.Chrome()
<('www.jd/')
#这是滚动页⾯的滚动条,这个功能是很好⽤的,我们知道有很多页⾯刚进⼊时,是不会加载完全,当你把滚动条不断往下滚动,⼜会添加更多的信息,
对于爬取这种页⾯,如果不⽤这个⽅法,得到页⾯是不完全的
7,获取标签的信息
7.1 拿到页⾯的源代码
#直接⽤驱动对象'.page_source'就可以
driver.page_source
7.2 直接拿标签的属性
from selenium import webdriver
from selenium.webdrivermon.by import By #按照什么⽅式查,By.ID,By.CSS_SELECTOR
from selenium.webdriver.support import expected_conditions as EC
tag=browser.find_element(By.CSS_SELECTOR,'#cc-lm-tcgShowImgContainer img')
#获取标签属性,
_attribute('src'))
#获取标签ID,位置,名称,⼤⼩(了解)
print(tag.id)
print(tag.location)
print(tag.tag_name)
print(tag.size)
8,延时等待
页⾯加载是分顺序的,很多时候当⽹速差⼀点的情况下,就会明显感觉到,先看到是⼀些html标签,但什么css和js都没有,图⽚等加载会慢点。所以当我们发送请求后直接拿page_source,不⼀定能拿到加载完毕的页⾯,也就拿到源码可能不全,为了确保能拿到完整的源码,有两种等待的⽅法:⼀是隐式等待,⼆是显⽰等待
8.1 隐式等待
就是等页⾯加载完毕后在开始查,
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdrivermon.by import By #按照什么⽅式查,By.ID,By.CSS_SELECTOR
from selenium.webdrivermon.keys import Keys #键盘按键操作
selenium获取cookiefrom selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页⾯加载某些元素
browser=webdriver.Chrome()
#隐式等待:在查所有元素时,如果尚未被加载,则等10秒
browser.implicitly_wait(10)
<('www.baidu')
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()
8.2 显式等待
只等要查的标签加载完毕
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdrivermon.by import By #按照什么⽅式查,By.ID,By.CSS_SELECTOR
from selenium.webdrivermon.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页⾯加载某些元素
browser=webdriver.Chrome()
<('www.baidu')
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()
9,cookie
我们知道对于浏览器来说cookie是很重要的,很多情况下服务器都是要对cookie进⾏验证的
from selenium import webdriver
browser = webdriver.Chrome()
<('www.zhihu/explore')
#获取cookie
<_cookies()
#设置cookie
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu', 'value': 'germey'})
#删除cookie
browser.delete_all_cookies()
10,异常处理
from selenium import webdriver
ptions import TimeoutException,NoSuchElementException,NoSuchFrameException
try:
browser=webdriver.Chrome()
<('www.runoob/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframssseResult')
except TimeoutException as e:
print(e)
except NoSuchFrameException as e:
print(e)
finally:
browser.close()
在这个⽰例中,我们可以把⾕歌浏览器换成⽕狐等各种浏览器,⽤法是⼀样的
三、phantomJS⽆界⾯浏览器
1,phantomJS介绍
上⾯⽤的⾕歌浏览器是很好⽤的,⽽且可视化界⾯让学习者很好的了解整个过程,但其实在应⽤中,我们并不需要看到可视化界⾯,于是就有了phantomJS,它是⼀款⽆界⾯的浏览器,整个实现流程和⾕歌⼀样的,虽然说没有界⾯,但其有截图功能,⽤save_screenshot函数
from selenium import webdriver
import time
# phantomjs路径
path = r'PhantomJS驱动路径'
browser = webdriver.PhantomJS(path)
# 打开百度
url = 'www.baidu/'
<(url)
browser.save_screenshot(r'baidu.png')
# 查input输⼊框
my_input = browser.find_element_by_id('kw')
# 往框⾥⾯写⽂字
my_input.send_keys('美⼥')#截屏
browser.save_screenshot(r'meinv.png')
# 查搜索按钮
button = browser.find_elements_by_class_name('s_btn')[0]
button.click()
browser.save_screenshot(r'show.png')
browser.quit()
⽤selenium和phantomJS就可以很友好的实现有些⽹页的爬取了,⽐如说需要把滚动条拉倒最下⾯才会有完整的页⾯。 2,爬取需要下拉动作的⽹页新闻
from selenium import webdriver
from time import sleep
import time
if__name__ == '__main__':
url = 'news.163/'
# 发起请求前,可以让url表⽰的页⾯动态加载出更多的数据
path = r'phantomjs-2.1.1-windows\'
# 创建⽆界⾯的浏览器对象
bro = webdriver.PhantomJS(path)
# 发起url请求
<(url)# 截图
bro.save_screenshot('1.png')
# 执⾏js代码(让滚动条向下偏移n个像素(作⽤:动态加载了更多的电影信息))
js = 'window.scrollTo(0,document.body.scrollHeight)'
bro.save_screenshot('2.png') # 使⽤爬⾍程序爬去当前url中的内容
html_source = bro.page_source # 该属性可以获取当前浏览器的当前页的源码(html)
with open('./source.html', 'w', encoding='utf-8') as fp:
fp.write(html_source)
bro.quit()
四、⾕歌⽆头浏览器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
# 创建⼀个参数对象,⽤来控制chrome以⽆界⾯模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 驱动路径
path = '
# 创建浏览器对象
browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
# 发送请求
url = 'www.baidu/'
<(url)
browser.save_screenshot('baidu.png')
browser.quit()
本篇博客主要借鉴于两位⼤佬,在此分享⼤佬的博客
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论