关于爬虫:爬虫动态网页的弹窗数据文字图片

39次阅读

共计 2093 个字符,预计需要花费 6 分钟才能阅读完成。

问题

在进行网络数据采集(爬虫)时,可能会遇到这样的状况:需爬取的网站为动静网站。

举例来说,在网页界面,如果应用鼠标进行悬停、点击某处等操作,能够“唤出”额定的内容(如一个弹窗,其中蕴含文字和图片信息),此时这些额定内容的 HTML 源码从暗藏变为可见,但网页的 URL 却未扭转。

若想采集这些“暗藏的信息”,用于爬取动态网页的 requests 就力不从心了。此时能够应用 selenium 来模仿用户应用浏览器的操作,以获取“暗藏的信息”。

解决方案

1.1 文字信息

性能:点击网页中某处后呈现弹窗,获取弹窗中的文字信息

  1. 在网上下载 selenium 实用于 Firefox 浏览器的驱动文件 geckodriver.exe,并将其存储至 python 我的项目的门路中。
  2. 导入本例中所需的包和模块:

    • 注:对于 pyautogui,间接在 cmd 中输出“pip install pyautogui”可能会装置失败。能够在 pyautogui 的官网下载安装程序,再在 cmd 中调用安装程序进行装置。
    import pandas as pd
    from selenium import webdriver
    import os, time, random
    from selenium.webdriver.common.action_chains import ActionChains
    import pyautogui
  3. 利用 selenium 中的 webdriver 模块,关上 Firefox 浏览器并进入网页。此时会自动弹出一个浏览器界面,能够主动 / 手动进行操作。

    driver = webdriver.Firefox() # 驱动关上 Firefox 浏览器
    url = '请输出爬取网站的 URL'
    driver.get(url)  # 驱动进入网页
    time.sleep(3)  # 设置爬虫工夫距离:IP 爱护 
  4. warning:网页若须要输出验证码、登录账号,则需手动操作结束后,再运行后续代码。
  5. 利用 pandas 创立一个 dataframe,用来保留爬取到的信息。

    df = pd.DataFrame(columns=['']) # 请在 columns 参数后输出列名 
  6. 获取弹窗中的文字信息:

    # 请额定退出循环代码,以主动获取数据:xpath = '点击按钮的 xpath'
    xpath_info = '弹窗中显示的文字信息的 xpath'
    xpath_close = '弹出窗口敞开按钮的 xpath'
    
    try:
     driver.find_element_by_xpath(xpath).click()  # 驱动点击按钮
     text = driver.find_element_by_xpath(xpath_info).text  # 获取数据
     driver.find_element_by_xpath(xpath_close).click()  # 驱动敞开按钮
     time.sleep(random.random() * 3)  # IP 爱护
    except Exception as e:
     print(repr(e))
    
    driver.quit()  # 敞开所有浏览器窗口 
  7. 输入表格数据:

    df.to_excel('文件存储地位' + os.sep + '文件名.xlsx', index=False)  # 数据输入 

1.2 图片信息

性能:弹窗中存在图片信息,须要右键点击,并保留至本地

  1. 关上浏览器及网页,手动输出验证码、进行账号登录等操作同上。此处不再赘述。
  2. 右键点击图片,并保留至本地默认存储地位:

    • warning:请运行上面循环后,迅速将界面切换至驱动关上的 Firefox 浏览器界面(放弃浏览器界面为以后窗口)!否则图片无奈保留!
xpath = '图片的 xpath'
name = '图片名称'

# 请额定退出循环代码,以主动获取数据:try:
    context_click = driver.find_element_by_xpath(xpath)
    time.sleep(2)
    ActionChains(driver).context_click(context_click).perform()  # 实现点击鼠标右键
    time.sleep(1)
    pyautogui.typewrite(['v'])  # 敲击 V 进行保留
    time.sleep(1)
    pyautogui.typewrite(name)  # 重命名
    time.sleep(1)
    pyautogui.typewrite(['enter']) # 确定保留
    time.sleep(1)
    pyautogui.typewrite(['enter'])
    pyautogui.typewrite(['enter'])  # 电脑存在 bug,敲击一次 enter 有时无奈保留,因而连按 3 次
    time.sleep(random.random() * 3)  # IP 爱护
except Exception as e:
    print(repr(e))

探讨

  • 本文代码未波及到反爬虫问题。在爬取某些网站时,可能须要采取反爬虫措施。
  • 本文代码仅解决了“鼠标点击某处,呈现弹窗,需获取其中信息”的问题。依然存在其余的动静网页模式,如滚动产生新数据(信息流)等模式,可参考 selenium 的其余用法。

参考

  • Selenium Python 教程
  • Selenium 入门(主动右键保留图片到本机上)

注:转载请注明出处

正文完
 0