1.Selenium是什么?

selenium是一种web自动化测试工具,可以模拟浏览器的行为(点击,输入….)支持各种浏览器,主流界面式的浏览器如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。
ps:自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。总归根到底:将人为操作的测试行为转化为机器执行的过程。

2.Selenium使用准备

  • 使用Selenium需要安装一个插件

百度(浏览器名+driver)相关安装插件的网站也就出来了

下载网站提供:

chrom: http://npm.taobao.org/mirrors/chromedriver/
Microsoft Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Fire fox: https://github.com/mozilla/geckodriver/releases

把下载好的解压文件进行解压(已经是.exe可执行文件请忽略)解压后把后缀.exe文件放在自己安装python解释器scripts路径与python.exe同一级的文件间下

  • 安装selenium

pip install selenium(下载速度极其慢,容易导致模块没下完就放弃)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium

注意(针对于浏览器为Microsoft Edge, 下载完后的名字为mesdgeWebDriver)

  1. selenium.common.exceptions.WebDriverException: Message: 'MicrosoftWebDriver.exe' executable needs to be in PATH.
  2. #解决方法:把下载好的msedgeWebDriver.exe改名为MirsoftWebDriver.exe

3.Selenium使用

  1. #导入webdriver模块
  2. from selenium import webdriver
  3. if __name__ == '__main__':
  4. #第一行肯定是先生成一个浏览器对象,生成一个代理服务
  5. driver =webdriver.Edge()
  6. #webdriver.Edge("插件的安装地址")
  7. driver.get('https://www.baidu.com/')
  8. driver.find_element_by_xpath('//*[@id="kw"]').send_keys('李白')
  9. driver.find_element_by_xpath('//*[@id="su"]').click()
  10. print(driver.page_source)#获取网页的源代码
  11. #关闭单个浏览器窗口
  12. driver.close()
  13. #关闭所有的浏览器窗口,当浏览器就一个窗口的时候两个都是一样的
  14. driver.quit()

Selenium元素的定位

  1. #通过id属性来进行定位(规范的css中id是唯一的,尽量避免重复使用,重复使用推荐class)
  2. ret1=driver.find_element_by_id()
  3. #通过class类名来进行定位
  4. ret2=driver.find_element_by_class_name()
  5. #通过xpath表达式来进行定位
  6. ret3=driver.find_element_by_xpath()
  7. #通过css选择器来进行定位
  8. ret4=driver.find_element_by_css_selector()
  9. #通过精确定位来查找
  10. ret5=driver.find_elment_by_link_text()
  11. #通过模糊定位进行定位
  12. ret6=driver.find_elment_by_paitial_link_text()
  13. #通过tag标签名称进行定位
  14. ret7=driver.find_elment_by_tag_name()
  15. ret8=driver.find_elment()
  16. 以上定位的只是一个元素返回的直接是元素里面的内容,定位多个元素只需要把element变为elements和上面
  17. 不同的是elements获取元素返回的是一个列表

webdriver的等待

