Website Contact Extractor
Pricing
$0.80 / 1,000 website contact results
Website Contact Extractor
Find publicly visible emails, phone numbers, and social profile links on contact pages for one or more websites. Returns source URLs and page metadata; no login or access-control bypass.
Pricing
$0.80 / 1,000 website contact results
Rating
0.0
(0)
Developer
MYM
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
Website Contact Extractor — Public Emails, Phones & Social Links
Turn a bounded set of public website pages into contact records. Supply HTTP or HTTPS URLs; the Actor checks the supplied page and a small number of same-origin contact, about, support, or team pages. Each supplied website that yields at least one email, phone number, or linked social profile can produce a stored contact result. The result keeps the input and final page URL so your downstream review retains context.
This is a focused public-page extractor, not an internet-wide people search, a domain email guesser, a mailbox verification product, or an unrestricted website crawler. It does not log in, solve access challenges, or bypass access controls. A social-domain link can point to a repository or issue as well as a profile; review the URL rather than assuming that every matched link identifies an individual.
Contents
- Capabilities and use cases
- Input
- Output fields
- Real dataset example
- Limits and coverage
- Run and export
- Pricing and outcome policy
- Usage tips and data quality
- Use with AI and MCP
- Support
- FAQ
- Related searches
- Related Actors
- Resources and disclaimer
- 中文说明
Capabilities and use cases
- Extract publicly visible email addresses from page text and
mailto:links, returning arrays rather than an arbitrary single preferred address. - Extract displayed telephone values and
tel:links where available. Preserve the observed formatting; this is not a guarantee of E.164 normalization or reachable telephone service. - Capture public links to supported social destinations without claiming identity verification or ownership of the linked account.
- Keep
contactPagesas the pages checked, not as a per-value citation map. UseinputUrl,finalUrl,domain, andpageTitlefor website-level review. - Configure up to 100 input websites and 1–4 total pages per input, with a global 20–540 second budget.
- Store a result only if its email, phone, or social-link arrays contain at least one value. Empty contact rows are not useful billable output.
Where it fits
Business directory maintenance: check the public contact page for each already-known organization and update your internal directory after review. The Actor does not discover companies for you and does not prove that an address belongs to a named employee.
Website quality audits: compare whether your own authorized pages expose expected contact channels. An empty result means no usable value was returned, not proof that the organization has no contact information anywhere.
Research preparation: create a short, traceable list of public contact endpoints for organizations relevant to a legitimate study. Preserve page context and collect only the information you need.
CRM hygiene: treat returned addresses and numbers as candidate updates, not automatically verified entries. Apply your own matching, consent, suppression, and retention checks before outreach.
Spreadsheet workflows: keep one website-level row with separate contact arrays. If you expand arrays into individual contacts downstream, that reshaping does not change the Actor's website-result billing unit.
Input
| Field | Type | Required / default | Description and limits |
|---|---|---|---|
urls | array | Required | Public HTTP/HTTPS URLs; provide 1–100 targets. No private, local, credential-bearing or login-only URLs. |
maxUrls | integer | 50 | Maximum input websites to check, 1–100. This is a cap, not a promise of one result per target. |
maxContactPages | integer | 3 | Total pages per input including the supplied URL, 1–4; not four additional pages. |
timeoutSeconds | integer | 300 | Global budget across the input batch and discovered pages, 20–540 seconds. |
Example input
{"urls": ["https://www.rfc-editor.org/about/contact/"],"maxUrls": 1,"maxContactPages": 2,"timeoutSeconds": 60}
Required fields have no automatic target substitute. Optional defaults are shown above; explicit integer limits should stay inside the supported range. Use the input form for the current schema rather than assuming extra JSON properties are meaningful.
Output fields
| Field | Type | Description |
|---|---|---|
domain | string | Hostname associated with the returned public page. |
pageTitle | string | Observed title of the supplied page, if available. |
emails | array | Deduplicated public email values; an empty array is allowed if another contact category has values. |
phones | array | Observed public phone strings. Different formatting can remain; review before normalizing. |
socialProfiles | array | Public links matched to social destinations; not guaranteed to be individual profile pages. |
contactPages | array | Checked same-origin page URLs, including the supplied page where recorded. |
inputUrl | string | Original submitted public URL. |
finalUrl | string | Public page URL after allowed redirects. |
httpStatus | integer | HTTP status of the supplied page in the contact result. |
source | string | Public-page observation label, not a separate data-provider identifier. |
Types describe the public record and its optional values, not a promise that every field is populated. The built overview selects a subset of these fields; full JSON is the source for complete inspection.
Real dataset example
This unchanged row was retrieved from a historical SUCCEEDED Apify run 1TZZxWigRHa9oyEEQ, started 2026-09-30T17:12:59.014Z, dataset nvAB3gVJ8JxJwp2sP. It is real output, not illustrative placeholder data. The run is historical and does not claim a new live execution of the latest build. Values may differ on a future run.
Historical input:
{"urls": ["https://www.rfc-editor.org/about/contact/"],"maxUrls": 1,"maxContactPages": 2,"timeoutSeconds": 60}
Stored row:
{"domain": "www.rfc-editor.org","emails": ["rfc-editor@rfc-editor.org","rsce@rfc-editor.org","rfc-ise@rfc-editor.org","rswg@rfc-editor.org","rsab@rfc-editor.org","rfc-interest@rfc-editor.org","support@ietf.org","legal@ietf.org"],"phones": ["+17036253917","+1-703-625-3917"],"source": "public website pages","finalUrl": "https://www.rfc-editor.org/about/contact/","inputUrl": "https://www.rfc-editor.org/about/contact/","pageTitle": "Contact | RFC Editor","httpStatus": 200,"contactPages": ["https://www.rfc-editor.org/about/contact/","https://www.rfc-editor.org/about/rfc-editor/"],"socialProfiles": ["https://github.com/ietf-tools/red/issues"]}
Limits and coverage
Maximum 100 input websites. Maximum four pages per input, including the starting page. The defaults are 50 websites and three pages per input. maxUrls controls how many supplied targets are checked; it does not instruct the Actor to find more websites. maxContactPages=1 restricts each input to the supplied page and is useful when you already have a precise contact URL.
Discovery stays on the same origin. A link to an external contact portal is not a request to crawl that other website. Private/reserved IP addresses, local hostnames, credential-bearing URLs, and unsafe redirects are rejected. Use public addresses that you are authorized to collect from. The Actor reads public pages without bypassing logins, CAPTCHA, verification pages, or other access restrictions.
The time budget is global rather than a per-page promise. A large batch can exhaust it before all targets are visited. It is not a full rendering, OCR, image-to-text, PDF extraction, or form-submission tool. Contacts that require a login, an interactive reveal, or content unavailable to the supported public-page read may not be captured. Do not send cookies or expect arbitrary custom headers to unlock such content.
Deduplication applies to observed values, but presentation differences can remain. The historical sample includes two phone strings with different formatting and a GitHub issue URL in socialProfiles. Those facts are useful warnings about interpretation: use the returned values as observations, not a silently cleaned list of verified phone identities and personal profiles.
Contact review workflow
Start with a vetted organization list. Prefer the exact public contact page over a generic homepage when you know it, because the bounded page allowance can then be spent on relevant content. Keep the original input URL in your audit record even if it redirects. After export, review whether each email is a general office address, role mailbox, or something unrelated to your intended task; the Actor does not assign contact roles.
Normalize telephone formatting only in a downstream copy, preserving the original array. Compare normalized candidates cautiously rather than deleting values that merely look similar. A phone string in page text can be ambiguous, so use human review for important records. For social links, inspect the complete path: a link to a repository, issue, or organization page must not automatically become a personal profile in your CRM.
Keep contact-page provenance at the row level. contactPages shows where the Actor checked but does not say which exact page contributed each individual value. If you need a per-contact citation for a regulated process, verify it manually on the public pages before use. Record your own review date, lawful purpose, and retention deadline separately; those fields are not invented Actor output.
An organization with no captured contact values should enter an “unresolved” queue rather than be deleted from your master directory. Look at OUTPUT and the run notes before deciding whether to correct the URL, retry later after a genuine transient problem, or accept that the supported public read returned no usable contacts. Do not respond to access denial by attempting to bypass the site's restrictions.
Run and export
Start in Apify Console
Open this Actor's Store page and select Try for free or Run. Sign in to your own Apify account, enter the documented input fields, and start a small run before increasing the result limit. The Actor does not require a separate target-service API key or a target-site login. An Apify account is still needed to execute it on the platform. A platform trial does not change the Actor's documented result cap or make third-party content unrestricted.
When the run ends, open its default dataset. The overview table is a convenient presentation of selected columns; it is not a promise that every record has every value. Open the full JSON dataset when you need to distinguish an empty array from an absent value, preserve types, or inspect columns that are not in the overview. The Actor output links named results and fullJson point to the overview and complete dataset respectively. These links are storage locations, not extra columns inside each result.
Export as JSON for typed integrations. Use CSV or Excel for manual analysis and review how arrays and missing values are represented before importing into a spreadsheet. XML is also available through Apify dataset export. Keep the original JSON alongside a spreadsheet export when your workflow depends on numeric prices, arrays, or explicit null values. A table cell that looks blank is not sufficient evidence that extraction failed.
Three API examples
These examples use standard Apify REST endpoints. Set APIFY_TOKEN locally to your own Apify API token before running them. Do not paste the token into a ticket, screenshot, public repository, shared notebook, or chat prompt. All request URLs are double-quoted so shell variables expand correctly and query-string ampersands do not split the command. The examples use Bearer authentication rather than embedding secrets in URLs.
1. Start a run and wait briefly for its status. The returned run object includes id, status, defaultDatasetId, and defaultKeyValueStoreId. A response after waitForFinish=60 may still say RUNNING; HTTP success is not proof that the Actor has finished. Replace illustrative travel dates with a suitable future interval when applicable.
curl --fail-with-body --silent --show-error --request POST \"https://api.apify.com/v2/acts/myagizm~website-contact-extractor/runs?waitForFinish=60" \--header "Authorization: Bearer ${APIFY_TOKEN}" \--header "Content-Type: application/json" \--data '{"urls":["https://www.rfc-editor.org/about/contact/"],"maxUrls":1,"maxContactPages":2,"timeoutSeconds":60}'
2. Read the exact run's status. Set RUN_ID to the data.id returned by example 1. Repeat this GET at a sensible interval while the run is READY or RUNNING. Only proceed to interpret final coverage after a terminal status is reported. Do not start a second run merely because the first wait period elapsed.
curl --fail-with-body --silent --show-error \"https://api.apify.com/v2/actor-runs/${RUN_ID}" \--header "Authorization: Bearer ${APIFY_TOKEN}"
3. Download that run's full dataset. Set DATASET_ID to data.defaultDatasetId from the same run. This retrieves JSON rather than the overview projection. An empty JSON array is possible; inspect the run and its OUTPUT record before deciding whether it means an input problem, a confirmed empty search, or a genuine processing failure.
curl --fail-with-body --silent --show-error \"https://api.apify.com/v2/datasets/${DATASET_ID}/items?format=json&clean=true" \--header "Authorization: Bearer ${APIFY_TOKEN}"
You can read the reason for a handled empty outcome in Console under the run's default key-value store, record OUTPUT. The REST resource for that record is https://api.apify.com/v2/key-value-stores/{defaultKeyValueStoreId}/records/OUTPUT; authenticate with your own token just as above. Do not substitute a dataset ID for a key-value-store ID: the run exposes both and they serve different purposes.
Integration checklist
Store the run ID, submitted input, execution time, dataset ID, and final status in your own job record. Fetch data from that exact dataset instead of using a mutable “last run” reference when multiple jobs may overlap. Decide how your application represents an empty successful result, and keep that state separate from a failed job. Deduplicate across runs in your own destination if repeated snapshots should update existing records rather than append indefinitely. The Actor's per-run cap is not a cross-run database constraint.
Handle API authentication and permission errors at the client layer. An HTTP 401 from the Apify API means you should check your token; it is not a target search outcome. Avoid an unconditional retry loop that repeatedly launches billable successful runs. A bounded retry of a genuine transient failed request can be reasonable, but first confirm the original run's state. A client timeout can occur even while the original run continues on Apify.
Pricing and outcome policy
The pricing model is pay per event, with the stored dataset item as the result event. The current snapshot rate is $0.0008 per stored result, equivalent to $0.8000 per 1,000 stored results. Check the Actor's live Pricing tab for the rate applicable when you run it; platform pricing, plan terms, and any other account-level charges are governed by Apify. The quoted result rate is not a guarantee of a fixed total account invoice.
Request limits describe an upper bound, not a reservation of that many successful results. A requested maximum does not mean the search will find that many matches. Only stored result rows trigger the documented result event. A zero-row handled input error has zero result charges; a confirmed no-results outcome also has zero result charges. The absence of a result event should not be confused with an assertion about every possible platform or account fee.
Platform schema validation may reject malformed input before a run starts; the following policy applies to handled runtime input errors after a run is created.
Input errors finish SUCCEEDED with no results and no charge; see OUTPUT for the reason. Handled, explicitly classified missing-target or no-results outcomes likewise finish successfully with zero dataset rows and an explanatory OUTPUT record. The errorType vocabulary can include INPUT_ERROR or INVALID_INPUT, NOT_FOUND, and NO_RESULTS, depending on the Actor. Read the supplied message and hint rather than treating every SUCCEEDED run as a non-empty dataset.
Access denial, network interruptions, timeouts, and extraction/parsing faults are not silently re-labelled as a legitimate empty search. A genuine processing failure can remain FAILED. Do not interpret an unexplained empty response as proof that no matching public content exists. When there is partial verified delivery, review the run's notes and stored rows instead of assuming the requested cap was reached. For billing questions, share the exact run ID and the number of stored rows, not only a screenshot of the input limit.
Usage tips and data quality
- Keep comparable inputs together. Preserve the target, location wording, guest context, dates where supported, and result cap with each export. A later result may differ because the public page changed, not because an earlier row was incorrect.
- Use a small pilot. Validate that the returned fields fit your intended workflow before scheduling recurring jobs or requesting the maximum supported batch. Test the same export format that your production consumer will use.
- Treat optional fields explicitly. Preserve
null, empty text, and empty arrays instead of converting them all to zero. A missing price is not a free stay; a missing review count is not evidence of no reviews; an empty contact array means no value was captured for that category. - Retain raw values. Store the returned currency, displayed label, URL, and other context before normalizing data. Changes to formatting should happen in your downstream model, not by assuming all destinations or websites use the same conventions.
- Avoid unsupported controls. Adding undocumented dates, cookies, pagination tokens, filters, or other arbitrary JSON properties does not create a supported feature. Use only the input fields listed in this README and the Actor's current input form.
- Review before action. Public search cards and contact pages can be incomplete or outdated. Verify a booking decision or a contact action against the current public page; the Actor provides structured observations, not a commercial guarantee.
- Schedule deliberately. Apify saved tasks and schedules can reuse your chosen input, subject to your account's available features. Choose a cadence appropriate to the data, and review empty and failed runs separately rather than masking them in an aggregate success counter.
- Control retention. Export important results to your own authorized storage and apply your own retention policy. Run-associated datasets may be subject to your Apify account's retention settings; a historical example is not a promise of permanent storage availability.
Use with AI and MCP
This Actor can be used in an AI-assisted workflow through Apify's supported MCP tooling. Configure your MCP-capable client using the official Apify documentation and authenticate with your own Apify account. Tool names and setup details depend on the client and on the current Apify MCP server version; this README does not invent a dedicated tool name or claim that a target-site-specific MCP server is required.
A practical flow is: find this Actor by its Store identifier myagizm/website-contact-extractor, inspect its current input schema, submit only supported fields, wait for the exact run to finish, and retrieve its dataset. Ask the assistant to cite the run and preserve the returned values when summarizing. Give it the destination or URL and the supported limits explicitly. Do not let an assistant infer unsupported search filters or convert starting/displayed prices into guaranteed checkout quotes.
An AI summary should keep missing values visible and distinguish a successful empty outcome from a transport failure. It should not manufacture records to reach the requested maximum or fill in prices, phone numbers, addresses, availability, or ratings that the dataset did not contain. Credentials belong in your client's secure configuration, not in a natural-language instruction or public output. MCP is an integration route to the Actor, not a broader data-collection permission or a way around the limits listed below.
Support
Use this Actor's Issues tab on Apify for reproducible problems and feature requests. Include the exact run ID, a minimal sanitized input, expected result, actual result, and whether you inspected the complete JSON dataset. For empty SUCCEEDED runs, quote the non-sensitive OUTPUT errorType, message, and hint if present. For access or timeout problems, provide the run's terminal status and relevant sanitized message.
Never share an Apify token, login cookie, password, private network URL, or unrelated personal information in a public issue. A successful historical sample helps explain the output shape; it does not prove that the same target still returns identical data today. Requests for extra result coverage or new fields are feature requests, not commitments that the current version supports them. Existing limits remain in force until the input schema and documentation explicitly change.
Related Actors
Use these separate Actors when they match your task. They are not automatic stages of this Actor, and running a sibling can have its own input requirements and charges.
Resources and disclaimer
- Actor Store page: current input form, pricing, runs, and Issues.
- Apify documentation: Console, tasks, schedules, storage, and integrations.
- Apify API reference: authentication, run status, dataset export, and key-value-store records.
- Apify MCP documentation: current supported MCP setup.
This Actor is an independent data-collection utility, not an endorsement, booking service, contact verification service, or official product of the websites named in its title or examples. Trademarks belong to their respective owners. Public visibility does not remove privacy obligations, website terms, content rights, or restrictions on reuse. You are responsible for ensuring that your collection, storage, analysis, outreach, and republication are lawful and authorized.
Do not use the Actor to bypass authentication or access restrictions, conduct unlawful spam campaigns, or make unsupported claims about people or properties. Returned data is an observation of public content at run time and can become outdated. Confirm important decisions using the current relevant page. The example below is a real historical dataset row, not a guarantee of present availability, an instruction to contact the listed people, or permission to reuse content beyond applicable rights.
FAQ
1. Does it discover websites from company names?
No. Supply public website URLs yourself; it does not run an internet-wide company discovery search.
2. Is an email verified as deliverable?
No. An observed address is not a mailbox test, identity confirmation, or consent to contact.
3. Are phone numbers normalized?
Do not assume that. The sample preserves different formatted strings; retain originals when applying your own normalization.
4. Is every social link a personal profile?
No. A social-domain link can be a repository, issue, company page, or profile. Inspect the URL before classifying it.
5. Does four pages mean four extra pages?
No. maxContactPages includes the supplied page, so the total allowed per input is at most four.
6. Can it follow links to other websites?
Contact-page discovery stays on the same origin. External links may be captured as values but are not a broad crawl instruction.
7. Can I supply a private network URL?
No. Local/private or reserved destinations, credential-bearing URLs, and unsafe redirects are unsupported.
8. Can it read a login-only contact directory?
No. It does not sign in or bypass access checks. Supply a genuinely public page.
9. How many contacts are charged inside one row?
The unit is one stored website contact result, not each email or phone in its arrays.
10. Does contactPages cite each email individually?
No. It lists checked pages at website-row level. Verify per-value provenance yourself if your process requires it.
11. Do I need a target-site account or separate API key?
No target-site login or separate target-service key is required for the documented public data. Apify execution and API calls still use your own Apify account and API token.
12. Why did SUCCEEDED return an empty dataset?
Handled input errors and explicitly classified missing or empty outcomes can succeed with zero rows. Read OUTPUT for the errorType, message, and hint; success is not a non-empty-data guarantee.
13. Are handled invalid inputs billed?
No result rows are stored and no result event is charged for the handled input-error outcome. Consult Apify separately for platform and account billing terms.
14. Will every genuine processing error also say SUCCEEDED?
No. Access denial, network, timeout, and parsing faults can remain FAILED. They must not be confused with a confirmed legitimate no-results outcome.
15. Is the requested maximum guaranteed?
No. It is an upper limit. Public content availability, bounded coverage, optional fields, and execution constraints can yield fewer rows.
16. Can I export CSV or Excel?
Yes, using Apify dataset export. Keep JSON when arrays, null values, or numeric types matter, and check how your spreadsheet handles those values.
17. Why is a field not visible in the overview table?
The table is a selected-field view. Read the full JSON dataset before concluding that a field was not returned, and preserve optional missing values as missing.
18. Can I use schedules and saved tasks?
You can use Apify platform tasks and scheduling features available to your account. Reuse valid inputs and review changes, empty outcomes, and pricing before running repeatedly.
19. What should I include in a support request?
The exact run ID, sanitized input, actual versus expected output, final status, and non-sensitive OUTPUT explanation. Never include API tokens or private credentials.
20. May an AI assistant fill missing values or infer unsupported fields?
No. Ask it to summarize actual rows, preserve missing values, and respect the exact schema. MCP access does not add features or permission to bypass limits.
Related searches
website contact extractor, public website email scraper, contact page phone extraction, same-origin contact crawler, website social links, business contact page audit. These terms describe supported research contexts, not additional input fields or a promise of broader coverage.
中文说明
网站公开联系方式提取 — 邮箱、电话与社交链接
将有限数量的公开网站页面整理成联系方式记录。输入 HTTP 或 HTTPS 地址后,Actor 检查原始页面,并有限地查看同一来源站点的联系、关于、支持或团队页面。每个至少发现一个邮箱、电话号码或社交链接的输入网站可生成一条已存储结果;同时保留原始地址和最终页面地址,方便下游复核。
这是面向公开页面的联系方式提取工具,不是全网人员搜索、域名邮箱猜测、邮箱真实性验证或无限制网站爬虫。它不会登录、破解访问挑战或绕过访问控制。匹配到社交网站域名的链接也可能是代码仓库或问题页,而非个人主页;应检查真实 URL,不能直接认定其代表某位个人。
中文目录
能力与用途
- 从页面文字与
mailto:链接提取公开邮箱,返回数组,不擅自选择一个“主要邮箱”。 - 从可见文字或
tel:链接提取电话,保留观察到的写法;不保证统一 E.164 格式,也不保证号码可接通。 - 捕获公开的社交网站链接,但不验证账户身份或归属。
contactPages表示已检查页面,不是每个联系方式对应的精确引用映射。可结合inputUrl、finalUrl、domain、pageTitle进行网站级复核。- 支持最多 100 个输入网站,每个输入总共 1–4 页,全局时间预算为 20–540 秒。
- 仅当邮箱、电话或社交链接数组至少有一个值时保存结果,不把空联系方式行当成有效计费输出。
适用场景
企业目录维护: 检查已知组织的公开联系页面,复核后更新内部目录。本工具不会替你发现公司,也不能证明某个地址属于指定员工。
网站质量审计: 检查你自己或获授权网站是否公开预期联系渠道。空结果仅说明没有返回可用值,不能证明组织在其他页面也没有联系方式。
研究准备: 为合法研究整理简短、可追溯的组织公开联系渠道,保留页面上下文,并只收集必要信息。
CRM 数据维护: 将地址和号码视为待确认更新,而不是自动验证条目。联系前应应用自己的匹配、同意、拒收和留存规则。
电子表格整理: 保持网站级一行与独立联系方式数组。下游将数组展开为单个联系记录,不会改变 Actor 按网站结果计费的单位。
输入字段
| 字段 | 类型 | 必填 / 默认值 | 说明与限制 |
|---|---|---|---|
urls | array | 必填 | 公开 HTTP/HTTPS 地址,提供 1–100 个目标;不支持私有、本地、带凭据或必须登录的 URL。 |
maxUrls | integer | 50 | 最多检查的输入网站数,1–100;是上限,不保证每个目标都有结果。 |
maxContactPages | integer | 3 | 每个输入的总页面数,含原始页面,1–4;不是额外再检查四页。 |
timeoutSeconds | integer | 300 | 整批输入与发现页面共用的全局预算,20–540 秒。 |
输入示例
{"urls": ["https://www.rfc-editor.org/about/contact/"],"maxUrls": 1,"maxContactPages": 2,"timeoutSeconds": 60}
必填字段没有自动替代目标;可选默认值如上。显式整数限制必须位于支持范围内。当前输入结构以表单为准,不要假设额外 JSON 属性有意义。
输出字段
| 字段 | 类型 | 说明 |
|---|---|---|
domain | string | 返回公开页面的主机名。 |
pageTitle | string | 输入页面可获得的标题。 |
emails | array | 去重的公开邮箱;若其他联系类别有值,此数组可以为空。 |
phones | array | 观察到的公开电话字符串;不同格式可能保留,规范化前应复核。 |
socialProfiles | array | 匹配到社交网站的公开链接,不保证都是个人资料页。 |
contactPages | array | 已检查的同来源页面地址,包含记录中的输入页面。 |
inputUrl | string | 原始输入公开 URL。 |
finalUrl | string | 允许的公开重定向后的地址。 |
httpStatus | integer | 联系方式结果中输入页面的 HTTP 状态码。 |
source | string | 公开页面观察说明,不是独立数据供应方标识。 |
类型描述公开记录及可选值,不保证每个字段都填满。构建中的概览选择部分字段;需要完整检查时应读取全部 JSON。
真实数据集样例
以下行原样读取自历史 SUCCEEDED Apify 运行 1TZZxWigRHa9oyEEQ,启动时间 2026-09-30T17:12:59.014Z,数据集 nvAB3gVJ8JxJwp2sP。它是真实输出,不是占位演示。此证据属于历史运行,不声称刚刚对最新构建执行了新测试;未来运行的值可能变化。
历史输入:
{"urls": ["https://www.rfc-editor.org/about/contact/"],"maxUrls": 1,"maxContactPages": 2,"timeoutSeconds": 60}
已存储数据行:
{"domain": "www.rfc-editor.org","emails": ["rfc-editor@rfc-editor.org","rsce@rfc-editor.org","rfc-ise@rfc-editor.org","rswg@rfc-editor.org","rsab@rfc-editor.org","rfc-interest@rfc-editor.org","support@ietf.org","legal@ietf.org"],"phones": ["+17036253917","+1-703-625-3917"],"source": "public website pages","finalUrl": "https://www.rfc-editor.org/about/contact/","inputUrl": "https://www.rfc-editor.org/about/contact/","pageTitle": "Contact | RFC Editor","httpStatus": 200,"contactPages": ["https://www.rfc-editor.org/about/contact/","https://www.rfc-editor.org/about/rfc-editor/"],"socialProfiles": ["https://github.com/ietf-tools/red/issues"]}
限制与覆盖
最多输入 100 个网站,每个输入最多检查四页,包含起始页。 默认是 50 个网站、每个输入三页。maxUrls 控制检查多少个已有目标,不会指示 Actor 额外发现网站。若已有准确联系页面,maxContactPages=1 可将每个输入限定在原始页面。
页面发现限制在同一来源。外部联系平台链接不意味着继续抓取外站。私有或保留 IP、本地主机名、带用户名密码的 URL 和不安全重定向会被拒绝。请使用你有权采集的公开地址。本工具读取公开页面,不绕过登录、验证码、验证页或其他访问限制。
时间预算由整批请求共用,不是每页保证可用的时长。大批次可能在检查全部目标前耗尽预算。本工具不是完整浏览器渲染、OCR、图片转文字、PDF 提取或表单提交服务。需要登录、交互展开或无法通过支持的公开页面读取获得的信息,可能不能捕获。不要提交 Cookie,也不要期望任意自定义请求头解锁这些内容。
观察到的值会去重,但展示格式差异可能仍然保留。历史样例包含两个不同写法的电话字符串,以及位于 socialProfiles 中的 GitHub 问题页地址。它们提醒你正确解释结果:返回的是观察值,而不是悄悄清洗完毕、验证过身份的电话和个人主页名单。
联系方式复核流程
从审核过的组织清单开始。若已知准确公开联系页面,优先使用它而不是普通首页,使有限页面额度集中在相关内容。即使发生重定向,也保留原始输入 URL。导出后应判断邮箱是通用办公室地址、职能邮箱,还是与任务无关;Actor 不会自动为联系渠道分配角色。
只在下游副本中规范化电话号码,保留原始数组。比较规范化候选项时应谨慎,不要因为看起来相似就删除。页面文字里的电话可能含义不明确,重要记录需要人工复核。社交链接应检查完整路径:仓库、问题页或组织页不能自动写成 CRM 中的个人主页。
页面出处是行级上下文。contactPages 表示检查范围,但不说明每个值具体出自哪页。如果合规流程需要逐条引用,请在使用前到公开页面人工确认。复核日期、合法用途和留存期限应由你的系统单独记录,它们不是 Actor 自动输出字段。
没有捕获联系值的组织应进入“待解决”队列,而不是直接从主目录删除。先检查 OUTPUT 和备注,再决定是否修正 URL、在真实瞬时故障后有限重试,或接受支持的公开读取没有获得可用联系方式。遇到访问拒绝,不应转而尝试绕过网站限制。
运行与导出
在 Apify 控制台启动
打开本 Actor 的商店页面,选择 Try for free 或 Run,登录自己的 Apify 账户,填写本文列出的输入字段。首次运行建议使用较小的结果上限,确认数据适合你的工作流程后再扩大请求。本 Actor 不要求另行提供目标服务的 API 密钥,也不要求目标网站登录信息;但在 Apify 平台执行仍然需要 Apify 账户。平台试用资格不会改变本文的结果限制,也不会使第三方内容变成可无限制使用的数据。
运行结束后,打开该次运行的默认数据集。overview 表格只是部分字段的便捷展示,并不保证每条记录的所有字段都有值。需要区分空数组与缺失值、保留类型或检查未展示字段时,请查看完整 JSON。Actor 输出中的 results 和 fullJson 分别指向概览与完整数据集;它们是存储链接,不是每条结果中的额外数据列。
需要保留类型时,优先导出 JSON。手动分析可以使用 CSV 或 Excel,但应先确认数组和缺失值在导出后如何表示。Apify 也支持 XML 数据集导出。若后续逻辑依赖价格数值、数组或明确的 null,请在电子表格之外保留原始 JSON。表格中的空白单元格本身不能证明抓取失败。
三个 API 示例
下面使用标准 Apify REST API。运行前,请在本地将 APIFY_TOKEN 设置为自己的 Apify API 令牌。不要将真实令牌放进工单、截图、公开代码库、共享笔记或聊天提示。请求 URL 使用双引号,确保 shell 变量展开,并避免查询参数中的 & 拆分命令。认证通过 Bearer 请求头完成,而不是将凭据嵌入 URL。
1. 启动运行并短暂等待状态。 返回的运行对象包含 id、status、defaultDatasetId 和 defaultKeyValueStoreId。即使设置 waitForFinish=60,返回时也可能仍为 RUNNING;HTTP 成功不等于 Actor 已经执行完毕。住宿日期示例仅供说明,实际运行时应换成合适的未来日期。
curl --fail-with-body --silent --show-error --request POST \"https://api.apify.com/v2/acts/myagizm~website-contact-extractor/runs?waitForFinish=60" \--header "Authorization: Bearer ${APIFY_TOKEN}" \--header "Content-Type: application/json" \--data '{"urls":["https://www.rfc-editor.org/about/contact/"],"maxUrls":1,"maxContactPages":2,"timeoutSeconds":60}'
2. 查询这一条运行的状态。 将 RUN_ID 设置为第一步返回的 data.id。当状态为 READY 或 RUNNING 时,以合理间隔重复查询;只有收到终态后,才判断最终覆盖范围。不要仅因为等待时间结束就再启动一次运行。
curl --fail-with-body --silent --show-error \"https://api.apify.com/v2/actor-runs/${RUN_ID}" \--header "Authorization: Bearer ${APIFY_TOKEN}"
3. 下载同一次运行的完整数据集。 将 DATASET_ID 设置为该运行的 data.defaultDatasetId。此命令返回完整 JSON,而不是概览投影。响应可能为空数组;请结合运行状态和 OUTPUT 记录,判断是输入问题、已确认的空搜索,还是实际处理故障。
curl --fail-with-body --silent --show-error \"https://api.apify.com/v2/datasets/${DATASET_ID}/items?format=json&clean=true" \--header "Authorization: Bearer ${APIFY_TOKEN}"
对于已处理的空结果,可在控制台中打开该次运行的默认键值存储并查看 OUTPUT 记录。对应的 REST 地址格式为 https://api.apify.com/v2/key-value-stores/{defaultKeyValueStoreId}/records/OUTPUT,认证方式与上面相同。请不要把数据集 ID 当成键值存储 ID;运行对象同时提供两者,但用途不同。
接入检查清单
在自己的任务记录中保存运行 ID、提交的输入、执行时间、数据集 ID 和最终状态。多个任务可能重叠时,应读取准确的数据集,不要使用可变化的“最后一次运行”引用。业务系统应把成功但为空的结果与失败任务分开处理。如果重复快照应该更新已有记录,而不是不断追加,请在自己的目标库中执行跨运行去重。本 Actor 的单次结果上限不是跨运行数据库约束。
Apify API 的认证与权限问题应在客户端处理。例如 API 返回 HTTP 401,应检查自己的令牌,而不是把它解释成目标搜索无结果。避免无条件重试并反复创建可计费的成功运行。遇到真实瞬时故障可以有限重试,但先确认原运行状态;客户端超时并不意味着 Apify 上的原运行已停止。
价格与结果状态
本 Actor 采用 按事件计费,已写入数据集的结果行是结果事件。当前价格快照为 每条已存储结果 $0.0008,即 每 1,000 条 $0.8000。实际运行前请查看商店的实时 Pricing 页面;平台价格、账户计划及其他账户级费用由 Apify 管理。这里的结果单价不承诺账户总账单固定不变。
请求上限只是最多可返回的数量,不表示预先保留了相同数量的成功结果,也不保证能够找到那么多匹配项。只有已存储结果行触发本文说明的结果事件。已处理的输入错误为零行、零结果费用;已确认的无结果情况也不产生结果费用。没有结果事件,不等于对所有可能的平台或账户费用作出承诺。
平台输入架构验证可能在创建运行之前拒绝格式错误的输入;以下策略适用于创建运行之后由 Actor 处理的输入错误。
输入错误会以 SUCCEEDED 状态结束,无结果且不收费;原因请查看 OUTPUT。 被明确分类并处理的目标不存在或无搜索结果情况,同样以成功状态结束,数据集为零行,并提供 OUTPUT 说明。不同 Actor 的 errorType 可能使用 INPUT_ERROR 或 INVALID_INPUT、NOT_FOUND、NO_RESULTS。请读取返回的 message 和 hint,不要把每次 SUCCEEDED 都当成必然有数据。
访问拒绝、网络中断、超时以及提取或解析故障,不会被悄悄改写成正常的空搜索。真实处理故障可能仍为 FAILED。没有明确说明的空响应不能证明公开内容确实没有匹配项。若已返回部分经过验证的数据,应检查运行备注和实际行数,不要假定达到了请求上限。咨询计费时,请提供准确运行 ID 和已存储行数,而不是仅提供输入上限截图。
使用建议与数据质量
- 保留可比较的输入。 每次导出都记录目标、目的地写法、成人数量、受支持的日期和结果上限。后续结果不同,可能是公开页面变化,不代表之前的记录一定错误。
- 先小规模试用。 在设置定时任务或请求最大批次前,确认字段符合实际需求,并测试生产系统将使用的导出格式。
- 显式处理可选字段。 不要把
null、空文本和空数组全部转换为零。价格缺失不代表免费住宿;评论数缺失不代表没有评论;某个联系方式数组为空,只代表该类值未被捕获。 - 保存原始值。 在规范化之前,先保留币种、展示标签、URL 和上下文。不要假设所有目的地与网站使用相同格式。
- 不要添加未支持的控制项。 在 JSON 中加入未记录的日期、Cookie、分页令牌、筛选项或其他属性,并不会自动得到对应功能。只使用本文和当前输入表单列出的字段。
- 行动前复核。 搜索卡片和联系页面可能不完整或已过期。预订和联系行动应以当前公开页面为准;本 Actor 返回结构化观察结果,而不是商业保证。
- 合理安排周期。 Apify 保存任务和定时功能可复用输入,具体取决于账户支持的功能。应选择与数据变化相符的周期,并分别处理空运行和失败运行,不要用单一成功率掩盖两者差别。
- 控制留存。 重要结果应导出到自己的授权存储,并遵守自己的保留策略。运行关联数据集可能受 Apify 账户留存设置影响;历史样例不意味着存储永久可用。
AI 与 MCP 使用方式
本 Actor 可通过 Apify 支持的 MCP 工具接入 AI 辅助流程。请按照 Apify 官方文档配置支持 MCP 的客户端,并使用自己的 Apify 账户认证。工具名称和设置方法取决于客户端及当前 Apify MCP 服务器版本;本文不会虚构专用工具名,也不会声称需要目标网站专属 MCP 服务器。
推荐流程:按商店标识 myagizm/website-contact-extractor 找到 Actor,检查当前输入结构,仅提交支持的字段,等待准确的运行结束,再读取其数据集。让助手在总结中注明运行并保留真实返回值,明确告诉它目标 URL 或目的地和结果上限。不要让助手推断未支持的筛选项,也不要把起始价格或展示价格改写成保证结算报价。
AI 总结应保留缺失值,并区分成功空结果与传输故障。它不应为了达到请求数量而编造记录,也不应填入数据集中没有的价格、电话号码、地址、房态或评分。凭据应放在客户端安全配置中,而不是自然语言指令或公开输出中。MCP 是调用 Actor 的接入方式,不是扩大采集权限或绕过产品限制的方法。
支持
可在本 Actor 的 Apify Issues 页面提交可复现问题或功能需求。请提供准确运行 ID、最小化且已脱敏的输入、预期结果、实际结果,以及是否检查过完整 JSON。对于空的 SUCCEEDED 运行,可引用非敏感 OUTPUT 中的 errorType、message 和 hint。访问或超时问题应附上运行终态和相关脱敏消息。
不要在公开工单中分享 Apify 令牌、登录 Cookie、密码、私有网络 URL 或无关个人信息。历史成功样例用于说明数据结构,并不能证明同一目标今天仍返回相同数据。扩大覆盖或新增字段属于功能请求,不代表当前版本已经支持;除非输入结构和文档明确改变,否则现有限制继续适用。
相关 Actors
以下是独立 Actor,适用时可单独选择。它们不是本 Actor 自动执行的步骤,分别运行可能有自己的输入要求和费用。
资源与免责声明
- Actor 商店页面:当前输入表单、价格、运行与 Issues。
- Apify 文档:控制台、任务、定时、存储与集成。
- Apify API 参考:认证、状态查询、数据集导出与键值记录。
- Apify MCP 文档:当前受支持的 MCP 配置方法。
本 Actor 是独立的数据采集工具,不是所述网站的官方产品、背书、预订服务或联系方式验证服务。商标归各自所有者所有。公开可见并不免除隐私义务、网站条款、内容权利和再次使用的限制。你应确保采集、存储、分析、联系和再发布行为合法且获得必要授权。
请勿用于绕过认证和访问限制、实施违法垃圾信息活动,或对个人与住宿作出数据不支持的结论。返回数据是运行时的公开内容观察,之后可能过期;重要决策应再次检查当前页面。下方样例是真实历史数据行,不保证现在仍有房态,不构成联系其中人员的指令,也不授予超出适用权利范围的内容使用许可。
常见问题
1. 能根据公司名发现网站吗?
不能。请自行提供公开网站 URL;本工具不执行全网公司发现搜索。
2. 邮箱会验证可投递性吗?
不会。观察到的地址不代表邮箱测试通过、身份确认或获得联系同意。
3. 电话会统一格式吗?
不能这样假设。样例保留不同格式字符串;自行规范化时也应保留原值。
4. 每个社交链接都是个人主页吗?
不是。也可能是仓库、问题页或公司页;分类前请检查完整 URL。
5. 四页是额外四页吗?
不是。maxContactPages 包含输入页面,每个输入总共最多四页。
6. 会继续抓取外站吗?
联系页面发现限定同一来源;外链可以作为值捕获,但不构成全网抓取指令。
7. 能输入内网 URL 吗?
不能。本地、私有或保留目标、带凭据地址和不安全重定向不受支持。
8. 能读取必须登录的联系目录吗?
不能。不会登录或绕过访问检查,请使用真正公开的页面。
9. 一行中的多个联系值怎么收费?
单位是一条已存储网站联系方式结果,不是数组中的每个邮箱或电话。
10. contactPages 会逐个引用邮箱出处吗?
不会。它提供网站行级检查页面列表;如需逐值出处,应自行复核。
11. 需要目标网站账户或另外的 API 密钥吗?
本文公开数据无需目标网站登录或另外的目标服务密钥;Apify 执行和 API 调用仍使用你自己的 Apify 账户与令牌。
12. 为什么 SUCCEEDED 但数据为空?
已处理的输入错误或明确分类的缺失、空结果可成功结束且为零行。请看 OUTPUT 的 errorType、message、hint;成功不保证非空。
13. 已处理无效输入会计费吗?
不会保存结果行或触发结果事件;平台与账户费用条款应另查 Apify。
14. 真实处理故障也会显示 SUCCEEDED 吗?
不会。访问拒绝、网络、超时、解析问题可能为 FAILED,不应与已确认的正常无结果混淆。
15. 请求最大值一定返回吗?
不一定。它是上限,公开内容、有限覆盖、可选字段和执行约束可能使行数更少。
16. 可以导出 CSV 或 Excel 吗?
可以,通过 Apify 数据集导出。数组、null 或数字类型重要时也保留 JSON,并检查表格如何处理这些值。
17. 为什么概览看不到某字段?
概览是选定字段视图。判断字段未返回前应查看完整 JSON,同时保持可选缺失值为缺失。
18. 能用定时和保存任务吗?
可使用账户支持的 Apify 任务与定时功能;复用有效输入,并在反复运行前检查变化、空结果与价格。
19. 支持请求需要什么?
准确运行 ID、脱敏输入、实际与预期输出、终态和非敏感 OUTPUT 说明;不要附 API 令牌或私有凭据。
20. AI 可以补齐缺失值或推断未支持字段吗?
不能。应总结真实数据、保留缺失值并遵循准确结构;MCP 接入不会增加功能或绕过限制的权限。
相关搜索
网站联系方式提取、公开网页邮箱抓取、联系页面电话提取、同来源联系页面检查、网站社交链接、企业联系页审计。这些关键词描述受支持的研究场景,不是额外输入字段,也不保证更广覆盖。