使用Requests登录网站后爬取数据,表格单元格仍锁定,求排查问题
网页爬取登录后仍无法获取解锁表格的问题分析
我在网页爬取前用以下代码完成登录操作:
import requests from bs4 import BeautifulSoup login_url = 'https://www.footballoutsiders.com/user/login' data = { 'username': 'username', 'password': 'password' } with requests.Session() as s: response = s.post(login_url , data) print(response.text)之后执行以下代码尝试查看目标表格,但表格单元格仍处于锁定状态:
index_page= s.get('https://www.footballoutsiders.com/stats/nfl/historical-lookup-by-week/2020/1/overall') soup = BeautifulSoup(index_page.text, 'lxml') table1 = soup.find('table') table1请问我哪里操作出错了?
可能的错误点及解决方法
- 登录请求参数不全:很多网站登录时除了用户名和密码,还需要额外的参数,比如
csrf_token(防跨站请求伪造令牌)。你得先访问登录页面,解析页面里的隐藏输入字段,把这些字段也加入到data字典中。
示例代码:with requests.Session() as s: # 先获取登录页面,提取csrf_token login_page = s.get(login_url) soup_login = BeautifulSoup(login_page.text, 'lxml') csrf_token = soup_login.find('input', {'name': 'csrf_token'})['value'] # 更新登录数据 data = { 'username': 'your_username', 'password': 'your_password', 'csrf_token': csrf_token } # 发送登录请求 response = s.post(login_url, data=data) - 登录请求的头信息不完整:有些网站会校验请求的
User-Agent,模拟浏览器的请求头能降低被拦截的概率。你可以在请求中添加headers:headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 发送登录请求时带上headers response = s.post(login_url, data=data, headers=headers) - 表格是JavaScript动态加载的:如果表格内容是通过JS动态渲染的,BeautifulSoup只能抓取静态HTML,看不到解锁后的内容。这种情况得用
selenium或者playwright这类工具模拟浏览器加载页面,等JS执行完再提取表格。
示例(用selenium):from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() # 执行登录操作 driver.get(login_url) driver.find_element(By.NAME, 'username').send_keys('your_username') driver.find_element(By.NAME, 'password').send_keys('your_password') driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click() # 访问目标页面并等待加载 driver.get('https://www.footballoutsiders.com/stats/nfl/historical-lookup-by-week/2020/1/overall') time.sleep(2) # 可根据实际加载时间调整 # 提取表格内容 table1 = driver.find_element(By.TAG_NAME, 'table') print(table1.get_attribute('outerHTML')) driver.quit() - 登录请求未真正成功:先检查登录后的response状态码(正常成功是200),再看返回的内容里有没有登录成功的标识(比如显示你的用户名)。如果登录本身就失败了,后续请求自然拿不到解锁的表格。
内容的提问来源于stack exchange,提问作者Abb
相关产品推荐
相关产品推荐

