python模拟浏览器爬虫之下拉弹窗
问题介绍:
待爬取的界面含有内嵌信息,需要点击后对弹窗信息进行采集(如下):
首先,需要登录目标网站,点击弹窗,该过程这里不介绍。
# coding=utf-8
from selenium import webdriver
from selenium.webdriver import ActionChains
import pyautogui
driver = webdriver.Chrome()
driver.get('')
方法(1):
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
这种方法是使用JS定位到页面的底部,然后将页面进行拉倒底部。
测试显示,这种方法在弹窗存在的情况下,依旧是下拉的主页面。对弹窗无效。
方法(2):
此方法使用pyautogui包操作鼠标实现
import pyautogui
width, height = pyautogui.size() # 测窗口的大小
pyautogui.moveTo(width/3, height/2, duration=0.25) # 将鼠标移动到指定位置(弹窗上)
pyautogui.scroll(-1000) # 下拉
此方法可以实现弹窗的下拉,但是此方法“确实将鼠标移动到了弹窗页面上”,而 selenium 实现的模拟操作是“模拟”。比如:selenium 实现点击操作,不会真的将鼠标移动到待点击的元素上,而只是模拟执行了点击的功能。
pyautogui 对鼠标进行移动操作,下拉弹窗,虽然可以实现加载弹窗尚未加载到的内容,但是我们的鼠标被程序一直控制着,无法做其他的事情。另一方面,无法实现多线程的程序的运行。当我们打开多个窗口同时采集时,鼠标移动到浏览器界面上,鼠标的下拉操作只对最前端的窗口有效,而对后面的几个窗口无效,况且可能当前的下拉动作是“后面的窗口”对应的程序执行的,导致“最前端页面”不该执行下拉动作反而被下拉了。
方法(3):
ActionChains (drivers).drag_and_drop()
定位元素内容,进行拖动。方法无效,不细述。
方法(4):
cycle_num = 10 # 根据实际情况定
while cycle_num:
num_before = driver.find_elements_by_class_name("pv3").__len__()
location_target = driver.find_elements_by_class_name("pv3")[num_before-1]
ActionChains(driver).move_to_element(location_target).perform()
cycle_num -= 1
num_after = driver.find_elements_by_class_name("pv3").__len__()
if num_after == num_before:
break
此种方法对我采集的目标网页有效,具体还要看自己的目标网页。
此处,首先检测弹窗已加载到的内容。因为每一条在网页中的存储是同级的,即他们都在同一个标签中,为同级子标签(这里我采集的子标签的元素均含有class name——“pv3”)。然后,运用 selenium 下的 ActionChains 将当前的页面显示内容移动到“已加载”处的元素的最后一条。循环执行,从而达到加载弹窗后续内容的目的。加载完成可通过弹窗内容元素不在增加为准。
还没有评论,来说两句吧...