使用cheerio提取网页数据 如何提取指定站点的邮箱与姓名
问题原因分析
- 同源策略限制:浏览器出于安全考虑,禁止当前页面的JS读取跨域资源的DOM内容,你通过
<object>加载的第三方站点页面不属于同域资源,除非目标网站主动配置了允许你当前域名访问的CORS规则,否则你永远无法通过前端JS直接读取<object>内部的元素内容,你现有代码只能查询到当前页面本身的strong标签,自然拿不到目标站的内容。 - 加载时机逻辑缺陷:即使不存在跨域限制,你监听的
window.load事件仅能保证当前页面自身的资源加载完成,无法保证<object>内嵌入的外部页面加载完毕,执行查询逻辑时目标元素还没渲染,也会返回空结果。
可行实现方案
方案1:本地脚本爬取(推荐,无跨域限制)
直接用后端/本地脚本发起请求获取页面内容,避免浏览器跨域限制,以Python为例:
首先安装依赖:pip install requests beautifulsoup4
示例代码:
import requests from bs4 import BeautifulSoup import re # 请求目标页面 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" } response = requests.get("https://aleenarais.com/buddy/", headers=headers) response.encoding = response.apparent_encoding page_content = response.text # 方法1:用DOM解析提取姓名和邮箱 soup = BeautifulSoup(page_content, "html.parser") # 这里根据目标页面实际的元素结构写选择器即可,比如姓名在某个class的标签下,邮箱在mailto链接里 names = [item.get_text(strip=True) for item in soup.select("你要匹配的姓名元素选择器")] emails = [item.get("href").replace("mailto:", "").strip() for item in soup.select('a[href^="mailto:"]')] # 方法2:正则提取邮箱(不需要解析DOM,直接从页面字符串匹配) email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' emails_reg = re.findall(email_pattern, page_content) print("提取到的邮箱:", emails if emails else emails_reg) print("提取到的姓名:", names)
方案2:浏览器端搭配代理服务
如果必须在浏览器端实现,你需要自己搭建一个代理中转服务,由代理服务请求目标页面内容后返回给前端,前端直接处理返回的文本即可,示例逻辑:
// 假设你的代理服务接口为 /proxy?url=xxx,会返回目标页面的文本内容 fetch("/proxy?url=https://aleenarais.com/buddy/") .then(res => res.text()) .then(pageText => { // 可以直接正则提取邮箱 const emailReg = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g const emails = pageText.match(emailReg) || [] console.log("提取到的邮箱:", emails) // 也可以把文本转为DOM再查询元素 const parser = new DOMParser() const doc = parser.parseFromString(pageText, "text/html") const names = Array.from(doc.querySelectorAll("你要匹配的姓名元素选择器")).map(item => item.textContent.trim()) console.log("提取到的姓名:", names) })
内容的提问来源于stack exchange,提问作者Sujith S Manjavana
相关产品推荐
相关产品推荐

