Python爬虫如何从href跳转页面抓取受保护的邮箱地址
受保护邮箱爬取方案
抓不到邮箱就两个核心原因:
- 进入详情页后没有执行JS渲染:这个站点的邮箱做了动态加载保护,普通GET请求拿到的静态HTML里全是占位符,真实邮箱是等页面JS运行完成、检测完访问环境后,才解密插入到DOM节点里的
- 选择器匹配错误:你用的
li.lmb-calltoaction a对应的是拨打电话的按钮,和邮箱节点完全无关
修改要点
- 详情页请求发起后必须调用
render()方法执行页面JS,sleep参数不要设太短,建议给2秒等待JS解密完成,设1秒经常因为加载不完整拿到空值 - 替换选择器为匹配邮箱节点的
li.lmb-email a - 取到a标签后从
href属性提取内容,删掉开头的mailto:前缀就是真实邮箱地址 - 先修复原有代码的缩进错误,for循环内的代码全顶格写的话Python根本跑不起来
修正后可直接运行的代码
from requests_html import HTMLSession list_url = 'https://thenationalweddingdirectory.com.au/explore/?category=wedding-venues®ion=melbourne&sort=top-rated' s = HTMLSession() r = s.get(list_url) r.html.render(sleep=2) products = r.html.xpath('//*[@id="finderListings"]/div[2]', first=True) for item in products.absolute_links: # 过滤翻页、广告类非场地详情页的无效链接 if '/suppliers/' not in item: continue detail_r = s.get(item) # 核心步骤:必须渲染执行JS,否则拿不到解密后的真实邮箱 detail_r.html.render(sleep=2) email_tag = detail_r.html.find('li.lmb-email a', first=True) if email_tag: email = email_tag.attrs.get('href', '').replace('mailto:', '') print(f"详情页:{item} | 联系邮箱:{email}") else: print(f"详情页:{item} | 未公开联系邮箱")
踩坑提醒
- 如果按上述代码还是拿不到邮箱,可以给render方法加
keep_page=True参数,手动等待1秒再解析,部分反爬严格的页面会检测JS执行速度,执行太快会返回占位内容 - 控制请求频率,短时间内批量刷页会被站点封IP,到时候怎么渲染都拿不到有效内容
- 不用浪费时间在静态源码里用正则匹配邮箱,源码里的邮箱全是混淆后的乱码,没有页面自带的JS解密逻辑根本算不出真实值
内容的提问来源于stack exchange,提问作者Arif Fadhillah
相关产品推荐
相关产品推荐

