【发布时间】: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