构建新闻爬虫无法访问WSJ网站:已订阅仍遭403禁止访问求助
解决WSJ爬虫登录后403禁止访问的问题
以下是几个针对性的解决途径,帮你突破登录成功但主页被拦截的困境:
- 补充完整请求头,模拟真实浏览器
WSJ的反爬机制会校验请求头真实性,默认requests库的请求头特征明显,容易被识别。你需要添加常见的浏览器请求头字段,示例如下:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://id.wsj.com/auth/login' }
将这个headers参数加入所有get和post请求中:
login_page = session.get(login_url, headers=headers) login_response = session.post(login_url, data=payload, headers=headers) response = session.get(news_url, headers=headers)
校验登录会话的完整性
登录返回ok不代表会话已完全通过认证,你可以在登录后打印session.cookies,检查是否包含WSJ所需的认证Cookie(例如带有wsj标识的会话Cookie)。同时,登录表单可能存在你未添加的隐藏字段(比如redirectUri、rememberMe),需要从登录页面的HTML中提取所有表单参数,确保payload的完整性。改用浏览器自动化工具处理JS渲染
WSJ主页可能依赖JavaScript渲染内容,requests只能获取静态HTML,即使登录成功也可能触发反爬拦截。可以使用selenium或playwright模拟真实浏览器操作,它们会自动处理JS渲染和会话保持,示例代码(selenium):
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 from bs4 import BeautifulSoup driver = webdriver.Chrome() driver.get("https://id.wsj.com/auth/login") # 填写登录信息 driver.find_element(By.ID, "username").send_keys("你的用户名") driver.find_element(By.ID, "password").send_keys("你的密码") driver.find_element(By.ID, "submitButton").click() # 等待跳转至主页 WebDriverWait(driver, 10).until(EC.url_contains("wsj.com")) # 解析页面内容 soup = BeautifulSoup(driver.page_source, 'html.parser') headlines = soup.find_all('h3') for headline in headlines: print(headline.text.strip()) driver.quit()
排查IP封禁问题
如果频繁发起请求,你的IP可能被WSJ临时封禁。可以尝试切换代理IP,或者降低请求频率,模拟人类的访问节奏(比如每次请求间隔几秒)。确认订阅账号状态
先手动用浏览器登录WSJ官网,确认能正常查看付费内容,排除订阅权限过期、区域限制或账号异常等问题。
内容的提问来源于stack exchange,提问作者iMPr3S1vEEE
相关产品推荐
相关产品推荐

