我是一个新的python和网页抓取,我正在尝试抓取一个使用JavaScript的网站。我已经设法通过Selenium自动化日志序列,但是当我试图发送API调用来获取数据时,我无法获得任何东西。我假设这是因为API调用需要某种身份验证。我如何才能通过这个问题呢?
下面是我的代码:
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
import pandas as pd
import requests
import json
username = 'xxx'
password = 'xxx'
url = 'https://www.example.com/login'
# log in
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get(url)
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(username)
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(password)
driver.find_element(By.XPATH, '//*[@id="login_button"]').click()
# go to User Lines
driver.get('http://www.example.com/lines')
time.sleep(5)
response = requests.request("GET", url, headers=headers, data=payload)
subs = json.loads(response.text)
print(subs)
1条答案
按热度按时间yrwegjxp1#
每次发出HTTP请求时,都会包含一些元数据。这是所有的标头数据和cookie,可能还有一些其他会话数据。每次都必须发送这些数据,因为这是维护“会话”的唯一方法
如果你在Selenium中登录,浏览器会在那里管理你的会话。用python requests库发出请求与Selenium无关,很可能你缺少的认证是在Selenium中登录时提供的。
因此,您有几种选择:
1.使用Selenium进行API调用登录后,只需get()API URL,页面源应为标记内的数据。
2.使用requests库登录除了使用Selenium,您还可以独占使用requests。这可能会很乏味;您将不得不使用devtools检查网络调用,并将需要使用请求复制的内容拼凑在一起,以模拟在浏览器上发生的相同登录。您还需要使用**请求来使用持久会话。会话()**创建一个会话示例.您可以使用该对象直接发出请求而不是请求库.但是一旦您这样做了,你可以直接发出API请求,这种方法的运行时间也最快,因为你不需要渲染整个浏览器并在其中运行javascript,也不需要在其中发出所有的网络请求。
3.将会话数据从Selenium传递到请求的会话示例我还没有尝试过这样做,但是由于会话数据只是在头中传递,并且只是字符串,因此您可能会找到一种方法,从Selenium获取cookie,并将它们添加到会话请求示例中,以便在没有Selenium的情况下进行API调用。