【问题标题】:How to scrape the invisible dynamic elements without selenium?如何在没有硒的情况下刮掉看不见的动态元素?
【发布时间】:2019-06-24 21:11:18
【问题描述】:

我正在nike.com 上进行模拟登录。登录内容是动态的,这意味着它在源代码中被设置为不可见:

<div class="mex-unite-container hidden">

  <div id="nike-unite-login-view" class="nike-unite" style="display:none"></div>

</div>

分析源码后,发现以下javascript源码可能与问题有关:

  if (mexUniteContainer && mexUniteContainer.classList.contains('hidden')) {
      mexUniteContainer.classList.remove('hidden');
    }

display:none 代码在执行 javascript 代码之前不会被查看。如何在不使用硒的情况下访问代码?任何帮助将不胜感激!

【问题讨论】:

  • 如果你的网址是公开的,你能分享一下吗?
  • @KunduK nike.com
  • 您尝试使用哪种浏览器?我看不到 chrome 或 Firefox 的任何弹出窗口?你能发布你的模态弹出窗口的快照吗?
  • @KunduK 点击右上角的加入/登录耐克。登录表单是一个弹出窗口,您无法在源代码中查看。

标签: python selenium web-scraping scrapy python-requests


【解决方案1】:

使用WebdriverWait 并按照xpath 访问登录表单。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver=webdriver.Chrome()
driver.get('https://www.nike.com/')
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'//div[@id="AccountNavigationContainer"]//button//span[contains(.,"Join / Log In To Nike⁠Plus Account")]'))).click()
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'//input[@placeholder="Email"]'))).send_keys('pajarnas')
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'//input[@placeholder="Password"]'))).send_keys('pajarnas')

【讨论】:

  • @pajarnas 指定 to 使用什么会更有帮助。
  • @jhpratt 请求?
  • @pajarnas 这只是给你页面,它不会解析任何东西。
  • 我更新了我的问题,希望更清楚!
  • 我认为 Splash 帮助我解决了这个问题。
【解决方案2】:

也许是网络机器人? webbot 甚至可以处理具有动态变化的 id 和类名的网页,并且具有比 selenium 或 mechanize 更多的方法和功能。

这是一个 sn-p :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('mymail@gmail.com' , into='Email')
web.click('NEXT' , tag='span')
web.type('mypassword' , into='Password' , id='passwordFieldId') # specific selection
web.click('NEXT' , tag='span') # you are logged in ^_^

或者,保持超级简单。

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

【讨论】:

  • 我试过了,但它仍然适用于硒!我更新了我的问题,我希望它会更清楚!
  • 我认为 Splash 帮助我解决了这个问题。
【解决方案3】:

SplashJS 适合我。 Splash 是一个 JavaScript 渲染服务。它是一个带有 HTTP API 的轻量级 Web 浏览器,使用 Twisted 和 QT5 在 Python 3 中实现。 (扭曲的)QT 反应器用于使服务完全异步,从而允许通过 QT 主循环利用 webkit 并发性。 Splash 的一些功能:

  • 并行处理多个网页;
  • 获取 HTML 结果和/或截屏;
  • 关闭图像或使用 Adblock Plus 规则以加快渲染速度;
  • 在页面上下文中执行自定义 JavaScript;
  • 编写Lua浏览脚本;
  • 在 Splash-Jupyter Notebooks 中开发 Splash Lua 脚本。

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多