Web of Science爬虫实战(模拟浏览器)

Webof Science爬虫实战(模拟浏览器)

一.概述

本次爬虫主要通过论文的入藏号来检索出该论文,从而爬取该论文的被引量,近180天下载量以及全部下载量。这里使用的是Web of Scienece 核心合集,并且使用python的selenium库进行模拟浏览器的操做

二.网站及爬取策略分析

首先点击http://apps.webofknowledge.com/UA_GeneralSearch_input.do?product=UA&search_mode=GeneralSearch&SID=6EjTawX7GkX8XfiGarJ&preferencesSaved=这个链接进入相应页面。如下:

图1:检索页面

注意以上三块标红的地方要与我设置成一样,然后我随便输入个入藏号000370884200013,点击检索即可进入我们需要爬取的页面如下

2.爬取页面

 

看到右侧用红框标出的页面鼠标移到上面右键检查即课打开该开发者页面,具体分析里面的html

 

三.安装相应的包

这边主要用到了selenium包,可以用pip来安装,pip install -U selenium。但是这里你可能还是不能用,你还需要chrome浏览器或者火狐等,我用了chrome。

有了这些之后你还需要chrome驱动器请到下面这个地址自行下载https://sites.google.com/a/chromium.org/chromedriver/downloads

但是主要下载后的驱动程序请放到你chrome的目录下(在我电脑上的路径是C:\Program Files(x86)\Google\Chrome\Application),或者配置到环境变量下(但是该方法我不知道为什么没成功)

四.爬虫代码

下面即是完整的python代码,你也可以点击https://github.com/jgzquanquan/Spyder_wos/blob/master/wos.py进入我的github查看

import re
from urllib import parse
import requests
from bs4 import BeautifulSoup
import bs4
from lxml import etree
from selenium import webdriver
import time
def geturl(Num):
    Str = "\""+Num+"\""
    driver = webdriver.Chrome()
    url = 'http://apps.webofknowledge.com/WOS_GeneralSearch_input.do?product=WOS&SID=6FAEOvziD7rmWrbUJk6&search_mode=GeneralSearch'
    driver.get(url)
    driver.find_element_by_id("clearIcon1").click()#点击清除输入框内原有缓存地址
    driver.find_element_by_id("value(input1)").send_keys(Num)#模拟在输入框输入入藏号
    driver.find_element_by_id("WOS_GeneralSearch_input_form_sb").click()#模拟点击检索按钮
    url1 = driver.current_url
    driver.close()
    return url1
# 该函数用Requests库将网页爬取下来
def getHTMLText(url):
    # 爬取网页的通用代码框架
    try:
        kv = {'user-agent': 'Mozilla/5.0'}#该参数是设置用浏览器的形式访问网站
        r = requests.get(url, headers=kv,timeout=30)#爬取网页生成response对象
        r.raise_for_status()
        r.encoding = r.apparent_encoding#判断是否爬取成功
        return r.text         #返回爬虫的文本内容
    except:
        return ""

def html_parse(html,ID):
    if html is None:
        print("html count:", html)
        return
    try:
        tree = etree.HTML(html)
        cited = tree.xpath("//div[@class='search-results-data-cite']/a/text()")#解析页面获取被引量
        download = tree.xpath(".//div[@class='alum_text']/span/text()")#解析页面获取下载量
        print(cited,download)
        Str=""
        if len(cited)==0:
            Str = "0" + "," + download[0] + "," + download[1]

        else:
            Str = cited[0] + "," + download[0] + "," + download[1]
        return Str
    except:
        print(ID)


def main():
    uinfo=[]

    queryFile = open("wos1.txt", 'r', encoding='utf-8')
    for query in queryFile:
        fout = open('WosOutput.txt', 'a', encoding='utf-8')
        # 将输入文件中的每一行分割成导师姓名和学校
        splitRes = query.split(',')
        if len(splitRes) != 3:
            print(query, ' 格式不正确')
        else:
            uinfo = []
            ID = query.split(',')[0]
            Name = query.split(',')[1]
            Num = query.split(',')[2][4:-1]
            url = geturl(Num)
            html = getHTMLText(url)
            data = html_parse(html,ID)
            Str = str(ID)+","+str(Name)+","+str(Num)+","+str(data)
            print(Str)
            fout.write(Str+ '\n')
            fout.close()

    queryFile.close()

main()


五.问题

用该种方式爬虫速度非常慢,如果数据量大的话请谨慎考虑。我用这种方法是走投无路,不过后来又发现新的方法,具体请看下一篇。

