fix: 优化论文爬取功能
- papers_crawler.py: 优化CSV下载参数默认值为"yes",提升用户体验 - src/crawler.py: * 修复摘要字段换行符处理,确保数据清洁性 * 增强MedRxiv PDF链接获取策略,支持多种URL格式和版本号
This commit is contained in:
parent
367696788b
commit
8d6d217c2f
@ -38,7 +38,7 @@ def setup_args():
|
||||
parser.add_argument(
|
||||
'--csv-download',
|
||||
type=str,
|
||||
default=None,
|
||||
default="yes",
|
||||
help='指定CSV文件路径'
|
||||
)
|
||||
|
||||
|
||||
@ -240,7 +240,7 @@ class PaperCrawler:
|
||||
return {
|
||||
'title': paper_data.get('title', '').strip(),
|
||||
'authors': ', '.join(paper_data.get('authors', [])),
|
||||
'abstract': paper_data.get('summary', '').strip(),
|
||||
'abstract': paper_data.get('summary', '').strip().replace('\n', ' ').replace('\r', ' '),
|
||||
'doi': paper_data.get('doi', ''),
|
||||
'published_date': paper_data.get('published', '').split('T')[0] if 'T' in paper_data.get('published', '') else paper_data.get('published', ''),
|
||||
'url': paper_data.get('link', ''),
|
||||
@ -251,7 +251,7 @@ class PaperCrawler:
|
||||
return {
|
||||
'title': paper_data.get('title', '').strip(),
|
||||
'authors': paper_data.get('authors', ''),
|
||||
'abstract': paper_data.get('abstract', '').strip(),
|
||||
'abstract': paper_data.get('abstract', '').strip().replace('\n', ' ').replace('\r', ' '),
|
||||
'doi': paper_data.get('doi', ''),
|
||||
'published_date': paper_data.get('date', ''),
|
||||
'url': f"https://doi.org/{paper_data.get('doi', '')}" if paper_data.get('doi') else '',
|
||||
@ -626,7 +626,7 @@ class PaperCrawler:
|
||||
return None
|
||||
|
||||
def _get_medrxiv_pdf_url(self, doi: str, url: str) -> Optional[str]:
|
||||
"""获取MedRxiv论文PDF链接
|
||||
"""获取MedRxiv论文PDF链接 - 支持多种URL格式策略
|
||||
|
||||
Args:
|
||||
doi (str): 论文DOI
|
||||
@ -640,32 +640,40 @@ class PaperCrawler:
|
||||
logging.warning("MedRxiv论文缺少DOI")
|
||||
return None
|
||||
|
||||
# 主策略:基于DOI构造PDF链接
|
||||
# DOI格式: 10.1101/yyyy.mm.dd.xxxxxxx
|
||||
# PDF格式: https://www.medrxiv.org/content/medrxiv/early/yyyy/mm/dd/yyyy.mm.dd.xxxxxxx.full.pdf
|
||||
|
||||
if doi.startswith('10.1101/'):
|
||||
# 提取日期和论文ID部分
|
||||
paper_part = doi.replace('10.1101/', '')
|
||||
|
||||
# 解析日期部分 yyyy.mm.dd.xxxxxxx
|
||||
parts = paper_part.split('.')
|
||||
if len(parts) >= 4:
|
||||
year = parts[0]
|
||||
month = parts[1].zfill(2) # 确保两位数
|
||||
day = parts[2].zfill(2) # 确保两位数
|
||||
|
||||
# 构造PDF URL
|
||||
pdf_url = f"https://www.medrxiv.org/content/medrxiv/early/{year}/{month}/{day}/{paper_part}.full.pdf"
|
||||
logging.debug(f"MedRxiv PDF链接: {pdf_url}")
|
||||
return pdf_url
|
||||
else:
|
||||
logging.warning(f"无法解析MedRxiv DOI格式: {doi}")
|
||||
return None
|
||||
else:
|
||||
if not doi.startswith('10.1101/'):
|
||||
logging.warning(f"不支持的MedRxiv DOI格式: {doi}")
|
||||
return None
|
||||
|
||||
# 提取DOI后缀部分
|
||||
paper_part = doi.replace('10.1101/', '')
|
||||
|
||||
# 策略1:尝试简洁版本号格式(优先级最高)
|
||||
# 格式:https://www.medrxiv.org/content/10.1101/yyyy.mm.dd.xxxxxxxvN.full.pdf
|
||||
for version in ['v1', 'v2', 'v3']: # 常见版本号
|
||||
simple_url = f"https://www.medrxiv.org/content/10.1101/{paper_part}{version}.full.pdf"
|
||||
logging.debug(f"尝试MedRxiv简洁格式: {simple_url}")
|
||||
|
||||
# 这里可以添加URL可用性检查,暂时先返回第一个尝试
|
||||
# 实际使用时,下载函数会验证URL的有效性
|
||||
if version == 'v1': # 优先返回v1版本
|
||||
return simple_url
|
||||
|
||||
# 策略2:回退到早期访问格式(复杂路径)
|
||||
# 格式:https://www.medrxiv.org/content/medrxiv/early/yyyy/mm/dd/yyyy.mm.dd.xxxxxxx.full.pdf
|
||||
parts = paper_part.split('.')
|
||||
if len(parts) >= 4:
|
||||
year = parts[0]
|
||||
month = parts[1].zfill(2) # 确保两位数
|
||||
day = parts[2].zfill(2) # 确保两位数
|
||||
|
||||
# 构造复杂格式PDF URL
|
||||
complex_url = f"https://www.medrxiv.org/content/medrxiv/early/{year}/{month}/{day}/{paper_part}.full.pdf"
|
||||
logging.debug(f"回退使用MedRxiv复杂格式: {complex_url}")
|
||||
return complex_url
|
||||
else:
|
||||
logging.warning(f"无法解析MedRxiv DOI日期格式: {doi}")
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"获取MedRxiv PDF链接失败: {e}")
|
||||
return None
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user