为什么要使用webdriver等待?因为浏览器加载一个页面的时候,页面中的元素会以不同的时间间隔加载,特别是动态网页,我们访问页面代码紧接就定位元素,可是页面还未加载成功就会造成定位不到或者定位比较困难的,所有我们需要等待一定的时间元素加载成功后我们在对元素进行定位这样就会轻松的定位到元素,如果不用,当你网络不行的时候就会报错

  • 强制等待:sleep()
    • 设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。
    • 语法:time.sleep(sec)
  • 隐式等待:implicitly_wait()
    • 由webdriver提供的方法,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成(浏览器加载页面不再转圈圈),才会执行下一个语句。如果超出了设置时间的则抛出异常。
  • 显式等待:WebDriverWait()
    • 需要通过from selenium.webdriver.support.wait import WebDriverWait导入模块,
    • 语法:WebDriverWait(driver,time)
    • 原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件(不用页面完全加载),等不到,就一直等,除非在规定的时间之内都没找到,那么久跳出Exception(简而言之,就是直到元素出现才去操作,如果超时则报异常)

      案例一:LOL数据的爬取

      爬取前的准备:
  1. 需求分析:就是想要通过python代码的形式来获取各个英雄的胜率数据,如有必要还可以写入外部表格进行数据分析我到底万那个英雄才能上王者
  2. 对应的浏览器驱动下载好了,作为浏览器与代码交互的”桥梁”,第三方的selenium库下好了
  3. 简单熟悉网页(LOL网站)查看源码我们需要的内容在哪里
  4. 用代码来实现我们找的数据并在本地显示 ```python

    导入相关的包

    from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait

print(“(1)全部段位 (2)最强王者 (3)傲世宗师 (4)璀璨钻石 (5)华贵铂金 (6)荣耀黄金 (7)不屈白银 (8)英勇黄铜 (9)坚韧黑铁”) rank = input(“请输入要查询段位的序号:”) print(“(1)最近30天 (2)最近7天 (3)最近1天”) time = input(“请输入查询的时间序号:”)

创建一个浏览器对象

driver = webdriver.Edge()

请求网页

driver.get(‘http://lol.qq.com/guides/rank.shtml?ADTAG=cooperation.glzx.web‘) driver.implicitly_wait(10)#隐式等待 浏览器渲染页面需要时间,智能化等待

WebDriverWait(20) # 显性等待等待网页加载完,也可以通过导入time来设置睡眠时间来完成,缺点:影响执行效率

driver.maximize_window()#最大化浏览器窗口页面

通过xpath寻找元素并进行模拟点击

driver.find_element_by_xpath(‘//[@id=”select_tier”]/a[%s]’ % (rank)).click()#段位按钮(对应上面的查询) driver.find_element_by_xpath(‘//[@id=”select_icycle”]/a[%s]’ % (time)).click()#天数按钮

获取包含所有英雄数据的”大盒子里面所有的tr”

rank_table = driver.find_elements_by_xpath(‘//*[@id=”heroRankingTable”]/tbody/tr’)

print(len(rank_table))

print(‘{:10}{:10}{:10}’.format(‘英雄’, ‘胜率’, ‘场次’)) for hero_num in range(1, len(rank_table)):

  1. # 循环遍历网页每一个英雄的数据
  2. #小技巧先复制一个元素的xpath路径修改里面的数字
  3. hero = driver.find_element_by_xpath('//*[@id="heroRankingTable"]/tbody/tr[%s]/td[2]/span' % (hero_num))
  4. hero=hero.text.strip()
  5. winrate = driver.find_element_by_xpath('//*[@id="heroRankingTable"]/tbody/tr[%s]/td[4]/div/a' % (hero_num))
  6. winrate = winrate.text.strip()
  7. chang_ci = driver.find_element_by_xpath('//*[@id="heroRankingTable"]/tbody/tr[%s]/td[5]/div/a' % (hero_num))
  8. chang_ci = chang_ci.text.strip()
  9. print('{:10}{:10}{:10}'.format(hero, winrate, chang_ci))
  1. <a name="pHxHC"></a>
  2. ## 案例二:网易云评论的爬取
  3. 爬取前的准备:
  4. 1. 需求分析:晚上12点打开网易云听歌就是想要通过python代码的形式来获取网易云歌曲的评论,结果一写代码发现不抑郁了
  5. 1. 对应的浏览器驱动下载好了,作为浏览器与代码交互的"桥梁",第三方的selenium库下好了
  6. 1. 简单熟悉网页[(网易云音乐)](https://music.163.com/#/)查看源码我们需要的内容在哪里
  7. 1. 用代码来实现我们找的数据并保存本地
  8. ```python
  9. from selenium import webdriver
  10. import re
  11. #创建一个浏览器对象
  12. driver=webdriver.Edge()
  13. driver.get('https://music.163.com/#/song?id=38592976')
  14. driver.implicitly_wait(10)
  15. driver.maximize_window()#最大化窗口
  16. driver.switch_to.frame(0)#进入嵌套网页
  17. #下拉页面
  18. # document.documentElement.scrollTop 指定页面的高度
  19. # document.documentElement.scrollHeight 获取页面的高度
  20. js='document.documentElement.scrollTop = document.documentElement.scrollHeight'
  21. driver.execute_script(js)#将滚动条拉到最下面
  22. #数据加载完毕
  23. a=1
  24. for click in range(50):
  25. divs = driver.find_elements_by_css_selector('.itm')#获取元素class为itm的元素,elements所以获取的是一个列表
  26. for div in divs:
  27. cnt=div.find_element_by_css_selector('.cnt.f-brk').text#获取文本信息
  28. cnt=cnt.replace('\n','')#将换行符替换为空
  29. cnt=re.findall(':(.*)',cnt)[0]
  30. print(cnt)
  31. with open('网易云评论.txt','a',encoding='utf-8') as f:
  32. f.write(cnt+'\n')
  33. a+=1
  34. driver.find_element_by_css_selector('.znxt').click()#点击下一页
  35. print("获取成功!")
  36. print('一共有:{}行'.format(a))

词云图

  1. # 导入包,ImageColorGenerator是一个根据背景图片来生成的
  2. from wordcloud import WordCloud, ImageColorGenerator
  3. # 导入numpy
  4. import numpy as np
  5. # 处理中文划分需要这一个包
  6. import jieba
  7. import PIL.Image as image
  8. text = open('网易云评论.txt', encoding='utf-8')
  9. text = text.read() # 读取这一个文件
  10. excludes = {'的','了','是','笑笑','吗','个','就','都','着'} # 先准备不要展示那些值一般是运行后在写者行代码
  11. mask = np.array(image.open('C:/Users/Supercoco/Desktop/boy.png')) # 打开图片,具体什么玩意我也不知道是什么
  12. # print("mask的type为:",type(mask))
  13. word_list = jieba.cut(text, cut_all=True) # 开始划分这一个文件,cut_all是全模式,False是精确模式
  14. word_list = " ".join(word_list) # 用空格来连接它
  15. # print(word_list)
  16. # 关键步骤来了!!!!!
  17. wordcloud = WordCloud(background_color="white", # 设置图片背景颜色
  18. font_path="simfang.ttf", # 指定字体文件的完整路径,如果不设置可能显示不了中文
  19. scale=8, # 数值越大图片就越清晰
  20. mask=mask, #
  21. max_words=100, # 显示的词
  22. stopwords=excludes # 跳过那些词
  23. ).generate(word_list)
  24. # 绘制文字的颜色以背景图颜色为参考
  25. image_color = ImageColorGenerator(mask)
  26. wordcloud.recolor(color_func=image_color) # 这肯定是修改颜色的
  27. wordcloud.to_file("网易云.jpg") # 保存文件
  28. image=wordcloud.to_image() #保存图片
  29. image.show() #展示图片

boy.png网易云.jpg