selenium模块实现浏览器自动登录并获取数据

2020-05-12  本文已影响0人  javen_spring

selenium模块被传扬的神乎其神,究竟是神马浮云?

1 了解网页结构

2 selenium的存在感

在遇到页面交互复杂或是URL加密逻辑复杂的情况时,selenium就派上了用场,它可以真实地打开一个浏览器,等待所有数据都加载到Elements中之后,再把这个网页当做静态网页爬取就好了。
美中不足:由于要真实地运行本地浏览器,打开浏览器以及等待网渲染完成需要一些时间,selenium的工作不可避免地牺牲了速度和更多资源。

3 安装selenium模块及浏览器驱动

pip install selenium # Windows电脑安装selenium
pip3 install selenium # Mac电脑安装selenium

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 解析与提取数据

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('你好')
图片.png
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)
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操作元素的常用方法.png

8 真实案例

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")
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()
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,在后台默默运行

10 selenium的官方文档链接

1.selenium官方文档

  1. 中文参考文档
上一篇下一篇

猜你喜欢

热点阅读