爬虫 让网页自动化---selenium

selenium:

selenium 是python的一个强大的库,可以用几行代码,控制浏览器,做出自动打开,输入,点击等操作,就像是有一个真正的用户在操作一样。

(1) 当遇到验证码很复杂的网站时,selenium允许让人去手动输入验证码,然后把剩下的操作交给机器。
(2)对于那些交互复杂,加密复杂的网站,selenium问题简化,爬动态网页如静态网页一样简单
(静态网页:HTML,网页源代码中就包含了所有信息,因此,网页地址栏的URL就是网页源代码的URL
动态网页:要爬取的数据不在HTML源代码中,而是在json中,不能直接使用地址栏的URL了,而需要找到json数据的真实URL,这种就是动态网页。)

不论数据存在哪里,浏览器总是会向服务器发起各式各样的请求,当这些请求完成后,他们会一起组成开发者工具的Elements中所展示的,渲染完成的网页源代码。

在这里插入图片描述

安装selenium库:

pip install selenium

selenium的脚本可以控制所有常见浏览器的操作,在使用之前,需要安装浏览器的驱动。

浏览器驱动下载安装教程:

Google浏览器驱动安装

设置浏览器引擎:

#本地Chrome浏览器设置方法
from selenium import webdriver#从selenium库中调用webdriver模块
driver=webdriver.Chrome()#设置引擎为Chrome,真实地打开一个chrome浏览器

在这里插入图片描述

获取数据:

import time
#本地浏览器的设置方法
from selenium import webdriver#从selenium库中调用webdriver模块
driver=webdriver.Chrome()#设置引擎为Chrome,真实地打开一个chrome浏览器

driver.get('url')#url为浏览器地址
time.sleep(1)
driver.sleep()#关闭浏览器

解析和提取数据:

BeautifulSoup解析网页源代码,然后提取其中的数据。

selenium库同样也具备解析数据,提取数据的能力。它和BeautifulSoup的底层原理一致

他们俩的不同之处:selenium所提取的是Elements中的所有数据,而BeautifulSoup所解析的则只是Network中第0个请求的响应。

用selenium把网页打开,所有信息就都加载到Elements那里,之后,就可以把动态网页用静态网页的方法爬取

label = driver.find_element_by_tag_name('label') # 解析网页并提取第一个<lable>标签中的文字

在这里插入图片描述

# 以下方法都可以从网页中提取出'你好,蜘蛛侠!'这段文字

find_element_by_tag_name:通过元素的名称选择
# 如<h1>你好,蜘蛛侠!</h1> 
# 可以使用find_element_by_tag_name('h1')

find_element_by_class_name:通过元素的class属性选择
# 如<h1 class="title">你好,蜘蛛侠!</h1>
# 可以使用find_element_by_class_name('title')

find_element_by_id:通过元素的id选择
# 如<h1 id="title">你好,蜘蛛侠!</h1> 
# 可以使用find_element_by_id('title')

find_element_by_name:通过元素的name属性选择
# 如<h1 name="hello">你好,蜘蛛侠!</h1> 
# 可以使用find_element_by_name('hello')

#以下两个方法可以提取出超链接

find_element_by_link_text:通过链接文本获取超链接
# 如<a href="spidermen.html">你好,蜘蛛侠!</a>
# 可以使用find_element_by_link_text('你好,蜘蛛侠!')

find_element_by_partial_link_text:通过链接的部分文本获取超链接
# 如<a href="https://localprod.pandateacher.com/python-manuscript/hello-spiderman/">你好,蜘蛛侠!</a>
# 可以使用find_element_by_partial_link_text('你好')

WebElement类对象与Tag对象类似,它也有一个方法,可以通过属性名提取属性的值,这个方法是.get_attribute()

在这里插入图片描述

driver.get('URL')
time.sleep(2)#等待两秒
label=driver.find_element_by_class_name('teacher')
#根据类名找到元素
print(type(label))
#打印类型
print(label.get_attribute('type'))
#获取type这个属性的值
driver.close()

find_element_by_与BeautifulSoup中的find类似,可以提取出网页中第一个符合要求的元素;既然BeautifulSoup有提取所有元素的方法find_all,selenium也同样有方法。

在这里插入图片描述

除了用selenium解析与提取数据,还有一种解决方案,那就是,使用selenium获取网页,然后交给BeautifulSoup解析和提取。

在这里插入图片描述
获取渲染之后的网页源码:

HTML源代码字符串 = driver.page_source 
import time
from selenium import webdriver
driver=webdriver.Chorme() #设置浏览器引擎

driver.get('url')
time.sleep(2)#等待两秒,等待浏览器缓冲数据

