You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

解决Python爬取Poorly Drawn Lines漫画站时的requests.exceptions.ConnectionError及403 Forbidden问题

解决Python爬取Poorly Drawn Lines漫画站时的requests.exceptions.ConnectionError及403 Forbidden问题

看起来你碰到了Poorly Drawn Lines反爬机制的拦路虎了——要么403禁止访问,要么直接被断开连接,我来帮你拆解问题并给出可行的修复方案:

问题原因分析

  • 不带自定义UA时返回403:网站的反爬系统直接识别了requests库的默认用户代理,判定为爬虫并拦截。
  • 带UA仍出现连接断开:仅靠UA不足以模拟真实浏览器请求,网站还会校验请求头的完整性、会话状态甚至TLS握手细节,你的请求因为缺少必要的头信息或会话标识,被服务器主动切断连接。

修复方案

1. 补充完整的浏览器请求头

真实浏览器发送请求时会携带一系列头信息,我们需要把这些都补上,让请求更“像”人类用户的操作:

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': 'https://poorlydrawnlines.com/',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

注:UA可以用你当前真实使用的浏览器UA,比旧版本的UA更不容易被识别

2. 使用requests.Session维持会话+重试机制

Session会自动管理cookie和会话状态,模拟用户连续浏览的行为;再加重试机制,能应对临时的网络波动或服务器限流:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 初始化Session,维持会话状态
session = requests.Session()

# 配置重试策略:针对限流、服务器错误自动重试
retry_strategy = Retry(
    total=3,
    backoff_factor=1,  # 重试间隔递增(1s, 2s, 4s...)
    status_forcelist=[429, 500, 502, 503, 504]  # 需要重试的HTTP状态码
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount('https://', adapter)
session.mount('http://', adapter)

# 完整请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': 'https://poorlydrawnlines.com/',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

try:
    url = 'https://poorlydrawnlines.com/comic/hardly-essayists/'
    # 带超时设置,避免程序无限等待
    response = session.get(url, headers=headers, timeout=10)
    response.raise_for_status()  # 主动抛出HTTP错误(比如403、500)
    page_html = response.text
    print("页面请求成功!")
    # 后续解析漫画图片的逻辑可以写在这里
except requests.exceptions.RequestException as e:
    print(f"请求出错:{str(e)}")

3. Python 3.13专属:TLS版本适配(可选)

如果上述方案还是出现连接断开,可能是Python 3.13默认的TLS版本与网站服务器不兼容,你可以强制指定TLS 1.2版本:

import requests
from requests.adapters import HTTPAdapter
from urllib3.poolmanager import PoolManager
import ssl

class TLS12Adapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_version=ssl.PROTOCOL_TLSv1_2
        )

# 挂载自定义TLS适配器到Session
session = requests.Session()
session.mount('https://', TLS12Adapter())
# 后续的请求逻辑和之前一致

重要提醒

  • 务必查看网站的robots.txt文件,确认允许爬取的内容范围,遵守网站的爬取规则。
  • 控制爬取频率,不要短时间内发送大量请求,避免给网站服务器造成压力,防止被永久封禁IP。

先试试补充完整请求头加Session的方案,一般就能搞定你的问题啦~

火山引擎 最新活动