问题
在进行网络数据采集(爬虫)时,可能会遇到这样的状况:需爬取的网站为动静网站。
举例来说,在网页界面,如果应用鼠标进行悬停、点击某处等操作,能够“唤出”额定的内容(如一个弹窗,其中蕴含文字和图片信息),此时这些额定内容的 HTML 源码从暗藏变为可见,但网页的 URL 却未扭转。
若想采集这些“暗藏的信息”,用于爬取动态网页的 requests 就力不从心了。此时能够应用 selenium 来模仿用户应用浏览器的操作,以获取“暗藏的信息”。
解决方案
1.1 文字信息
性能:点击网页中某处后呈现弹窗,获取弹窗中的文字信息
- 在网上下载 selenium 实用于 Firefox 浏览器的驱动文件 geckodriver.exe,并将其存储至 python 我的项目的门路中。
-
导入本例中所需的包和模块:
- 注:对于 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
-
利用 selenium 中的 webdriver 模块,关上 Firefox 浏览器并进入网页。此时会自动弹出一个浏览器界面,能够主动 / 手动进行操作。
driver = webdriver.Firefox() # 驱动关上 Firefox 浏览器 url = '请输出爬取网站的 URL' driver.get(url) # 驱动进入网页 time.sleep(3) # 设置爬虫工夫距离:IP 爱护
- warning:网页若须要输出验证码、登录账号,则需手动操作结束后,再运行后续代码。
-
利用 pandas 创立一个 dataframe,用来保留爬取到的信息。
df = pd.DataFrame(columns=['']) # 请在 columns 参数后输出列名
-
获取弹窗中的文字信息:
# 请额定退出循环代码,以主动获取数据: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() # 敞开所有浏览器窗口
-
输入表格数据:
df.to_excel('文件存储地位' + os.sep + '文件名.xlsx', index=False) # 数据输入
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 入门(主动右键保留图片到本机上)
注:转载请注明出处