如何快速爬取国内985大学学术学报pdf文件

news2024/11/25 4:22:13

背景

最近,在爬取关于国内985大学的学报时,我注意到大部分大学学报站点格式都采用相似的形式,并且PDF链接都使用自增的ID。然而,我也发现了一个问题,即大多数PDF链接的ID并不是连续的。现在我将向你分享一些方法,以快速获取所有的大学学报PDF链接。

首先通过最新期刊和最旧的期刊查找pdf链接的id范围:
最新期刊为 2023-03-20
最旧期刊为 2013-01-30
在这里插入图片描述
点击进去后下载pdf后,在开发者工具可以发现链接上的id最大在1000左右,最小的id在个位数。

当我们请求不存在的id会发现response.headers.get(‘Content-Type’)为html类型,而正确的id响应类型则为application/x-download。

response = session.get(
    f'http://journal.pku.edu.cn/CN/article/downloadArticleFile.do?attachType=PDF&id=105',  #id为105,不正确的id
    cookies=cookies,
    headers=headers,
	verify=False)

print(response.headers.get('Content-Type') )

输出:

text/html;charset=UTF-8

response = session.get(
    f'http://journal.pku.edu.cn/CN/article/downloadArticleFile.do?attachType=PDF&id=1',
    cookies=cookies,
    headers=headers,
stream=True, verify=False)
print(response.headers.get('Content-Type') )

输出:

application/x-download

如果使用head请求虽然可以快速获取所有响应类型,而无需请求响应体。但这里如果你发现使用requests.head方法返回的headers和使用requests.get方法返回的headers不一致,那可能是由于服务器对不同类型请求返回的header信息不同导致的。

我们可以通过覆盖爬取获取每个刊期不同链接上的id,但需要写一堆xpath或正则,所有这里不使用这个方法。

快速爬取pdf链接

我们可以使用request的stream=True方法快速请求url获取pdf链接

在requests库中,stream参数用于控制响应是否以流的方式进行处理。默认情况下,stream参数的值为False,表示禁用流式处理,整个响应内容会一次性加载到内存中。
当stream参数设置为True时,表示启用流式处理,响应内容会以流的形式逐步传输,而不是一次性加载到内存中。这在处理大型响应体或需要逐步处理数据的情况下很有用。
当stream为True时,可以使用close方法关闭请求,就不需要进行请求响应体,可以节省更多资源和时间去请求其他url

完整代码:

import requests,time
from requests.adapters import HTTPAdapter, Retry
import threading

url_id = []
def get_response(id):
    cookies = {
        'JSESSIONID': '1EEC758D35D23CE4721E1419871575C6',}
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Language': 'zh-CN,zh;q=0.9,ja;q=0.8',
        'Connection': 'keep-alive',
        'Range': 'bytes=0-0.1' ,
        # 'Cookie': 'JSESSIONID=1EEC758D35D23CE4721E1419871575C6',
        'Referer': 'http://journal.pku.edu.cn/CN/abstract/abstract1015.shtml',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    }
    session = requests.Session()
    retries = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])
    session.mount('http://', HTTPAdapter(max_retries=retries))

    response = session.get(
        f'http://journal.pku.edu.cn/CN/article/downloadArticleFile.do?attachType=PDF&id={id}',
        cookies=cookies,
        headers=headers,
    stream=True, verify=False)
    if response.headers.get('Content-Type') == 'application/x-download':
        response.close
        url_id.append(id)
    else:
        print('无效id-------',id,response.headers.get('Content-Type'))
    return response.headers.get('Content-Type') 

threads = []
for i in range(2000):
    thread = threading.Thread(target=get_response, args=(i,))
    thread.start()
    threads.append(thread)

for td in threads:
    td.join()

输出:

在这里插入图片描述

通过输出可以发现id不是连续的,并且代码运行耗时1分半钟,速度也比直接get请求不使用stream=True快出几十倍。

通过请求上述代码中的url_id 列表里的有效id,我们就可以直接下载pdf了。这个站点pdf数据不多,但国内大学站点大部分都可以采用这种形式爬取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/770731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图采样、随机游走、subgraph的实现

诸神缄默不语-个人CSDN博文目录 本博文主要关注如何用代码实现图采样、随机游走、subgraph(为什么这些东西放在一起写,我感觉还蛮直觉的)。 随机游走和subgraph我之前都写过不少博文了,可以参考↑ 这个主要是我前年还在干GNN时候…

AtcoderABC247场

A - Move RightA - Move Right 题目大意 要求判断在一行4个方块上的人进行向右移动后,是否每个方块上都有人。初始状态下,给定一个由0和1组成的长度为4的字符串S,其中1表示对应方块上有人,0表示没有人。每个人同时向右移动一格&a…

Java控制台+activiti+springboot+mybatis实现账务报销工作流程

Java控制台activitispringbootmybatis实现账务报销工作流程 一、系统介绍二、功能展示1.代码展示2.员工报销3.账务审批4.总经理审批 三、代码展示四、获取源码 一、系统介绍 系统主要功能: 员工:填写报销单 账务审批:报销金额小于1000账务经…

智能电表数据采集器

智能电表数据采集器是一种用于采集智能电表数据的设备,它可以将智能电表的数据传输到远程服务器上,以便进行数据分析和监控。智能电表数据采集器的主要功能是采集智能电表的实时数据,并将其发送到远程服务器上,从而实现对智能电表…

能源监测系统:实时监控+数据可视化

能源监测系统是应用物联网技术,对水、电、气、热等能源进行实时监测的系统,能够对各种设备数据进行智能化标准化的管理,从而建立起统一的管理优化平台,是积极响应国家节能降耗政策的典型模范,也是企业建设节能型工厂的…

