1.Selenium是什么?
selenium是一种web自动化测试工具,可以模拟浏览器的行为(点击,输入….)支持各种浏览器,主流界面式的浏览器如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。
ps:自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。总归根到底:将人为操作的测试行为转化为机器执行的过程。
2.Selenium使用准备
- 使用Selenium需要安装一个插件
下载网站提供:
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)
selenium.common.exceptions.WebDriverException: Message: 'MicrosoftWebDriver.exe' executable needs to be in PATH.#解决方法:把下载好的msedgeWebDriver.exe改名为MirsoftWebDriver.exe
3.Selenium使用
#导入webdriver模块from selenium import webdriverif __name__ == '__main__':#第一行肯定是先生成一个浏览器对象,生成一个代理服务driver =webdriver.Edge()#webdriver.Edge("插件的安装地址")driver.get('https://www.baidu.com/')driver.find_element_by_xpath('//*[@id="kw"]').send_keys('李白')driver.find_element_by_xpath('//*[@id="su"]').click()print(driver.page_source)#获取网页的源代码#关闭单个浏览器窗口driver.close()#关闭所有的浏览器窗口,当浏览器就一个窗口的时候两个都是一样的driver.quit()
Selenium元素的定位
#通过id属性来进行定位(规范的css中id是唯一的,尽量避免重复使用,重复使用推荐class)ret1=driver.find_element_by_id()#通过class类名来进行定位ret2=driver.find_element_by_class_name()#通过xpath表达式来进行定位ret3=driver.find_element_by_xpath()#通过css选择器来进行定位ret4=driver.find_element_by_css_selector()#通过精确定位来查找ret5=driver.find_elment_by_link_text()#通过模糊定位进行定位ret6=driver.find_elment_by_paitial_link_text()#通过tag标签名称进行定位ret7=driver.find_elment_by_tag_name()ret8=driver.find_elment()以上定位的只是一个元素返回的直接是元素里面的内容,定位多个元素只需要把element变为elements和上面不同的是elements获取元素返回的是一个列表
webdriver的等待
为什么要使用webdriver等待?因为浏览器加载一个页面的时候,页面中的元素会以不同的时间间隔加载,特别是动态网页,我们访问页面代码紧接就定位元素,可是页面还未加载成功就会造成定位不到或者定位比较困难的,所有我们需要等待一定的时间元素加载成功后我们在对元素进行定位这样就会轻松的定位到元素,如果不用,当你网络不行的时候就会报错
- 强制等待:sleep()
- 设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。
- 语法:time.sleep(sec)
- 隐式等待:implicitly_wait()
- 由webdriver提供的方法,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成(浏览器加载页面不再转圈圈),才会执行下一个语句。如果超出了设置时间的则抛出异常。
- 显式等待:WebDriverWait()
- 需求分析:就是想要通过python代码的形式来获取各个英雄的胜率数据,如有必要还可以写入外部表格进行数据分析我到底万那个英雄才能上王者
- 对应的浏览器驱动下载好了,作为浏览器与代码交互的”桥梁”,第三方的selenium库下好了
- 简单熟悉网页(LOL网站)查看源码我们需要的内容在哪里
- 用代码来实现我们找的数据并在本地显示
```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)):
# 循环遍历网页每一个英雄的数据#小技巧先复制一个元素的xpath路径修改里面的数字hero = driver.find_element_by_xpath('//*[@id="heroRankingTable"]/tbody/tr[%s]/td[2]/span' % (hero_num))hero=hero.text.strip()winrate = driver.find_element_by_xpath('//*[@id="heroRankingTable"]/tbody/tr[%s]/td[4]/div/a' % (hero_num))winrate = winrate.text.strip()chang_ci = driver.find_element_by_xpath('//*[@id="heroRankingTable"]/tbody/tr[%s]/td[5]/div/a' % (hero_num))chang_ci = chang_ci.text.strip()print('{:10}{:10}{:10}'.format(hero, winrate, chang_ci))
<a name="pHxHC"></a>## 案例二:网易云评论的爬取爬取前的准备:1. 需求分析:晚上12点打开网易云听歌就是想要通过python代码的形式来获取网易云歌曲的评论,结果一写代码发现不抑郁了1. 对应的浏览器驱动下载好了,作为浏览器与代码交互的"桥梁",第三方的selenium库下好了1. 简单熟悉网页[(网易云音乐)](https://music.163.com/#/)查看源码我们需要的内容在哪里1. 用代码来实现我们找的数据并保存本地```pythonfrom selenium import webdriverimport re#创建一个浏览器对象driver=webdriver.Edge()driver.get('https://music.163.com/#/song?id=38592976')driver.implicitly_wait(10)driver.maximize_window()#最大化窗口driver.switch_to.frame(0)#进入嵌套网页#下拉页面# document.documentElement.scrollTop 指定页面的高度# document.documentElement.scrollHeight 获取页面的高度js='document.documentElement.scrollTop = document.documentElement.scrollHeight'driver.execute_script(js)#将滚动条拉到最下面#数据加载完毕a=1for click in range(50):divs = driver.find_elements_by_css_selector('.itm')#获取元素class为itm的元素,elements所以获取的是一个列表for div in divs:cnt=div.find_element_by_css_selector('.cnt.f-brk').text#获取文本信息cnt=cnt.replace('\n','')#将换行符替换为空cnt=re.findall(':(.*)',cnt)[0]print(cnt)with open('网易云评论.txt','a',encoding='utf-8') as f:f.write(cnt+'\n')a+=1driver.find_element_by_css_selector('.znxt').click()#点击下一页print("获取成功!")print('一共有:{}行'.format(a))
词云图
# 导入包,ImageColorGenerator是一个根据背景图片来生成的from wordcloud import WordCloud, ImageColorGenerator# 导入numpyimport numpy as np# 处理中文划分需要这一个包import jiebaimport PIL.Image as imagetext = open('网易云评论.txt', encoding='utf-8')text = text.read() # 读取这一个文件excludes = {'的','了','是','笑笑','吗','个','就','都','着'} # 先准备不要展示那些值一般是运行后在写者行代码mask = np.array(image.open('C:/Users/Supercoco/Desktop/boy.png')) # 打开图片,具体什么玩意我也不知道是什么# print("mask的type为:",type(mask))word_list = jieba.cut(text, cut_all=True) # 开始划分这一个文件,cut_all是全模式,False是精确模式word_list = " ".join(word_list) # 用空格来连接它# print(word_list)# 关键步骤来了!!!!!wordcloud = WordCloud(background_color="white", # 设置图片背景颜色font_path="simfang.ttf", # 指定字体文件的完整路径,如果不设置可能显示不了中文scale=8, # 数值越大图片就越清晰mask=mask, #max_words=100, # 显示的词stopwords=excludes # 跳过那些词).generate(word_list)# 绘制文字的颜色以背景图颜色为参考image_color = ImageColorGenerator(mask)wordcloud.recolor(color_func=image_color) # 这肯定是修改颜色的wordcloud.to_file("网易云.jpg") # 保存文件image=wordcloud.to_image() #保存图片image.show() #展示图片