pageSource=driver.page_source #获取完整渲染的网页源代码
#这个地方只要获取到了源代码之后,就可以直接用BeautifulSoup的方法操作了。
driver.close()

在这里插入图片描述
自动操作浏览器:

.send_keys() # 模拟按键输入,自动填写表单,向浏览器输入值
.click() # 点击元素 ,点击提交

在这里插入图片描述

比如这个网页就有两个输入框,和一个提交按钮,就可以用.send_keys()和 .click()方法

相关代码:

#本地Chrome浏览器设置方法
from selenium import webdriver 
#从selenium库中调用webdriver模块
import time #调用time模块
driver=webdriver.Chrome() #设置浏览器引擎为Chrome,真实地打开Chrome浏览器

#获取数据
driver.get('url')#url为网页地址
time.sleep(2) #等待两秒,等待浏览器缓冲

teacher=driver.find_element_by_id('teacher')
#找到第一个输入框位置
teacher.send_keys('小西') 
#输入框中输入文字
assistant=driver.find_element_by_name('assistant')
#找到第二个输入框
assistant.send_keys('都喜欢')
#输入文字

button=driver.find_element_by_class_name('sub')
#找到【提交】按钮
button.click()#点击提交按钮
time.sleep(1)
driver.close() #关闭浏览器

在这里插入图片描述

获取 QQ 音乐热评信息第一种方法(selenium方法):

#coding=utf-8
#上一次我们爬取音乐热评时直接用requests.get('url')发现在
# 这个代码里面根本就没有热评信息,于是使用的network里面的xhr来
#查找的对应的链接和代码,就是先找到json数据,再对其进行格式转换
# 再进行对字典/列表的选取,获取到我们想要的东西
#网页源代码中没有我们想要的评论,而是存在了Json中,需要通过查看XHR,
# 找到每一页评论的Json数据真实URL,才能获取到数据。

#现在就不需要费尽心思去查找和破解URL了,通过selenium打开浏览器操作,
# 数据自动都会加载到elements中
#用selenium 对网页进行获取数据(源码操作),就会把所有信息都存储在selenium中

#设置本地chrome浏览器
# noinspection PyUnresolvedReferences
from selenium import webdriver
# noinspection PyUnresolvedReferences
import time
driver=webdriver.Chrome()
#页面访问
driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html')
#在获取到网页之后,解析与提取之前,要加上time.sleep(2),
# 因为网页的加载需要零点几秒的时间
time.sleep(2)

#点击加载更多功能,显示出更多的评论
button=driver.find_element_by_class_name('comment__show_all')
time.sleep(1)
button.click()
time.sleep(1)
comments=driver.find_element_by_class_name('js_hot_list').find_elements_by_class_name('js_cmt_li')
i=0
for comment in comments:
    i=i+1
    sweet=comment.find_element_by_class_name('js_hot_text')
    print('评论 %d:%s\n*************************\n'% (i,sweet.text))
driver.close()
#获取数据之后需要关闭浏览器
#以上是用selenium获取了我们需要的信息

获取 QQ 音乐热评信息第二种方法(selenium+BeautifulSoup 方法):

#先用selenium 获取完整的网页源代码,然后再使用BeautifulSoup解析和提取数据
from bs4 import BeautifulSoup
pageSource = driver.page_source # 获取Elements中渲染完成的网页源代码
soup = BeautifulSoup(pageSource,'html.parser')  # 使用bs解析网页
comments = soup.find('ul',class_='js_hot_list').find_all('li',class_='js_cmt_li') # 使用bs提取元素
print(len(comments)) # 打印comments的数量

for comment in comments: # 循环
    sweet = comment.find('p') # 提取评论
    print ('评论:%s\n ---\n'%sweet.text) # 打印评论
driver.close() # 关闭浏览器 # 关闭浏览器

两种本地浏览器设置方法:

第一种:

from selenium import webdriver
driver=webdriver.Chrome()

以上这种设置方法可以让你看到浏览器的操作过程。
在本地的操作环境中,你还可以把自己电脑中的Chrome浏览器
设置为静默模式,也就是说,让浏览器只是在后台运行,
并不在电脑中打开它的可视界面。
因为在做爬虫时,通常不需要打开浏览器,爬虫的目的是爬到数据,
而不是观看浏览器的操作过程,在这种情况下,就可以使用浏览器的静默模式

第二种:静默模式

# 本地Chrome浏览器的静默默模式设置:
from selenium import  webdriver #从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类

chrome_options = Options() # 实例化Option对象
chrome_options.add_argument('--headless') # 把Chrome浏览器设置为静默模式
driver = webdriver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行

首先调用了一个新的类——Options,然后通过它的方法和属性,
给浏览器输入了一个参数——headless。
最后把刚才所做的浏览器设置传给了Chrome浏览器。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值