爬虫教程通常只假设单语言场景。当面对阿拉伯语/英语双语市场时,会遇到一种永不抛异常的 bug:请求成功、HTML 解析正确,但每个目标字段都为空。以下是构建双语职位数据集时积累的经验。
一个字段全空的典型场景:抓取职位页的「资历级别」和「雇佣类型」,测试正常,生产环境却返回 null。状态码 200,HTML 有效。原因是链接指向了区域子域名(如 ae.example.com),返回阿拉伯语页面,而选择器匹配的是英文标签「Seniority level」「Employment type」,页面显示为「المستوى الوظيفي」和「نوع التوظيف」。修复只需在抓取前将域名规约为主域名:re.sub(r"https://[a-z]{2}\.example\.com/", "https://www.example.com/", url)。通用教训:如果一个字段在所有记录中都为空,先怀疑地区语言问题,再怀疑选择器本身。防御措施:解析后断言关键字段已填充,否则抛异常——一个会崩溃的爬虫比一个默默返回空值的爬虫好得多。
数字陷阱:阿拉伯页面常使用东阿拉伯数字(如 ٢٠٠ 表示 200)。Python 的int("٢٠٠")能正确返回 200,"٢٠٠".isdigit()为 True,re.findall(r"\d+", text)能匹配到,因为\d默认支持 Unicode。但大多数人习惯写[0-9]+,这在阿拉伯数字页面上会永远返回空列表,让你误以为字段缺失。如果希望输出始终为 ASCII 数字,可以用str.maketrans翻译:ARABIC_DIGITS = str.maketrans("٠١٢٣٤٥٦٧٨٩", "0123456789"),再int(re.sub(r"\D", "", text.translate(ARABIC_DIGITS)))。
关键词匹配:子串匹配在双语数据集中容易出错。例如"coo" in title会匹配到「Coordinator」,把项目协调员误判为首席运营官;"partner" in title会匹配到「Partner Onboarding Specialist」,把入职专员提升为合作伙伴。解决方案:始终使用单词边界正则re.search(r"\bcoo\b", title)。数据验证:在发布统计数字前,务必打印实际行。示例中,某市场 18% 的职位被标为「高管级」,打印后发现一半是协调员和入职专员,真实比例仅 16%。
机器翻译与编码:为双语数据集添加阿拉伯语标签时,始终保留原始字段(如title和titleArabic并存),只将翻译用于显示,所有连接、去重和过滤应在源语言字段上进行。编码方面,在所有读写边界显式设置 UTF-8:sys.stdout.reconfigure(encoding="utf-8"),Path(p).read_text(encoding="utf-8")。注意 UTF-8 BOM 可能导致部分 JSON 解析器报错,先检查 BOM 再检查语法。
以上经验来自维护区域招聘网站的爬虫(输出中英文标签),全部踩坑记录在作者的 Apify 页面。
#开发者 #工具 #爬虫 #Python #阿拉伯语 #双语数据 #Unicode #正则表达式 #数据清洗 #工程效率
@DevToolboxHub