使用Requests模块时重复请求首个URL的问题排查求助
问题排查与解决方案
问题根源
首个页面被重复请求的问题,核心原因是np.vectorize的内部机制——这个函数是语法糖而非真正的向量化实现,它在执行前会调用一次传入的函数(也就是你的Scraper.get)来推断输出数据类型,这就导致第一个Page对象被额外请求了一次。
解决方案
方案1:改用普通循环(推荐)
直接用Python原生循环遍历numpy数组,逻辑直观且避免vectorize的隐性调用:
@staticmethod def scrape(page_load: np.array): for page in page_load: Scraper.get(page) return page_load
方案2:指定otypes参数(保留vectorize的情况)
如果坚持使用np.vectorize,可以显式指定otypes参数,跳过自动类型推断步骤:
@staticmethod def scrape(page_load: np.array): # 由于get方法无返回值,指定otypes为object类型 get = np.vectorize(Scraper.get, otypes=[object]) get(page_load) return page_load
额外优化建议
- 爬虫场景下用Python列表存储Page对象更轻便,可避免numpy对象数组带来的隐性问题;
- 给请求方法添加异常捕获,防止单个请求失败导致整个爬虫中断:
@staticmethod def get(page): try: page.html = requests.get(page.url.string, headers=Scraper.HEADERS).text print(f"Scraping page {page.url.page_number}") except requests.exceptions.RequestException as e: print(f"Failed to scrape page {page.url.page_number}: {str(e)}")
内容的提问来源于stack exchange,提问作者YoBoyAndy
相关产品推荐
相关产品推荐

