解决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的方案,一般就能搞定你的问题啦~




