WebScraper无法获取数据但浏览器可访问网站的问题求助
问题分析与解决办法
1. 核心问题排查
你遇到的情况大概率是两个原因叠加导致:
- 短时间内重复请求触发了网站的反爬机制,限制了你的IP访问
- 代码本身存在逻辑缺陷,递归调用完全失效
2. 代码逻辑缺陷修复
你的get_links函数不管传入什么page_url,始终固定请求首页地址,递归时传入的拳手详情页链接根本没被使用,导致程序一直在重复爬首页;且无终止条件的递归会加剧反爬触发概率。修复后的代码如下:
import os import time from urllib.request import urlopen, Request from bs4 import BeautifulSoup import re os.system('cls') base_url = 'https://boxrec.com' heavy = 'https://boxrec.com/en/ratings?r%5Brole%5D=box-pro&r%5Bsex%5D=M&r%5Bstatus%5D=a&r%5Bdivision%5D=Heavyweight&r%5Bcountry%5D=&r_go=' pages = set() def get_links(page_url): print(f"crawling: {page_url}") global pages # 处理相对链接,拼接完整URL full_url = page_url if page_url.startswith('http') else base_url + page_url try: # 模拟浏览器请求头 req = Request(full_url, headers={ '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', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Referer': base_url }) html = urlopen(req) # 检查请求是否成功 if html.getcode() != 200: print(f"请求失败,状态码: {html.getcode()}") return bs = BeautifulSoup(html.read(), 'html.parser') # 抓取目标链接 for link in bs.find_all('a', href=re.compile('^(/en/box-pro/)')): if 'href' in link.attrs: link_href = link.attrs['href'] if link_href not in pages: print(link_href) pages.add(link_href) # 添加请求延迟,避免触发反爬 time.sleep(1) get_links(link_href) except Exception as e: print(f"请求出错: {str(e)}") return get_links(heavy) print("crawling done.")
3. 反爬规避措施
- 控制请求频率:每次请求后添加1秒延迟(
time.sleep(1)),模拟人类浏览节奏 - 完善请求头:补充
Accept-Language、Referer等字段,让请求更接近真实浏览器 - 避免重复爬取:用
pages集合记录已爬链接,减少无效请求 - 排查拦截状态:如果仍无数据,可在请求后打印响应内容,确认是否返回验证码或封禁提示
内容的提问来源于stack exchange,提问作者Spirula
相关产品推荐
相关产品推荐