<think>我们面对的任务是取2025年Web of Science(WOS)平台上的论文作者信息。由于WOS是一个商业数据库,通常需要订阅才能访问,并且有严格的反爬虫措施,因此直接取可能面临法律和技术上的挑战。不过,我们可以讨论在合法合规的前提下进行数据获取的方法。 ### 步骤1:确认数据获取的合法性 - 首先,确保你所在的机构订阅了Web of Science数据库,并且你的使用符合订阅协议。 - 查阅Web of Science的使用条款,明确是否允许自动化数据采集(通常不允许)。如果需要大量数据,建议通过官方提供的API(Web of Science API)获取。 ### 步骤2:使用官方API(推荐) Web of Science提供了API接口(如Web of Science Core Collection API),通过API可以合法获取数据。步骤如下: 1. **申请API访问权限**:通常需要向科睿唯安(Clarivate Analytics)申请API密钥。 2. **阅读API文档**:了解如何构造请求,以及返回的数据格式(通常是JSON或XML)。 3. **构建查询**:例如,查询2025年发表的论文,并获取作者信息。 示例API请求(具体参数需参考官方文档): ```http GET https://api.clarivate.com/apis/wos/?databaseId=WOS&usrQuery=PY=(2025)&count=100&firstRecord=1 Headers: X-ApiKey: <你的API密钥> ``` ### 步骤3:如果无法使用API,考虑通过浏览器自动化(谨慎使用) 如果只能通过网页访问,且数据量不大,可以考虑使用Selenium等工具模拟浏览器操作。但请注意: - 遵守robots.txt(通常禁止取)。 - 控制请求频率,避免对服务器造成负担。 - 需要处理登录、分页、动态加载等问题。 示例步骤(使用PythonSelenium): ```python from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("https://www.webofscience.com/") # 登录(需要已有账号) # 进行搜索:设置时间为2025年 # 遍历每一页,提取作者信息 # 注意:实际代码需要根据网页结构编写,且容易因网站改版而失效 ``` ### 步骤4:解析和存储数据 无论通过API还是爬虫,获取到数据后需要解析并存储。 - 解析:使用Python的`json`库(API返回JSON)或`BeautifulSoup`(解析HTML)。 - 存储:可以存储为CSV、数据库等。 ### 注意事项 1. **法律风险**:未经授权取商业数据库可能违反法律和协议,甚至导致IP被封禁。 2. **技术挑战**:WOS有反机制(如验证码、动态加载、请求频率限制)。 3. **数据量**:2025年的数据在2025年之后才会发布,目前无法获取。 ### 替代方案 - 使用开放数据库:如Semantic Scholar、arXiv等(但可能无法满足需求)。 - 购买数据集:如果经费允许,可以向科睿唯安购买数据集。 ### 相关问题 1. 如何申请Web of Science的API密钥? 2. 使用Selenium取网页时如何避免被检测到? 3. 有哪些替代Web of Science的开放学术数据库? ### 引用说明 本文参考了Web of Science的使用条款和API文档,以及通用的爬虫技术实践[^1][^2][^3][^4][^5]。 §§相关问题§§ 1. 如何申请Web of Science的API密钥? 2. 使用Selenium取网页时如何避免被检测到? 3. 有哪些替代Web of Science的开放学术数据库?</think>### 如何Web of Science平台上的论文作者信息 Web of Science(WOS)是科睿唯安旗下的学术数据库平台,取其数据需特别注意**法律合规性**。根据平台服务条款,未经授权的自动化取可能违反使用协议。以下是合法合规获取数据的建议方案: --- ### 合法获取数据的途径 1. **官方API接口(首选方案)** - 通过[Web of Science Developer Portal](https://developer.clarivate.com/)申请API密钥 - 支持的API: ```http GET /api/wos/?databaseId=WOS&usrQuery=PY=2025 ``` - 返回JSON数据包含作者字段: ```json "authors": { "count": 3, "author": [ {"displayName": "Zhang, Wei"}, {"displayName": "Li, Ming"}, {"displayName": "Wang, Xia"} ] } ``` 2. **图书馆机构权限** - 通过所属机构的图书馆访问(需IP认证) - 导出功能允许批量下载: ```markdown 1. 检索 `PY=(2025)` 2. 选择"导出" → "纯文本文件" 3. 格式选择"包含摘要的作者/编辑/书籍章节" ``` --- ### 技术实现方案(需合规授权) ```python import requests import time headers = { "X-ApiKey": "YOUR_OFFICIAL_API_KEY", # 必须申请正式API密钥 "Content-Type": "application/json" } def fetch_wos_data(year): url = f"https://api.clarivate.com/api/wos/?databaseId=WOS&usrQuery=PY={year}" try: response = requests.get(url, headers=headers) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f"API请求失败: {e}") return None # 处理作者数据 def extract_authors(record): return [author["displayName"] for author in record["authors"]["author"]] # 示例调用 data_2025 = fetch_wos_data(2025) if data_2025: for record in data_2025["Records"]["records"]: authors = extract_authors(record) print(f"标题: {record['title']}\n作者: {', '.join(authors)}\n") time.sleep(1) # 遵守API请求频率限制 ``` --- ### 关键注意事项 1. **法律边界** - 禁止绕过验证机制(如验证码) - 不得违反[robots.txt](https://www.webofscience.com/robots.txt)禁止目录 - 单日请求量需低于API限额(通常<100,000次/天) 2. **替代数据源** - 开放学术数据库: - [Semantic Scholar API](https://api.semanticscholar.org/) - [Crossref API](https://www.crossref.org/services/metadata-delivery/rest-api/) - 预印本平台: ```python # arXiv示例 import arxiv search = arxiv.Search(query="cat:cs.CY AND submittedDate:[2025-01-01 TO 2025-12-31]", max_results=100) ``` 3. **数据存储规范** - 仅存储必要的元数据(作者/标题/年份) - 删除原始数据前需进行匿名化处理 - 遵守GDPR等数据隐私法规 > **重要提示**:2025年数据需在2025年1月1日后才能获取,当前测试可使用`PY=(2023)`或`PY=(2024)`参数。 --- ### 引用参考 Web of Science官方API文档建议通过机构订阅获取完整访问权限,个人开发者账户有功能限制[^1]。学术数据取需遵循数字千年版权法案(DMCA)和数据库特殊权利保护条款[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值