Jupyter爬虫代码正常运行,Databricks部分邮编报错问题排查
排查Databricks中爬虫部分邮编报错的问题
以下是针对你遇到的问题的具体排查方向和解决办法:
网络环境差异
Databricks集群的公共IP段可能被目标网站的反爬策略标记,部分邮编对应的请求被拦截。- 解决:给请求添加模拟浏览器的
User-Agent等请求头,避免被识别为爬虫;如果集群有出站代理配置需求,联系管理员配置合规的代理IP;同时给请求加入随机延迟(比如time.sleep(random.uniform(1,3))),降低请求频率。 - 示例代码片段:
import requests import random import time headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } def fetch_dealer(zip_code): time.sleep(random.uniform(1, 2)) response = requests.get(f"https://target-domain.com/dealers?zip={zip_code}", headers=headers) return response
- 解决:给请求添加模拟浏览器的
依赖版本不一致
Jupyter和Databricks环境中,爬虫依赖库(如requests、BeautifulSoup)的版本可能存在差异,导致部分解析逻辑失效(比如某版本库对特定HTML结构解析有bug,刚好对应部分邮编的返回页面)。- 解决:在Databricks笔记本中执行
!pip show requests查看当前版本,和Jupyter环境的版本对齐;重新测试解析逻辑,确保兼容当前库版本的语法和API。
- 解决:在Databricks笔记本中执行
分布式执行的并发/异常处理问题
如果用Spark分布式执行爬虫,过高的并发请求可能触发目标网站的频率限制,且分布式环境下的异常捕获逻辑不完善,导致部分邮编的请求失败未被处理。- 解决:控制Spark分区数(比如
spark.conf.set("spark.sql.shuffle.partitions", "8"))降低并发;给每个爬取任务添加完整的异常捕获,记录失败邮编的错误信息:def crawl_with_error_handle(zip_code): try: # 完整爬取逻辑 dealer_info = parse_dealer(fetch_dealer(zip_code).text) return {"zip": zip_code, "status": "success", "data": dealer_info} except Exception as e: return {"zip": zip_code, "status": "failed", "error_msg": str(e)} # 用RDD或DataFrame UDF执行 result_df = spark.createDataFrame(zip_list, StringType()).rdd.map(crawl_with_error_handle).toDF()
- 解决:控制Spark分区数(比如
目标网站返回内容的边缘情况
部分邮编对应的页面可能是无经销商的空页面、404错误页,或是HTML结构和正常页面不同,Jupyter测试时未覆盖这些场景,迁移后暴露问题。- 解决:针对报错的邮编,单独打印响应的状态码和HTML内容,对比正常邮编的返回结果,调整解析逻辑适配不同情况:
response = fetch_dealer(zip_code) if response.status_code != 200: return {"zip": zip_code, "status": "failed", "error_msg": f"Status code {response.status_code}"} if "No dealers found" in response.text: return {"zip": zip_code, "status": "no_data", "data": {}} # 正常解析逻辑
- 解决:针对报错的邮编,单独打印响应的状态码和HTML内容,对比正常邮编的返回结果,调整解析逻辑适配不同情况:
内容的提问来源于stack exchange,提问作者Akshay Shiyani
相关产品推荐
相关产品推荐

