Colab中requests.get(url)返回空内容,遭网站防火墙拦截求助
问题:Colab中使用requests爬取dcinside网站遭防火墙拦截
- 本地Jupyter环境爬取其他网站及该目标站均正常,但Colab访问目标URL时,虽返回200状态码,但response无有效内容,被Web防火墙拦截
- 已尝试更换User-Agent、切换HTTP/HTTPS,均未解决问题
- 目标URL:
https://gall.dcinside.com/board/view/?id=piano&no=1&exception_mode=notice&page=1 - 拦截提示(翻译后):
违反Web防火墙安全策略的请求/响应已被拦截。
检测时间 2024-03-12 21:52:05 检测到的客户端IP 35.236.245.49 检测到的URL https://gall.dcinside.com/board/view/
解决方案
1. 清理请求中的冗余参数
你的GET请求里错误携带了data={'buscar':100000},GET请求不应使用data参数,这会被编码到URL中,大概率触发防火墙规则。直接移除该参数:
import requests from bs4 import BeautifulSoup as bs url = 'https://gall.dcinside.com/board/view/?id=piano&no=1&exception_mode=notice&page=1' headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Whale/3.25.232.19 Safari/537.36'} response = requests.get(url, headers=headers) # 移除多余的data参数 soup = bs(response.content, "html.parser") print(soup)
2. 补全浏览器请求头信息
仅靠User-Agent不足以模拟真实浏览器,添加更多常见请求头字段,降低被识别为爬虫的概率:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://gall.dcinside.com/board/lists/?id=piano', # 模拟从列表页跳转的真实访问路径 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' }
3. 更换代理IP(适配Colab环境)
Colab的云服务器IP段大概率被dcinside防火墙标记为可疑,使用代理IP隐藏真实地址,优先选择韩国地区代理(目标站为韩国网站):
proxies = { 'http': 'http://your-korea-proxy-ip:port', 'https': 'https://your-korea-proxy-ip:port' } response = requests.get(url, headers=headers, proxies=proxies)
4. 用Session维持会话状态
模拟浏览器的会话机制,先访问网站列表页建立会话,再请求目标详情页,更贴近真实用户行为:
session = requests.Session() # 先访问列表页初始化会话 session.get('https://gall.dcinside.com/board/lists/?id=piano', headers=headers) # 再请求目标页面 response = session.get(url, headers=headers) soup = bs(response.content, "html.parser")
5. 切换到Selenium模拟真实浏览器
如果以上方法均无效,用Selenium完全模拟浏览器渲染行为,绕过基于请求特征的防火墙拦截。Colab中需先安装依赖:
!pip install selenium !apt-get update !apt-get install chromium-chromedriver
然后运行爬取代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup as bs chrome_options = Options() chrome_options.add_argument('--headless') # 无头模式适配Colab无界面环境 chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36') driver = webdriver.Chrome(options=chrome_options) driver.get(url) soup = bs(driver.page_source, "html.parser") print(soup) driver.quit()
内容的提问来源于stack exchange,提问作者GMS
相关产品推荐
相关产品推荐

