【问题标题】:How to get Python to scrape web page generated by JavaScript files如何让 Python 抓取 JavaScript 文件生成的网页
【发布时间】:2022-01-15 06:49:28
【问题描述】:

我有一个网站,我想在其上自动执行一些操作,但该页面是由 2 个 JavaScript 文件生成的,并且在 html 中是这样定义的:

<script src="/build/runtime.js"></script><script src="/build/app.js"></script>

runtime.js 大约 70 行,app.js 大约 40k 行...我不知道如何阅读代码,因为我不知道任何 JavaScript,而且我的 Pyton 知识只是一个原子;)

我会共享特定网站,但该页面需要登录。因此,我设法使用 2 种不同的方法进入该页面,但找不到在 JS 生成的下一页中按下按钮的方法。

方法 1 - Requests & BeautifulSoup 但卡在 JS 位所以切换到方法 2。

import requests
from bs4 import BeautifulSoup

# Site & creds
LOGIN_URL = 'https://website.com/login'
USERNAME = 'user'
PASSWORD = 'pass'

# Pretend to be browser
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
# Start session
session = requests.session()
# Get login page
response = session.get(LOGIN_URL, headers=headers, verify=False)
# Get csrf token
soup = BeautifulSoup(response.content, 'html.parser')
csrf_token = (soup.find(id="login_form__token")["value"])
# Set creds with csfr token
payload = {
    'login_form[username]': USERNAME,
    'login_form[password]': PASSWORD,
    'login_form[login]': '',
    'login_form[_token]': csrf_token
}
# Login & do something else with cookies I don't understand
response = session.post(LOGIN_URL, data=payload, verify=False)
response = session.get('https://website.com/pageIWant', verify=False)

soup = BeautifulSoup(response.content, 'html.parser')
print(soup.prettify())

方法 2 - Selenium & ChromeDriver

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")
options.add_argument('--disable-gpu')
options.add_argument('--disable-software-rasterizer')

driver = webdriver.Chrome(options=options, executable_path='chromedriver.exe')
driver.get("https://website.com/login")

driver.find_element_by_id("login_form_username").send_keys('user')
driver.find_element_by_id("login_form_password").send_keys('pass')
driver.find_element_by_id("login_form_login").click()

driver.get("https://website.com/pageIWant")

html = driver.page_source
print(html)

所以我认为方法 2 会使事情变得更容易,但几乎卡在了同一点上。我想要生成的页面包含我需要按下才能访问下游页面的按钮。阅读了很多关于访问元素的内容,但在这 40k 的 JS 乱码中看不到任何东西。从哪里开始比较好?

【问题讨论】:

    标签: javascript python beautifulsoup python-requests selenium-chromedriver


    【解决方案1】:

    “从哪里开始比较好?”

    无论页面是如何生成的(HTML 或 JS),最终您必须在 Selenium 中处理的是页面的实时 DOM。所以“从哪里开始”是在浏览器开发工具中检查页面的 DOM,并从 DOM 中找出如何在 Selenium 中找到按钮元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 2014-08-08
      • 2012-09-19
      • 2015-04-14
      相关资源
      最近更新 更多