美文网首页
selenium模块实现浏览器自动登录并获取数据

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

作者: javen_spring | 来源:发表于2020-05-12 15:00 被阅读0次

    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
    

    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():
    图片.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)
    
    • 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操作元素的常用方法
    selenium操作元素的常用方法.png

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

    10 selenium的官方文档链接

    1.selenium官方文档

    1. 中文参考文档

    相关文章

      网友评论

          本文标题:selenium模块实现浏览器自动登录并获取数据

          本文链接:https://www.haomeiwen.com/subject/cudvnhtx.html