python模拟浏览器爬虫之下拉弹窗

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27378621/article/details/85161724

问题介绍:

待爬取的界面含有内嵌信息,需要点击后对弹窗信息进行采集(如下):

首先,需要登录目标网站,点击弹窗,该过程这里不介绍。

# 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 将当前的页面显示内容移动到“已加载”处的元素的最后一条。循环执行,从而达到加载弹窗后续内容的目的。加载完成可通过弹窗内容元素不在增加为准。

猜你喜欢

转载自blog.csdn.net/qq_27378621/article/details/85161724