爬虫时首页可访问但广告列表页受限,如何突破访问限制?
问题描述
尝试爬取某网站的列表数据时遇到以下问题:脚本无法访问列表页面,但首页可正常访问。已检查robots.txt,该URL路径无相关限制。
使用的Python代码如下:
import os import random import time import requests USER_AGENTS = [] with open('user-agents.txt', 'r') as file: USER_AGENTS = [line.strip() for line in file] headers = { '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', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': '1', 'User-Agent': random.choice(USER_AGENTS), 'Referer': 'https://www.google.com/search?q=autoplius', 'Origin': 'https://en.m.autoplius.lt', 'DNT': '1', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document' } def main(): base_url = "https://en.m.autoplius.lt/" not_accessible = "https://en.m.autoplius.lt/ads/used-cars?qt=" response = requests.get(not_accessible, headers=headers) if response.status_code != 200: print("Not today chap...") time.sleep(5) return False print("I got in!") return True while True: main()
提问:
- 是否可以通过优化请求头来访问该列表页?
- 还有哪些其他方法可以访问该网站的其他页面?
解决方案
一、优化请求头的可行方向
当前请求头存在多个可能触发反爬的冗余或不符合真实访问逻辑的字段,调整后大概率能解决问题:
- 精简冗余字段:移除
Origin(同域请求无需该字段)、DNT、Sec-Fetch-*系列字段,这类字段是浏览器自动生成的,脚本硬编码反而容易暴露爬虫身份。 - 修正Referer:将Referer改为网站首页
https://en.m.autoplius.lt/,符合用户从首页跳转列表页的真实路径,而非谷歌搜索链接。 - 简化Accept字段:使用主流浏览器的标准Accept值,比如
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,避免过于复杂的参数组合。 - 添加Cookie字段:手动访问列表页,复制浏览器中的Cookie值添加到请求头。很多网站通过Cookie验证会话合法性,首页能访问说明会话有效,带Cookie请求列表页成功率更高。
- 固定User-Agent测试:先使用一个真实的常用浏览器UA(如Chrome最新版)测试,避免频繁随机切换UA触发反爬识别。
调整后的示例请求头:
headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', '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', 'Referer': 'https://en.m.autoplius.lt/', 'Cookie': '替换为你手动访问时获取的Cookie值' }
二、其他访问方法
如果优化请求头无效,可尝试以下方案:
- 模拟真实浏览器:使用Selenium、Playwright等工具操控真实浏览器,完全模拟用户点击、滚动等行为,绕过大部分基于请求头的反爬机制。
- 保持会话一致性:用
requests.Session()替代单次get请求,先请求首页获取会话Cookie,再用同一个会话请求列表页,更贴近用户的真实访问流程。示例代码:def main(): session = requests.Session() # 先访问首页初始化会话 session.get("https://en.m.autoplius.lt/", headers=headers) # 用同一会话请求列表页 response = session.get("https://en.m.autoplius.lt/ads/used-cars?qt=", headers=headers) if response.status_code != 200: print("Not today chap...") time.sleep(random.uniform(2,5)) return False print("I got in!") return True - 控制请求频率:在请求间添加2-5秒的随机延迟,避免高频请求触发反爬;同时取消无限循环,设置重试次数上限,防止IP被永久封禁。
- 使用代理IP:如果当前IP被网站封禁,可切换代理IP,每次请求使用不同IP地址,避免被识别为单一爬虫来源。
内容的提问来源于stack exchange,提问作者dovexz12323
相关产品推荐
相关产品推荐

