爬虫提高(一)自动化测试工具selenium

什么是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()

你可能感兴趣的:(爬虫提高(一)自动化测试工具selenium)