这是一个本地 Python 文献证据整理项目。当前版本是 A 版:只处理手动导出的文献记录、摘要和你已经合法保存到本地的 txt 全文,不做自动登录、不做验证码处理、不抓取受限全文。
A 版优先实现一个可运行、可复核的本地流程:
- 读取手动导出的 ScienceDirect / Web of Science / googlescholar.pro / scholar.lanfanshu.cn 检索结果。
- 去重并整理为统一文献表。
- 检查摘要和
data/fulltext/txt/中的用户保存全文。 - 使用全文关键词规则筛选:例如 4 个关键词中至少 3 个关键词在全文 txt 中各出现不少于 3 次。
- 后续基于通过全文关键词规则的文献再做 AbleSci 分区、SCI 1区/2区筛选、关键词命中统计、证据段落摘取和 Markdown 报告。
第一版不自动登录 ScienceDirect / Web of Science,不自动 CSTCloud 登录,不调用外部 LLM API,不批量下载 PDF。Playwright 只允许用于渲染公开的 googlescholar.pro 搜索结果页,不用于登录、验证码、机构认证或受限全文访问。
本项目不会绕过验证码,不会保存 CSTCloud、ScienceDirect、Web of Science 的账号密码,不会破解付费墙,也不会自动访问受限全文。ScienceDirect / Web of Science 第一版只读取你手动导出的结果,或你手动保存到 data/fulltext/txt/ 的合法全文。
如果无法合法获取全文,系统只处理标题、摘要、关键词和用户已保存的 txt。最终输出只做中文概括、必要短证据句、原文定位和 DOI/链接,不大段复制受版权保护的论文全文。
推荐 Python 3.10 或更高版本:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt如果要使用 googlescholar.pro 的公开搜索页渲染模式,还需要安装 Chromium:
python -m pip install playwright
python -m playwright install chromium当前依赖不包含 LangExtract、Streamlit 或向量数据库。
配置位于:
config/query_config.yaml
run_mode: samplerun_mode: sample表示当前使用测试样例。run_mode: real表示准备运行真实检索数据。
真实运行前必须移走 data/input/manual_exports/sample_manual_export.csv 和测试全文 data/fulltext/txt/D000004.txt,否则 sample 文献会混入真实结果。
编辑:
data/input/keywords.txt
每行一个关键词或关键句。以 # 开头的行会被忽略。
示例:
land degradation
ecological restoration
policy effect
配置位于:
config/query_config.yaml
核心配置:
keyword_filter:
match_mode: at_least_k_required
total_keywords: 4
min_required_keywords: 3
verification_scope: fulltext_required
strict_fulltext_required: true
min_hits_per_keyword: 3
case_sensitive: false
allow_plural_variants: true
allow_hyphen_space_variants: true
keep_not_verifiable_for_review: true含义:
match_mode: all_required:每个关键词都必须达到最低全文命中次数。match_mode: at_least_k_required:N 个关键词中至少 K 个关键词达到最低全文命中次数。min_required_keywords: 3:当前推荐规则是 4 个关键词中至少 3 个通过。strict_fulltext_required: true:只有用户保存的 txt、OA HTML 提取 txt、OA PDF 提取 txt 可以算全文验证;摘要和 snippet 只能辅助展示,不能算通过。min_hits_per_keyword: 3:通过的关键词在全文中至少出现 3 次。
如果没有全文 txt,系统不能声称全文通过,只会进入 fulltext_pending_review.csv。当前推荐配置是:4 个关键词中至少 3 个关键词在全文中各出现不少于 3 次。
第一版采用稳健规则匹配,不使用复杂 NLP:
- 默认大小写不敏感。
- 多词短语按短语匹配。
- 连字符和空格兼容,例如
land-use可匹配land use,policy-driven可匹配policy driven。 - 使用英文词边界,避免把短词误匹配到长词中。
- 支持简单英文复数兼容,例如
policy/policies,study/studies,常规名词单复数。 - 不自动扩展同义词;如果需要同义词,请把同义表达作为关键词或后续规则补充。
请把手动导出的 CSV、RIS、BibTeX 或简单 HTML/TXT 放入:
data/input/manual_exports/
当前最小实现优先支持 CSV。CSV 常见字段包括:
source,title,authors,year,journal,doi,url,abstract,keywords
A 版可以对公开 scholar-like 页面做候选文献检索。目前只支持:
googlescholar.pro
scholar.lanfanshu.cn
不会自动登录 ScienceDirect / Web of Science,不处理 CSTCloud,不绕过验证码,不访问受限全文,也不下载受限 PDF。
scholar.lanfanshu.cn 默认使用 requests + BeautifulSoup。googlescholar.pro 如果搜索页需要 JavaScript 渲染,可以设置 fetch_mode: playwright,系统只打开公开搜索结果页、等待渲染并读取 HTML;如果页面出现验证码、登录或异常提示,脚本会记录失败原因并停止,不会尝试绕过。
- 在
data/input/keywords.txt中填写关键词或关键句,每行一个。 - 在
config/query_config.yaml中启用:
search:
enable_public_scholar_search: true
sources:
googlescholar_pro: true
lanfanshu: true
sciencedirect: false
webofscience: false
max_pages_per_source: 2
max_results_per_source: 30
request_delay_seconds_min: 5
request_delay_seconds_max: 10
fetch_mode: playwright
query_mode: broad_then_strictmax_pages_per_source 控制每个站点最多请求多少页。请保持低频请求,不要高频刷新。
fetch_mode 可选:
requests:只用requests + BeautifulSoup。playwright:用 Chromium 渲染公开搜索结果页。auto:先用 requests,如果页面疑似需要 JavaScript 或解析不到结果,再用 Playwright 重试。
query_mode: broad_then_strict 会先构造所有关键词共同出现的 strict query,例如:
"land degradation" "ecological restoration" "policy effect"
然后构造关键词两两组合的 broad queries。检索阶段允许宽召回,因为最终仍由本地全文关键词规则过滤确认。
运行:
python scripts/13_search_public_scholars.py输出:
data/raw/search_results/googlescholar_pro_raw.csv
data/raw/search_results/lanfanshu_raw.csv
data/interim/search_results_raw.csv
如果自动检索失败,查看:
logs/failures.csv
然后退回手动导出模式:把检索结果 CSV/RIS/BibTeX/HTML/TXT 放入 data/input/manual_exports/,再运行 pipeline。脚本不会绕过验证码;如果页面要求人工验证,请停止自动检索,改用手动导出。
如果你已经合法获取某篇文章全文,可手动保存为 txt 到:
data/fulltext/txt/
文件名优先使用文献去重后的 doc_id,例如:
data/fulltext/txt/D000004.txt
也可以使用 DOI 或标题的安全文件名,后续脚本会尝试匹配。
当前真实数据阶段增加了 4 个脚本:
python scripts/14_enrich_metadata.py
python scripts/15_resolve_fulltext_links.py
python scripts/16_fetch_open_fulltext.py
python scripts/17_verify_fulltext_keywords.py它们只使用 Crossref/OpenAlex 等公开元数据接口,以及公开可访问的 OA HTML/PDF 链接。不会自动登录 ScienceDirect / Web of Science,不处理 CSTCloud,不绕过验证码,不破解付费墙,不下载受限 PDF。
关键配置:
keyword_filter:
strict_fulltext_required: true
min_hits_per_keyword: 3
verification_scope: fulltext_required
fulltext:
enable_metadata_enrichment: true
enable_crossref: true
enable_openalex: true
enable_open_access_fetch: true当 match_mode: at_least_k_required、min_required_keywords: 3 且 min_hits_per_keyword: 3 时,4 个关键词中至少 3 个需要在全文 txt 中各出现不少于 3 次,文献才会进入 data/interim/fulltext_matched_keywords_papers.csv。摘要只能作为辅助信息,不能算作全文验证通过。
当前推荐使用:
keyword_filter:
match_mode: at_least_k_required
total_keywords: 4
min_required_keywords: 3
min_hits_per_keyword: 3当前严格概念组规则位于:
config/keyword_groups.yaml
默认不要直接改正式配置。先通过 draft 配置调试:
config/keyword_groups.draft.yaml
本地 UI 可运行:
streamlit run app/strict_config_ui.py保存前 UI 会显示 diff;保存 draft 后可运行 strict validation 和 regression test。只有 validation 与 regression 都通过时,UI 才允许把 draft 提升为正式配置。
无 UI 环境可使用 CLI fallback:
python scripts/107_edit_strict_config_cli.py --show
python scripts/107_edit_strict_config_cli.py --set-min-groups 3 --set-min-hits 2 --validate
python scripts/107_edit_strict_config_cli.py --promote安全边界:min_required_groups 不能低于 3,min_hits_per_group 不能低于 2,policy 和 geospatial 必须保留 core-term requirement,D000031/D000032/D000035 必须保留,D000012/D000033 不能进入 eligible。
data/interim/fulltext_matched_keywords_papers.csv 是当前推荐的通过文件。为了兼容旧 pipeline,系统也会同步写出 data/interim/fulltext_all_keywords_papers.csv,但这个旧文件名现在也使用 at_least_k_required 规则,不再表示“全部关键词必须通过”。
开放全文抓取采用保守策略:只抓明确开放域名或直接 PDF;如果页面出现登录、机构访问、付费墙、人机验证等提示,会标记为 login_required 或 full_text_unavailable。A 版会保存公开 PDF 状态,但 PDF 文本解析可能进入 pdf_saved_text_extraction_pending,后续可单独做 PDF 解析增强。
当前 A 版顺序为:
python scripts/13_search_public_scholars.py # 如果 search.enable_public_scholar_search=true,由 10_run_pipeline.py 自动先运行
python scripts/02_deduplicate_results.py
python scripts/14_enrich_metadata.py
python scripts/21_resolve_journal_names_before_ablesci.py
python scripts/18_filter_candidate_quality.py
python scripts/15_resolve_fulltext_links.py
python scripts/16_fetch_open_fulltext.py
python scripts/17_verify_fulltext_keywords.py
python scripts/03_query_journal_quartile.py
python scripts/19_prepare_ablesci_manual_check.py
python scripts/04_filter_eligible_papers.py
python scripts/07_count_keyword_hits.py
python scripts/08_extract_relevant_passages.py
python scripts/09_generate_markdown.py也可以运行:
python scripts/10_run_pipeline.pydata/interim/keyword_presence_matrix.csv
data/interim/all_keywords_filter.csv
data/interim/all_keywords_papers.csv
keyword_presence_matrix.csv 逐文献逐关键词记录是否出现、命中次数、首次位置和出现区域。
all_keywords_filter.csv 逐文献记录总关键词数、匹配数、缺失关键词、是否通过、是否全文验证和过滤状态。
fulltext_matched_keywords_papers.csv 是当前全文关键词规则通过文件。all_keywords_papers.csv 是早期 available-text 规则的兼容输出,不作为当前严格全文筛选的主输入。
scripts/21_resolve_journal_names_before_ablesci.py 会先用 DOI、Crossref、OpenAlex 和现有元数据尽量补全标准期刊名与 ISSN,输出:
data/interim/journal_names_resolved.csv
如果期刊名仍为空或仍带 …,后续不会拿它去查 AbleSci。
scripts/18_filter_candidate_quality.py 在期刊名补全之后运行,用于优先保留 SCI 1/2 区筛选真正需要的期刊论文候选。
分类规则:
journal_article:publisher、OpenAlex type、Crossref type 等元数据明确显示为 journal article。possible_journal_article:正式期刊名非空,且没有 arXiv、preprint、conference、proceedings、workshop、symposium、thesis、dissertation、book chapter 等非期刊线索。preprint:journal、title、url、source 中包含arxiv、arXiv preprint、preprint、bioRxiv、medRxiv、SSRN等线索。conference:journal、title、source 中包含conference、proceedings、workshop、symposium、Joint European Conference、International Conference、ACM、IEEE Conference、COLING、ACL Findings、Findings of the Association、EMNLP Findings等线索。thesis:title、source 或 ProQuest dissertation URL 中包含 thesis/dissertation 线索。book_chapter:元数据中包含 book chapter 等线索。unknown:缺少足够证据判断为期刊论文。
默认只有 journal_article 和 possible_journal_article 进入:
data/interim/journal_article_candidates.csv
preprint、会议、学位论文、图书章节和未知类型不会进入最终 eligible_papers.csv,但会保留到:
data/output/non_journal_excluded.csv
data/output/candidate_quality_summary.md
data/output/journal_name_manual_resolution_required.csv
如果你确认某条被排除记录已有正式期刊版本,应在真实导出数据或元数据中补充正确期刊名和 DOI 后重新运行 pipeline。
A 版不会在线访问 AbleSci。通过全文关键词规则且 is_journal_candidate=True 的正式期刊候选会进入:
data/interim/journal_quartile_cache.csv
arXiv、preprint、conference、thesis、book chapter 和 unknown 不会写入 journal_quartile_cache.csv。如果某个正式期刊还没有缓存,scripts/03_query_journal_quartile.py 会新增一行待人工复核记录,并写入:
data/output/journal_quartile_pending.csv
为了方便人工维护,运行下面脚本会生成 AbleSci 待查清单:
python scripts/19_prepare_ablesci_manual_check.py输出文件:
data/output/journals_to_check_on_ablesci.csv
AbleSci 在中国 IP 下更稳定。建议打开该 CSV,优先使用 ablesci_search_url_by_issn,其次使用 ablesci_search_url_by_name,然后按“大类或小类任意一个为 1区/2区 即通过”的规则手动补充 data/interim/journal_quartile_cache.csv。
你可以手动根据 AbleSci 查询结果填写:
category_major
major_quartile
category_minor
minor_quartile
all_categories_text
matched_journal_name
issn
ablesci_url
只要 major_quartile、minor_quartile 或 all_categories_text 中出现 1区 或 2区,后续脚本会自动设置 is_q1_or_q2=True。如果分区字段为空,系统会设置 is_q1_or_q2=Unknown、query_status=manual_required、manual_review_required=True,并继续留在人工待查列表里;空分区不代表不符合 SCI 1/2 区。
手动补完分区后,可以重跑:
python scripts/04_filter_eligible_papers.py
python scripts/09_generate_markdown.py或者直接重跑完整流程:
python scripts/10_run_pipeline.pyFenqubiao 2025 是当前推荐的主分区来源,AbleSci 保留为 fallback。Fenqubiao 需要中国 IP 和登录授权;本项目不会保存账号密码,不会自动绕过验证码,也不会默认无登录抓取 Fenqubiao 页面。
推荐流程是手动/半自动填写:
- 生成 Fenqubiao 待查清单和填写模板:
python scripts/25_prepare_fenqubiao_manual_check.py- 打开:
data/output/fenqubiao_quartile_fill_template.csv
-
点击其中的
fenqubiao_search_url。在浏览器中使用中国网络访问 Fenqubiao,并由你人工完成登录授权或验证码。 -
在模板中手动填写:
fenqubiao_subject_major
fenqubiao_major_quartile
fenqubiao_subject_minor
fenqubiao_minor_quartile
all_categories_text
is_q1_or_q2
分区判断规则仍然是:大类分区或小类分区任意一个为 1区 或 2区,则 is_q1_or_q2=True。如果信息为空或不确定,保持 Unknown,不要把空分区当作不符合。
手动填写完成后,建议另存为:
data/output/fenqubiao_quartile_fill_template_by_hand.csv
后续导入脚本会默认优先读取这个 _by_hand.csv 文件。只要该文件存在,scripts/25_prepare_fenqubiao_manual_check.py 不会覆盖它;如需生成新模板,会写到:
data/output/fenqubiao_quartile_fill_template_new.csv
只有显式添加 --overwrite-template 时,才会重写默认的 fenqubiao_quartile_fill_template.csv。
- 导入手动填写结果:
python scripts/26_import_fenqubiao_quartile_fill.py也可以显式指定导入文件:
python scripts/26_import_fenqubiao_quartile_fill.py --input data/output/fenqubiao_quartile_fill_template_by_hand.csv如果需要覆盖已确认的 quartile_source=fenqubiao 且 query_status=manual_cache 记录,必须显式添加 --force。
导入后会更新:
data/interim/journal_quartile_cache_clean.csv
并同步写入旧字段:
category_major = fenqubiao_subject_major
major_quartile = fenqubiao_major_quartile
category_minor = fenqubiao_subject_minor
minor_quartile = fenqubiao_minor_quartile
缓存来源优先级:
- Fenqubiao 2025 手动结果优先,写入
quartile_source=fenqubiao、quartile_year=2025; - AbleSci 自动或手动结果作为 fallback;
- 已确认的
quartile_source=fenqubiao且query_status=manual_cache记录不会被重复导入覆盖,除非你在模板中额外添加force_update=True。
补完 Fenqubiao 分区后运行:
python scripts/26_import_fenqubiao_quartile_fill.py
python scripts/04_filter_eligible_papers.py
python scripts/09_generate_markdown.py如果当前网络可以稳定访问 AbleSci,可以用脚本自动尝试补全 journal_quartile_cache.csv。
建议先在浏览器或终端确认 AbleSci 可访问:
python - <<'PY'
import requests
url = "https://www.ablesci.com/journal/index?keywords=Ecological+Indicators"
r = requests.get(url, timeout=20)
print(r.status_code, len(r.text))
PY然后运行:
python scripts/20_fill_journal_quartile_cache_from_ablesci.py --resume --limit 10 --delay-min 10 --delay-max 25脚本会读取:
data/output/journals_to_check_on_ablesci.csv
data/interim/journal_quartile_cache.csv
并更新:
data/interim/journal_quartile_cache.csv
同时生成:
data/output/ablesci_quartile_fill_report.md
data/raw/ablesci_pages/
data/raw/search_results/ablesci_quartile_diagnostics.csv
安全边界:
- 不绕过验证码;
- 不破解登录;
- 不高频请求,默认每次请求间隔 10-25 秒,默认最多请求 10 个期刊;
- 如果遇到验证码、异常页、空页或解析失败,会标记
manual_required; - 不覆盖
query_status=manual_cache或match_method=manual_cache的用户手动记录; - 不覆盖已经
query_status=auto_found的自动记录; - arXiv、preprint、conference、thesis 不会进入 AbleSci 查询;
- 如果遇到验证码,等待一段时间后重新运行同一条
--resume命令。
如果自动解析失败,请手动补 data/interim/journal_quartile_cache.csv。补完后运行:
python scripts/04_filter_eligible_papers.py
python scripts/09_generate_markdown.py示例:
Ecological Indicators -> major_quartile=2区
Science of the Total Environment -> major_quartile=1区
人工复核列表输出到:
data/output/manual_review_list.csv
以下情况会进入人工复核:
not_verifiable_no_fulltextnot_verifiable_no_textfail_less_than_k_keywordslogin_requiredfull_text_unavailablepreprint、conference、thesis、book_chapter或unknown候选类型strict_fulltext_required=true时只有摘要但没有全文journal_quartile_not_foundjournal_match_uncertainhigh_score_but_no_fulltext- 只缺 1 个关键词、接近通过的文献
data/interim/search_results_raw.csv
data/interim/search_results_dedup.csv
data/interim/metadata_enriched.csv
data/interim/journal_names_resolved.csv
data/interim/journal_article_candidates.csv
data/interim/fulltext_link_candidates.csv
data/interim/fulltext_access_status.csv
data/interim/fulltext_keyword_verification.csv
data/interim/fulltext_matched_keywords_papers.csv
data/interim/fulltext_all_keywords_papers.csv
data/interim/keyword_presence_matrix.csv
data/interim/all_keywords_filter.csv
data/interim/all_keywords_papers.csv
data/interim/journal_quartile_cache.csv
data/interim/eligible_papers.csv
data/interim/keyword_hits.csv
data/interim/extracted_passages.csv
data/output/fulltext_pending_review.csv
data/output/journal_quartile_pending.csv
data/output/journals_to_check_on_ablesci.csv
data/output/non_journal_excluded.csv
data/output/candidate_quality_summary.md
data/output/journal_name_manual_resolution_required.csv
data/output/ablesci_quartile_fill_report.md
data/output/manual_review_list.csv
data/output/final_literature_evidence.md
python scripts/00_init_project.py建议先提交当前 sample 版本,然后再进入真实数据测试:
- 修改
config/query_config.yaml:
run_mode: real- 修改
data/input/keywords.txt,填入真实关键词或关键句。 - 预览真实运行准备操作:
python scripts/11_prepare_real_run.py --dry-run- 确认无误后移动 sample 文件并清理旧输出,默认保留当前手动分区缓存:
python scripts/11_prepare_real_run.py --keep-journal-cache如需清空 sample 分区缓存,使用:
python scripts/11_prepare_real_run.py --clear-journal-cache- 将真实检索结果放入:
data/input/manual_exports/
- 检查真实输入:
python scripts/12_check_real_inputs.py- 运行 pipeline:
python scripts/10_run_pipeline.py- 手动补充
data/interim/journal_quartile_cache.csv中的 AbleSci 分区。 - 再运行一次:
python scripts/10_run_pipeline.py- 查看:
data/interim/eligible_papers.csv
data/output/final_literature_evidence.md
ScienceDirect 检索源采用 manual checkpoint 模式。脚本可以用 Playwright 打开公开搜索结果页,但不会自动登录 ScienceDirect,不会自动登录 CSTCloud,不保存账号密码,不绕过验证码,不破解付费墙,也不抓取受限全文。遇到验证码、机构登录、CSTCloud 或访问确认时,需要你在浏览器中手动完成,然后回到终端按 Enter 继续。
运行:
python scripts/40_search_sciencedirect_manual_checkpoint.py --manual-checkpoint --limit 50输出:
data/raw/search_results/sciencedirect_raw.csv
data/interim/search_results_raw.csv
data/raw/search_pages/sciencedirect/
sciencedirect_raw.csv 单独保存 ScienceDirect 检索结果。search_results_raw.csv 会合并保留:
googlescholar.proscholar.lanfanshu.cnScienceDirect
每条 ScienceDirect 检索记录的 source 字段为 ScienceDirect。该脚本只解析搜索结果页题录元数据,包括标题、作者、年份、期刊、DOI、链接和 snippet,不访问受限全文。
如果你希望完整 pipeline 自动先跑 ScienceDirect 检索,需要在 config/query_config.yaml 中设置:
search:
sources:
sciencedirect: true手动 checkpoint 检索完成后,可以继续运行:
python scripts/02_deduplicate_results.py
python scripts/14_enrich_metadata.py
python scripts/15_resolve_fulltext_links.py
python scripts/16_fetch_open_fulltext.py
python scripts/17_verify_fulltext_keywords.py该模块用于复用你已经手动登录、已经完成机构授权的 Chrome 会话来获取 ScienceDirect 全文。它不会自动登录 ScienceDirect,不会自动登录 CSTCloud,不保存账号密码,不绕过验证码,不破解付费墙,只处理你合法可访问的全文。
运行顺序:
python scripts/30_prepare_sciencedirect_candidates.py
bash scripts/31_launch_chrome_sciencedirect_debug_macos.sh第二步会打开一个独立 Chrome profile,默认 remote debugging port 为 9222,user-data-dir 为:
/tmp/paper_grab_chrome_sciencedirect_profile
请在打开的 Chrome 中人工完成:
- ScienceDirect 登录;
- CSTCloud 或机构认证;
- 验证码或人工验证;
- 必要时打开一篇目标文章并点击一次 View PDF。
完成后保持 Chrome 窗口打开,再运行:
python scripts/32_fetch_sciencedirect_live_session.py --debug-port 9222 --limit 10
python scripts/33_update_fulltext_status_from_sciencedirect.py
python scripts/17_verify_fulltext_keywords.py
python scripts/04_filter_eligible_papers.py
python scripts/09_generate_markdown.py输出文件:
data/interim/sciencedirect_candidates.csv
data/interim/sciencedirect_live_fetch_status.csv
data/fulltext/pdf/{doc_id}.pdf
data/fulltext/txt/{doc_id}.txt
如果遇到登录页、验证码、403、access denied、expired PDF URL、或没有全文权限,脚本只会记录状态,不会绕过或继续强行访问。scripts/33_update_fulltext_status_from_sciencedirect.py 会把成功获得的 txt 标记为:
access_method=sciencedirect_live_session
access_status=sciencedirect_live_session_txt
随后 scripts/17_verify_fulltext_keywords.py 会把该 txt 当作合法全文来源进行关键词验证。
如果 data/interim/sciencedirect_live_fetch_status.csv 中有 captcha_required、login_required、pdf_url_expired_or_403 或 access_denied,可以先生成重试清单:
python scripts/39_prepare_sciencedirect_retry_list.py输出:
data/interim/sciencedirect_retry_candidates.csv
data/output/sciencedirect_retry_plan.md
默认不会重试 no_fulltext_access,因为这通常表示当前机构权限下没有全文;如果你确认上次只是没有完成机构登录,可以显式加入:
python scripts/39_prepare_sciencedirect_retry_list.py --include-no-access随后运行交互式 checkpoint runner:
python scripts/40_run_sciencedirect_interactive_retry.py脚本会提示你打开带 remote debugging 的 Chrome。请在 Chrome 中人工完成:
- ScienceDirect 验证码;
- 机构登录 / CSTCloud 登录;
- 任何必须由真人完成的验证;
- 打开任意一篇 ScienceDirect 文献并确认可以看到全文或
View PDF。
完成后回到终端按 Enter,脚本会继续运行:
python scripts/32_fetch_sciencedirect_live_session.py --input data/interim/sciencedirect_retry_candidates.csv --debug-port 9222 --limit 10 --sleep 15
python scripts/33_update_fulltext_status_from_sciencedirect.py
python scripts/17_verify_fulltext_keywords.py
python scripts/04_filter_eligible_papers.py
python scripts/09_generate_markdown.py
python scripts/35_generate_pipeline_status_report.py输出:
data/output/sciencedirect_interactive_retry_report.md
如果批量 retry 后仍然停在 captcha_required,推荐改用更稳的单篇人工 checkpoint 模式。先诊断当前 Chrome tab:
python scripts/42_diagnose_current_sciencedirect_tab.py --debug-port 9222输出:
data/output/current_sciencedirect_tab_diagnostics.md
然后对单篇文献运行,例如:
python scripts/41_sciencedirect_manual_page_fetch.py --doc-id D000031 --debug-port 9222脚本会打开该文献页面并暂停。请在 Chrome 页面里人工完成 ScienceDirect 验证码、access through institution、CSTCloud/机构登录,并确认能看到全文或 View PDF。完成后回到终端按 Enter,脚本才会读取当前页面并尝试保存:
data/fulltext/pdf/{doc_id}.pdf
data/fulltext/html/{doc_id}_sciencedirect_live.html
data/fulltext/txt/{doc_id}.txt
data/interim/sciencedirect_manual_page_fetch_status.csv
单篇成功后继续运行:
python scripts/33_update_fulltext_status_from_sciencedirect.py
python scripts/17_verify_fulltext_keywords.py
python scripts/04_filter_eligible_papers.py
python scripts/09_generate_markdown.py
python scripts/35_generate_pipeline_status_report.py这个流程不会保存账号密码,不会自动登录,不会绕过验证码,不会破解付费墙;它只在你已经人工完成授权的 Chrome live session 中继续处理你合法可访问的全文。
当检索、全文获取、关键词验证、Fenqubiao 分区和最终报告都跑过几轮后,可以用总控状态报告快速判断当前卡在哪一步:
python scripts/35_generate_pipeline_status_report.py输出:
data/output/pipeline_status_report.md
data/output/pipeline_status_summary.csv
pipeline_status_report.md 会汇总候选文献数量、去重数量、元数据补全数量、全文获取状态、ScienceDirect live session 状态、全文关键词验证状态、Fenqubiao/SCI 分区状态、最终 eligible 文献列表,并自动判断当前主要瓶颈和下一步建议。
pipeline_status_summary.csv 是机器可读摘要,字段为:
metric,value,source_file,note
本项目不自动登录 Web of Science,不保存账号密码,也不绕过 CSTCloud、机构认证或验证码。推荐流程是手动导出,再由本地脚本解析合并:
- 在浏览器中手动登录 Web of Science。
- 使用 Basic Search 或 Advanced Search 检索目标关键词。
- 在结果页选择需要导出的记录。
- 导出为 CSV、RIS 或 BibTeX,字段尽量包含 title、authors、year、source title、DOI、URL、abstract、keywords。
- 将导出文件放入:
data/input/manual_exports/
- 运行:
python scripts/60_import_wos_manual_exports.py脚本输出:
data/raw/search_results/wos_raw.csv
data/interim/search_results_raw.csv
重复运行时,脚本会先移除旧的 source=Web of Science 导入行,再追加本次解析结果,避免同一批手动导出记录重复堆叠。