#第8篇分享:python-爬虫selenium-开启数据收集新时代(4)

#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的一些理解与操作实例,在不断的学习中,我们可能不会有预想的那种感觉,觉得自己马上成为大牛;更多的感觉就是自己学的多了,眼界宽了,更加会感觉学无止境。另一个感觉就是,知识真的是会忘的,所以学习的过程记录下来,以老师的视角会理解的更好,这是自己的一些小想法。
昨天看了一个科普片,从人类,到地球,再到太阳系,在到宇宙,也许还有多重宇宙,我们身在其中真的很渺小,所以做到自己能开开心心就算很成功了,如果顺便能帮助到其他人,那岂不是更加美好。
第八篇分享,持续更新,,
,,,

猜你喜欢

转载自blog.csdn.net/weixin_46008828/article/details/108699524