#selenium爬虫的核武器,终不终级还不敢说:
1.初识selenium:
模拟浏览器在现在的python库中有两个选择Mechanize与Selenium:然而Mechanize不支持JavaScript,Selenium是一套完整的Web应用程序测试系统。所以对于爬虫开发来说selenium就成了爬虫开发的核武器,可以有效的帮助我们(1.无脑的执行JavaScript渲染页面;2.规避反爬,对于ajax网页爬取有很大优势)。
Seleninm: 它能控制你的浏览器, 有模有样地学人类”看”网页。
2.基本语法:语法详情参考
上面的语法详情感觉总结的不错,在练习的过程可以参考一下,引用一下丰富一下我的博客,也增加一下友军的播放量,哈哈:
a.操作前我们需要明确一些东西:
#1.Selenium是一个用于测试网站的自动化测试 工具;
#2.要想操作还必须要有 驱动软件:webdriver:谷歌Chrome驱动文件:chromedrive;火狐Firefox驱动文件:geckodriver(驱动安装完记得配置环境变量,之前说过了,为的是任何位置都可以调用,别抬杠,在别人电脑确实不行),我当前使用的是火狐;
#3.爬取时非常有用的语法:
#打开浏览器,准备爬虫:
self.driver = webdriver.Firefox(executable_path=“D:\python\PF\geckodriver”) # 模拟打开火狐浏览器 # 通过URL获取网页信息:
self.driver.get(‘http://www.htqyy.com/top/hot’)
#获取网站源码,这就OK了,接下来正常数据清洗就行了:
html1 = self.driver.page_source
#模拟点击页面进行翻页,持续爬取:
self.driver.find_element_by_link_text(“下一页”).click()
看了上面的操作是不是感觉到他的强大了,部分反爬在他眼里应该只是毛毛雨了吧。
3.实例展示,轻音乐网站音乐爬取:selenium对于爬取Ajax 网页很有帮助:
#==================================================
#==================================================操作,爬取页面信息
from selenium import webdriver
from time import sleep
from lxml import etree
import pymysql
import requests
class qingyinyue:
def __init__(self):
#打开浏览器,准备爬虫
self.driver = webdriver.Firefox(executable_path="D:\python\PF\geckodriver") # 打开火狐浏览器
self.driver.get('http://www.htqyy.com/top/hot') # 通过URL获取网页信息
#数据临时存储,爬取网页数量设定
self.titles = []
self.artists = []
self.number = int(input("爬取的网页数量:"))
'''
初始化数据库:
连接数据库需要用到的参数,主机:host,端口:port,用户名:user,密码:password
指定数据库:db,指定字符集:charset
'''
# 创建数据库链接,给cursor添加一个参数,让其的到数据是一个字典
self.db = pymysql.connect(host='localhost',port=3306,user='root',password='f199506',db='test',charset='utf8')
self.cursor = self.db.cursor(cursor=pymysql.cursors.DictCursor)
def page(self):
for i in range(0,self.number):
html1 = self.driver.page_source
result = etree.HTML(html1)
# lxml进行数据筛选
self.titles1 = result.xpath('//span[@class="title"]//a/@title')
self.artists1 = result.xpath('//span[@class="artistName"]//a/@title')
self.id = result.xpath('//span[@class="title"]//a/@href')
#直接打印
# for a in range(0,len(self.titles1)):
# print(self.titles1[a]+"-->"+self.artists1[a]+"\n")
#为存储数据做准备
self.titles.extend(self.titles1)
self.artists.extend(self.artists1)
# yield self.titles
# yield self.artists
self.driver.find_element_by_link_text("下一页").click() #点击页面进行翻页
self.sql1()
return self.titles
def sql1(self):
for i in range(0,len( self.titles)):
self.sql = 'INSERT INTO qingyinyue(title,artist) VALUES("%s","%s")'
self.cursor.execute(self.sql%(self.titles[i],self.artists[i])) # 执行mysql语句
self.db.commit() # 提交事务
self.cursor.close()
self.db.close()
print(self.id)
def music(self):
for i in range(0, len(self.id)):
self.driver.get("http://www.htqyy.com"+self.id[i]) # 通过URL获取网页信息
self.source = self.driver.page_source
# lxml进行数据筛选
self.url = etree.HTML(self.source)
self.url = self.url.xpath('//div[@class="jp-jplayer"]//audio/@src')
sleep(1)
for a in range(0,len(self.url)):
data = requests.get(self.url[a]).content
# 保存到本地
with open("D:\\BaiduNetdiskDownload\\qingyinyue\\{}.mp3".format(self.titles[i]), "wb") as f:
f.write(data)
f.close()
print("正在下载第", a + 1, "首")
print(self.url)
if __name__ == '__main__':
yinyue = qingyinyue()
yinyue.page()
yinyue.music()
附件:
一些selenium的操作实例(自己敲敲会更好):
from selenium import webdriver
from time import sleep
#1.创建Firefox浏览器对象,这会在电脑上在打开一个浏览器窗口
browser = webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
#2.通过浏览器向服务器发送URL请求
browser.get("https://www.baidu.com/")
sleep(3)
#3.刷新浏览器
browser.refresh()
#4.设置浏览器的大小
browser.set_window_size(1400,800)
#5.设置链接内容
element=browser.find_element_by_link_text("新闻")
element.click()
==================================================
==================================================模拟鼠标操作
from selenium import webdriver
#1.引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
driver = webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
driver.get("https://www.baidu.com")
#2.定位到要悬停的元素
element= driver.find_element_by_id("s-usersetting-top")
#3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(element).perform()
#找到链接
elem1=driver.find_element_by_link_text("搜索设置")
elem1.click()
#通过元素选择器找到id=sh_2,并点击设置
elem2=driver.find_element_by_id("sh_1")
elem2.click()
#保存设置
elem3=driver.find_element_by_class_name("prefpanelgo")
elem3.click()
==================================================
==================================================操作搜索,模拟键盘
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
driver.get("https://www.baidu.com")
print('Before search================')
# 打印当前页面title
title = driver.title
print(title)
# 打印当前页面URL
now_url = driver.current_url
print(now_url)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
print('After search================')
# 再次打印当前页面title
title = driver.title
print(title)
# 打印当前页面URL
now_url = driver.current_url
print(now_url)
# 获取结果数目
user = driver.find_element_by_class_name('nums').text
print(user)
#关闭所有窗口
driver.quit()
==================================================
==================================================操作多信息查询,用作爬虫
from selenium import webdriver
from time import sleep
driver =webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
#1.定位一组元素
elements = driver.find_elements_by_xpath('//div/h3/a')
print(type(elements))
#2.循环遍历出每一条搜索结果的标题
for t in elements:
print(t.text)
element=driver.find_element_by_link_text(t.text)
element.click()
sleep(3)
driver.quit()
==================================================
==================================================操作多表单(不懂呢)
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.126.com")
driver.switch_to.frame('x-URS-iframe')
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()
==================================================
==================================================操作多窗口
from selenium import webdriver
import time
from time import sleep
driver = webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
# 1.获得百度搜索窗口句柄
sreach_windows = driver.current_window_handle
driver.find_element_by_link_text('登录').click()
sleep(3)
driver.find_element_by_link_text("立即注册").click()
sleep(3)
# 1.获得当前所有打开的窗口的句柄
all_handles = driver.window_handles
# 3.进入注册窗口
for handle in all_handles:
if handle != sreach_windows:
driver.switch_to.window(handle)
print('跳转到注册窗口')
driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys('sssf123456789a')
driver.find_element_by_id('TANGRAM__PSP_4__password').send_keys('123456789aaa_d')
time.sleep(2)
#driver.quit()
==================================================
==================================================操作故障信息及说明窗口(不好用)
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
# 鼠标悬停至“设置”链接
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()
# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
#在此处设置等待2s否则可能报错
time.sleep(2)
# 保存设置
driver.find_element_by_class_name("prefpanelgo").click()
time.sleep(2)
# 接受警告框
driver.switch_to.alert.accept()
driver.quit()
==================================================
==================================================操作,资源收集,不做处理,cookies
from selenium import webdriver
import time
browser = webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
browser.get("http://www.youdao.com")
# 1.打印cookie信息
print('=====================================')
print("打印cookie信息为:")
print(browser.get_cookies)
# 2.添加cookie信息
dict = {
'name': "name", 'value': 'Kaina'}
browser.add_cookie(dict)
print('=====================================')
print('添加cookie信息为:')
# 3.遍历打印cookie信息
for cookie in browser.get_cookies():
print('%s----%s\n' % (cookie['name'], cookie['value']))
# 4.删除一个cookie
browser.delete_cookie('name')
print('=====================================')
print('删除一个cookie')
for cookie in browser.get_cookies():
print('%s----%s\n' % (cookie['name'], cookie['value']))
print('=====================================')
print('删除所有cookie后:')
# 5.删除所有cookie,无需传递参数
browser.delete_all_cookies()
for cookie in browser.get_cookies():
print('%s----%s\n' % (cookie['name'], cookie['value']))
time.sleep(3)
browser.close()
==================================================
==================================================操作滚动条
from selenium import webdriver
from time import sleep
#1.访问百度
driver=webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
driver.get("http://www.baidu.com")
#2.搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
#3.休眠2s目的是获得服务器的响应内容,如果不使用休眠可能报错
sleep(2)
#4.通过javascript设置浏览器窗口的滚动条位置
js="window.scrollTo(100,450);"
driver.execute_script(js)
sleep(3)
driver.close()
==================================================
==================================================操作滚动条,高端操作
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
driver.set_window_size(400,400)
driver.get("https://www.baidu.com")
#2.搜索
# driver.find_element_by_id("kw").send_keys("selenium")
# driver.find_element_by_id("su").click()
#3.休眠2s目的是获得服务器的响应内容,如果不使用休眠可能报错
sleep(10)
#4 滚动左右滚动条---向右
js2 = "var q=document.documentElement.scrollLeft=10000"
driver.execute_script(js2)
sleep(15)
#5 滚动左右滚动条---向左
js3 = "var q=document.documentElement.scrollLeft=0"
driver.execute_script(js3)
sleep(15)
#6 拖动到滚动条底部---向下
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
sleep(15)
#7 拖动到滚动条底部---向上
js = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
sleep(15)
driver.close()
==================================================
==================================================操作,截取页面图片
from selenium import webdriver
from time import sleep
driver =webdriver.Firefox(executable_path ="D:\python\PF\geckodriver")
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
sleep(2)
#1.截取当前窗口,并指定截图图片的保存位置
driver.get_screenshot_as_file("D:\\baidu_img.jpg")
driver.quit()
以上就是我对selenium的一些理解与操作实例,在不断的学习中,我们可能不会有预想的那种感觉,觉得自己马上成为大牛;更多的感觉就是自己学的多了,眼界宽了,更加会感觉学无止境。另一个感觉就是,知识真的是会忘的,所以学习的过程记录下来,以老师的视角会理解的更好,这是自己的一些小想法。
昨天看了一个科普片,从人类,到地球,再到太阳系,在到宇宙,也许还有多重宇宙,我们身在其中真的很渺小,所以做到自己能开开心心就算很成功了,如果顺便能帮助到其他人,那岂不是更加美好。
第八篇分享,持续更新,,
,,,