使用BeautifulSoup爬取https://www.cora.fr时遭遇Incapsula反爬拦截,如何获取页面实际内容?
解决Incapsula反爬拦截问题
你看到的这个页面是Incapsula反爬防护机制的拦截响应——网站检测到你的请求来自非浏览器的自动化工具,所以返回了这个带iframe的验证页面,而非实际内容。下面是几个可行的解决方向:
1. 给请求添加浏览器标识(Headers)
你的urllib.request请求没有携带任何浏览器相关的头信息,很容易被反爬机制识别。改用更易用的requests库,并添加模拟真实浏览器的User-Agent(及其他必要头):
import requests from bs4 import BeautifulSoup url = "https://www.cora.fr" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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" } response = requests.get(url, headers=headers) html_soup = BeautifulSoup(response.text, 'html.parser') print(html_soup.prettify())
2. 使用自动化浏览器工具(Selenium/Playwright)
Incapsula会执行JavaScript验证,静态HTTP请求可能绕不过去。用Selenium模拟真实浏览器的操作行为,让网站认为是用户在访问:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import time options = Options() options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") # 可选:开启无头模式,不弹出浏览器窗口 # options.add_argument("--headless=new") driver = webdriver.Chrome(options=options) driver.get("https://www.cora.fr") # 等待页面加载完成(可根据元素添加更精准的显式等待) time.sleep(3) page_html = driver.page_source html_soup = BeautifulSoup(page_html, 'html.parser') print(html_soup.prettify()) driver.quit()
Playwright的自动等待机制更友好,你也可以尝试用它实现类似逻辑。
3. 保持会话并处理Cookie
部分反爬机制会在首次请求时设置验证Cookie,后续请求需要携带这些Cookie才能正常访问。用requests.Session()来维持会话状态:
import requests from bs4 import BeautifulSoup url = "https://www.cora.fr" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } session = requests.Session() # 先发起一次请求获取验证Cookie session.get(url, headers=headers) # 再用同一个会话请求实际内容 response = session.get(url, headers=headers) html_soup = BeautifulSoup(response.text, 'html.parser') print(html_soup.prettify())
4. 控制爬取频率
即使绕开了初始拦截,频繁请求也会触发网站的封禁机制。记得在请求之间添加延时:
import time # 两次请求间隔2秒,可根据网站调整 time.sleep(2)
最后提醒:爬取网站前一定要查看网站的robots.txt,确保你的爬取行为符合网站规则,避免法律风险。
内容的提问来源于stack exchange,提问作者Ghofran Challouf
相关产品推荐
相关产品推荐