【C++】-stack和queue的具体使用以及模拟实现(dqeue的介绍+容器适配器的介绍)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

MySQL第六章、JDBC编程

目录 一、数据库编程的必备条件 二、Java的数据库编程:JDBC 三、JDBC工作原理 四、JDBC使用 4.1JDBC开发案例 一、数据库编程的必备条件 编程语言,如Java,C、C、Python等数据库,如Oracle,MySQL,SQL S…

uniapp 正常显示editor富文本编辑器的内容

如果不添加editor的样式文件&#xff0c;空格、图片都会显示不正常&#xff0c;需要按照官方文档提示&#xff0c;第一添加样式&#xff0c;第二&#xff0c;设置对应的显示方式。 一、下载editor样式 二、我使用的是rich-text组件&#xff0c;来显示html字符串 <template&…

数据可视化——根据提供的数据,将数据经过处理后以折线图的形式展现

文章目录 前言处理数据获取数据筛选数据将JSON数据转换为Python数据筛选出横坐标数据和纵坐标数据 根据处理后的数据绘制折线图整体代码展示 前言 前面我们学习了如何使用 pyecharts 模块绘制简单的折线图&#xff0c;那么今天我将为大家分享&#xff0c;如何根据提供的数据将…

掘金量化—Python SDK文档—4.数据结构

目录 Python SDK文档 4.数据结构 4.1数据类 Tick - Tick 对象 报价quote - (dict 类型) Bar - Bar 对象 L2Order - Level2 逐笔委托 L2Transaction - Level2 逐笔成交 4.2交易类 Account - 账户对象 Order - 委托对象 ExecRpt - 回报对象 Cash - 资金对象 Position - 持仓对象…

ylb-接口5产品详情

总览&#xff1a; 1、service处理&#xff08;根据产品id &#xff0c;查询产品信息&#xff09; 在api模块下service包&#xff0c;ProductService接口添加新方法&#xff08;根据产品id &#xff0c;查询产品信息queryById(Integer id)&#xff09;&#xff1a; package …

微服务——技术栈+概念+远程调用案例

目录 微服务技术栈 认识微服务 微服务架构演变 总结 微服务技术对比 SpringCloud springcloud和springboot的对应版本 ​编辑 服务拆分 注意事项 入门案例 远程调用 步骤一 :注册ResTemplate 步骤二&#xff1a;修改service层代码 微服务技术栈 将一个大的项目拆分出…

GUI-Menu菜单实例(颜色+线型菜单)

运行代码&#xff1a; //GUI-Menu菜单实例&#xff08;颜色线型菜单&#xff09; #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struc…

2.4G天线(一)

一、概念 1.1、波: 波是指振动的传播。 将某一物理量的扰动或振动在空间逐点传递时形成的运动称为波&#xff0c;波动是物质运动的重要形式。 1.2、电磁波&#xff1a; 电磁波是能量的一种&#xff0c;属于一种波。是由同相振荡且互相垂直的电场与磁场在空间…

pico添加devmem2读写内存模块

devmem2读写内存 自定义msh命令devmem2验证msh命令devmem2读CPUID读写全局变量 devmem2模块可实现对设备寄存器的读写操作。在RT-Thread的命令行组件Fish中添加devmem2模块&#xff0c;用户可在终端输入devmem2相关命令&#xff0c;FinSH根据输入对指定寄存器进行读写&#xff…

springboot整合feign实现RPC调用,并通过Hystrix实现服务降级

目录 一、服务提供者 二、服务消费者 三、测试效果 四、开启Hystrix实现服务降级 feign/openfeign和dubbo是常用的微服务RPC框架&#xff0c;由于feigin内部已经集成ribbon&#xff0c;自带了负载均衡的功能&#xff0c;当有多个同名的服务注册到注册中心时&#xff0c;会根…

Pycharm安装dlib

目录 一、下载dilb 二、使用pip安装dlib库(亲测有效) 三、使用Pycharm安装(未使用) 一、下载dilb 官方网址:德利卜 皮皮 (pypi.org) 二、使用pip安装dlib库(亲测有效) 将下载好的whl文件放入工程文件中 接下来使用Python自带的pip进行安装 1.winR2.输入cmd&#xff0c;回车…

vue3+vite+ts+vant 开发浙里办H5应用流程和注意事项

vue3vitets 开发浙里办H5应用流程和注意事项 最近有个项目是要开发到浙里办的一个H5项目,记录一些问题; 浙里办irs系统内node版本和npm版本如下建议切到他们的版本再进行开发这样问题少一点 1.因为浙里办有自己的irs系统 需要吧前端整体的代码传上去 除了 打包后的dist 和 no…

Vue实现阻止浏览器记住密码功能的三种方法

通常浏览器会主动识别密码表单&#xff0c;在你登录成功之后提示保存密码 &#xff0c; 密码保存到浏览器的 密码管理器中 ( 如下是谷歌浏览器 ) 这种行为是浏览器的行为 &#xff0c;这种操作也是为了方便用户的使用 现在的一个需求是要阻止这个保存密码的弹窗提示 登录页账…

【AutoGluon_01】安装与示例

文章目录 一、安装二、示例一 AutoGluon预测目标数据1、导入数据2、训练3、预测4、评估5、小结 三、示例二 AutoGluon多模态预测&#xff08;Multimodal Prediction&#xff09;1、导入数据2、训练3、预测4、评估 四、示例三 AutoGluon进行时间序列预测1、导入数据2、训练3、预…