什么是selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
PhantomJS的介绍
PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript
下载地址:http://phantomjs.org/download.html
Chromedriver的介绍
Chromedriver 也是一个能够被selenium驱动的浏览器,但是和PhantomJS的区别在于它是有界面的
下载地址:https://npm.taobao.org/mirrors/chromedriver
driver的安装
最简单的安装方式是:解压后把bin目录下的可执行文件移动到环境变量下,比如/usr/bin 或者是/usr/local/bin下面
selenium的入门使用
# coding=utf-8
from selenium import webdriver
import time
#实例化dirver
driver = webdriver.Chrome()
#调整浏览器窗口 的大小
# driver.maximize_window()# 最大化
driver.set_window_size(1920,1080)
# 获取网址
driver.get("http://www.baidu.com")
#在input标签输入内容
driver.find_element_by_id("kw").send_keys("美女") #输入内容
driver.find_element_by_id("su").click() #点击元素
#页面截屏
driver.save_screenshot("./baidu.png")
#获取页面源码
print(driver.page_source)
#获取当前的url地址
print(driver.current_url)
#获取cookie
print(driver.get_cookies())
print("*"*100)
print({i["name"]:i["value"] for i in driver.get_cookies()})
#
time.sleep(5)
driver.quit() #退出浏览器
selenium的定位操作
定位元素语法:
find_element_by_id (返回一个元素)
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_element和find_elements的区别 by_link_text和by_partial_link_tex的区别:全部文本和包含某个文本
获取数据语法
find_element仅仅能够获取元素,不能顾直接获取其中的数据,find_element_by_xapth也是这样
获取文本:element.text
获取属性值:element.get_attribute("href")
selenium 处理cookie
通过driver.get_cookies()能够获取所有的cookie
# 把cookie转化为字典
{cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()
页面等待的方法 time.sleep(10)
使用selenium切换frame
frame是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是 driver.switch_to.frame()
driver.switch_to.frame(id,name,element)
selenium的优缺点
selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易
selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用
练习
1、模拟登入某瓣
# coding=utf-8
from selenium import webdriver
import time
#实例化dirver
driver = webdriver.Chrome()
driver.get("https://www.douban.com/")
#输入用户名
driver.find_element_by_id("form_email").send_keys("756258***@qq.com")
#输入密码
driver.find_element_by_id("form_password").send_keys("***19950623")
time.sleep(10)
#点击登录
driver.find_element_by_class_name("bn-submit").click()
time.sleep(3)
driver.quit()
2、selenium的定位操作
# coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://movie.douban.com/top250")
#find_element和find_elements的去呗
ret2 = driver.find_elements_by_xpath("//div[@class='item111']")
print(ret2)
print("*"*100)
ret1 = driver.find_element_by_xpath("//div[@class='item111']")
print(ret1)
# #获取文本
ret3 = driver.find_elements_by_xpath("//span[@class='title']")
ret3 = [i.text for i in ret3]
print(ret3)
# #获取属性的值
ret4 = driver.find_elements_by_xpath("//span[@class='title']/..")
print(ret4[0].get_attribute("href"))
ret4 = [i.get_attribute("href") for i in ret4]
print(ret4)
#根据标签的文本定位元素
ret5 = driver.find_element_by_link_text("后页>").get_attribute("href")
print(ret5)
#根据标签包含的文本定位元素
ret6= driver.find_element_by_partial_link_text("后页").get_attribute("href")
print(ret6)
driver.quit()
2、selenium爬取某鱼
# coding=utf-8
from selenium import webdriver
import time
class DouYu:
def __init__(self):
self.start_url = "https://www.douyu.com/directory/all"
self.driver = webdriver.Chrome()
def get_content_list(self): #提取数据
li_list = self.driver.find_elements_by_xpath("//ul[@id='live-list-contentbox']/li")
content_list = []
for li in li_list:
item = {}
item["title"] = li.find_element_by_xpath("./a").get_attribute("title")
item["anchor"] = li.find_element_by_xpath(".//span[@class='dy-name ellipsis fl']").text
item["watch_num"] = li.find_element_by_xpath(".//span[@class='dy-num fr']").text
print(item)
content_list.append(item)
#提取下一页的元素
next_url = self.driver.find_elements_by_xpath("//a[@class='shark-pager-next']")
next_url = next_url[0] if len(next_url)>0 else None
return content_list,next_url
def save_content_list(self,content_lsit):#保存
pass
def run(self): #实现主要逻辑
#1. start_url
#2. 发送请求,获取响应
self.driver.get(self.start_url)
#3. 提取数据
content_list,next_url = self.get_content_list()
#4.保存
self.save_content_list(content_list)
# 5. 下一页数据的提取
while next_url is not None:
next_url.click() #页面没有完全加载完,会报错
time.sleep(3)
content_list,next_url = self.get_content_list()
self.save_content_list(content_list)
if __name__ == '__main__':
douyu = DouYu()
douyu.run()
3、selenium爬取某音乐
from selenium import webdriver
import csv
#网易云音乐歌单首页的url
url = 'http://music.163.com/#/discover/playlist?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0'
#用Chrome接口创建一个Selenium的Webdriver
driver = webdriver.Chrome()
#创建储存歌单的文件
csv_file = open("playlist.csv","w",newline='')
writer = csv.writer(csv_file)
writer.writerow(['标题','播放数','链接'])
#解析每一页,直到下一页为空
while url != 'javascript:void(0)':
# 用WebDriver加载页面
driver.get(url)
# 切换到内容的iframe
driver.switch_to.frame("contentFrame")
# 定位歌单标签
data = driver.find_element_by_id("m-pl-container").find_elements_by_tag_name("li")
#解析每一页的所有歌单
for i in range(len(data)):
#获取播放数
nb = data[i].find_element_by_class_name("nb").text
#获取播放数歌单封面
msk = data[i].find_element_by_css_selector("a.msk")
#把封面标题,连接,播放数写到文件
writer.writerow([msk.get_attribute('title'),nb,msk.get_attribute('href')])
#定位下一页的url
url = driver.find_element_by_css_selector("a.zbtn.znxt").get_attribute('href')
csv_file.close()