selenium模块实现浏览器自动登录并获取数据
2020-05-12 本文已影响0人
javen_spring
selenium模块被传扬的神乎其神,究竟是神马浮云?
1 了解网页结构
- 动态网页
一些复杂的网页,要爬取的数据不在HTML源代码中,而是在json中,你就不能直接使用网址栏的URL了,而需要找到json数据的真实URL。这就是一种动态网页。 - 静态网页
用html写出的网页,就是静态网页。我们使用BeautifulSoup爬取这类型网页,因为网页源代码中就包含着网页的所有信息,因此,网页地址栏的URL就是网页源代码的URL。 - 一点需了解的地方:
不论数据存在哪里,浏览器总是在向服务器发起各式各样的请求,当这些请求完成后,它们会一起组成开发者工具的Elements中所展示的,渲染完成的网页源代码。
2 selenium的存在感
在遇到页面交互复杂或是URL加密逻辑复杂的情况时,selenium就派上了用场,它可以真实地打开一个浏览器,等待所有数据都加载到Elements中之后,再把这个网页当做静态网页爬取就好了。
美中不足:由于要真实地运行本地浏览器,打开浏览器以及等待网渲染完成需要一些时间,selenium的工作不可避免地牺牲了速度和更多资源。
3 安装selenium模块及浏览器驱动
- 安装模块: Windows电脑打开cmd命令提示符窗口安装
pip install selenium # Windows电脑安装selenium
pip3 install selenium # Mac电脑安装selenium
- 安装浏览器驱动:这里以谷歌浏览器教程为例:https://localprod.pandateacher.com/python-manuscript/crawler-html/chromedriver/ChromeDriver.html
(找到对应浏览器版本的驱动,win32也适合win64的用户。)
4 设置浏览器引擎
# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器
5 打开特定网页
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 打开指定网页
time.sleep(1)
driver.close() # 关闭浏览器
6 解析与提取数据
- selenium库和BeautifulSoup相似,同样也具备解析数据、提取数据的能力。它们的底层原理一致,但在一些细节和语法上有所出入。
- 不同之处:selenium所解析提取的,是Elements中的所有数据,而BeautifulSoup所解析的则只是Network中第0个请求(通常是静态html)的响应。
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(2) # 等待2秒
label = driver.find_element_by_tag_name('label') # 解析网页并提取第一个<label>标签
print(label.text) # 打印label的文本
driver.close() # 关闭浏览器
selenium 提取数据的方法.png
find_element_by_tag_name:通过元素的标签名称选择
# 可以使用find_element_by_tag_name('h1')
find_element_by_class_name:通过元素的标签class属性选择
# 可以使用find_element_by_class_name('title')
find_element_by_id:通过元素的标签id选择
# 可以使用find_element_by_id('title')
find_element_by_name:通过元素的name属性选择
# 可以使用find_element_by_name('hello')
#以下两个方法可以提取出超链接
find_element_by_link_text:通过链接后的文本获取超链接(非链接本身)
# 可以使用find_element_by_link_text('你好')
find_element_by_partial_link_text:通过链接后的部分文本获取超链接(非链接本身)
# 可以使用find_element_by_partial_link_text('你好')
- 提取出的数据为WebElement类对象,与Tag对象类似,它也有一个方法,可以通过属性名提取属性的值,这个方法是.get_attribute():
- 提取多个元素文本或属性的方法:
driver.get("https://localprod.pandateacher.com/python-manuscript/hello-spiderman/")
time.sleep(2)
labels=driver.find_elements_by_tag_name("label") #返回多个元素组成的列表,方法为将element改为elements
for i in labels:
print(i.text)
- selenium与BeautifulSoup的情谊
1 我们可以使用selenium获取网页,然后交给BeautifulSoup解析和提取。
2 BeautifulSoup需要把字符串格式的网页源代码解析为BeautifulSoup对象,然后再从中提取数据。而selenium刚好可以获取到渲染完整的网页源代码,使用driver的一个方法:page_source。代码实现为:
HTML源代码字符串 = driver.page_source
7 自动操作浏览器
- 两个新方法:
.send_keys() # 模拟按键输入,自动填写表单
.click() # 点击元素
- 实例操作
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
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() # 关闭浏览器
- selenium操作元素的常用方法
8 真实案例
- 1 使用requests模块请求网页数据,用json模块解析及提取数据
import requests, json, csv, os
os.chdir('F:\\python')
url="your url"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"}
res=requests.get(url,headers=headers)
print(res.status_code)
lyric_list=res.json()
total_list=[]
for i in range(15):
total_list.append(lyric_list['hot_comment']['commentlist'][i]['rootcommentcontent'].strip())
with open("lyrics_512.csv","w",encoding="utf-8") as file:
for j in range(15):
file.writelines(total_list[j]+"\n")
- 2 selenium模块自动加载并获取、解析数据
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("your url")
time.sleep(2)
loadmore= driver.find_element_by_class_name("comment__show_all_link")
loadmore.click()
time.sleep(2)
contents= driver.find_element_by_class_name("js_hot_list").find_elements_by_class_name("js_hot_text")
total_list=[]
for j in contents:
total_list.append(j.text.strip())
print('-----精彩评论30条-------')
for i in range(30):
print("------第"+str(i+1)+"条-------")
print(total_list[i])
time.sleep(2)
driver.close()
- 3 selenium模块自动加载并获取数据,使用BeautifulSoup模块解析数据
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('your url') # 访问页面
time.sleep(2)
button = driver.find_element_by_class_name('js_get_more_hot') # 根据类名找到【点击加载更多】
button.click() # 点击
time.sleep(2) # 等待两秒
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() # 关闭浏览器
9 静默浏览器设置
通常情况下,爬虫爬取数据时不需要在显示屏上打开浏览器界面(可视模式),这时可设置浏览器静默模式。
# 本地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,在后台默默运行