文章目录

  • 前言
  • 原有爬取脚本
  • 修正后的爬取脚本

前言

个人需要爬取一些论文资料,所以根据CSDN上已有的代码进行修改,完成了一个可以根据dblp检索结果爬取论文的脚本。arxiv.py是爬取检索结果中下载链接给的是arxiv开源链接的论文。ICML.py是爬取检索结果中下载链接给的是PMLR链接的论文。

原有爬取脚本

最初的爬取脚本,转载自博客:https://blog.csdn.net/weixin_42781851/article/details/89086048

import urllib.request
import re
import osreq = urllib.request.Request('https://dblp.uni-trier.de/search?q=Reinforcement%20Learning%20Decision')
response = urllib.request.urlopen(req)
the_page = response.read().decode('utf-8')paper_title = re.findall('<span class="title" itemprop="name">(.*?)</span>',the_page,re.S)
paper_web = re.findall('view</b></p><ul><li><a href="(.*?)" itemprop="url">',the_page,re.S)def get_pdf_arxiv(web_site,path):rep = urllib.request.urlopen(urllib.request.Request(web_site))page = rep.read().decode('utf-8')pdf_download = re.findall('<meta name="citation_pdf_url" content="(.*?)"/>',page,re.S)print(pdf_download[0])if (len(pdf_download) != 0):try:u = urllib.request.urlopen(pdf_download[0])except urllib.error.HTTPError:print(pdf_download[0], "url file not found")returnblock_sz = 8192with open(path, 'wb') as f:while True:buffer = u.read(block_sz)if buffer:f.write(buffer)else:breakprint("Sucessful to download " + path)for i in range(len(paper_web)):if (paper_web[i].find("arxiv") != -1):list = paper_title[i].split(" ")paper_title[i] = "_".join(list)list = paper_title[i].split(":")paper_title[i] = "_".join(list)print(paper_title[i])path_dir = "C:\\Users\\xxxx\\Desktop\\desktop\paper\\RL_Decision\\"dir_list=os.listdir(path_dir)path = paper_title[i] + "pdf"if path not in dir_list:get_pdf_arxiv(paper_web[i], path_dir + path)

非常感谢这位博主提供的爬取思路,但是在使用的过程中,出现了如下问题:
1.dblp的页面有了一些变化,爬取会报错。
2.dblp采取了懒加载的策略,直接访问查询路径只能爬取最多30条数据。

修正后的爬取脚本

以下arxiv.py和上面原爬取脚本功能相似,并解决了懒加载的问题。将原有url改为dblp懒加载查询的url,并自增查询的页数b即可。可以根据查询的结果条数/30,来估计页数b的最大值。并且有些论文不是arxiv链接,则无法下载。

arxiv.py

import urllib.request
import re
import osdef get_pdf_arxiv(web_site,path):rep = urllib.request.urlopen(urllib.request.Request(web_site))page = rep.read().decode('utf-8')pdf_download = re.findall('<meta name="citation_pdf_url" content="(.*?)"/>',page,re.S)#查询到网页中对应的pdf下载链接print(pdf_download[0])if (len(pdf_download) != 0):try:u = urllib.request.urlopen(pdf_download[0])except urllib.error.HTTPError:print(pdf_download[0], "url file not found")returnblock_sz = 8192with open(path, 'wb') as f:while True:buffer = u.read(block_sz)if buffer:f.write(buffer)else:breakprint("Sucessful to download " + path)for j in range(10):req = urllib.request.Request('https://dblp.uni-trier.de/search//publ/inc?q=Offline%20Reinforcement%20Learning&s=ydvspc&h=30&b='+str(j))#此处只需要修改q=后面的内容,并且保留&s=ydvspc之后的内容response = urllib.request.urlopen(req)the_page = response.read().decode('utf-8')paper_title = re.findall('<span class="title" itemprop="name">(.*?)</span>',the_page,re.S)#检索页面中给的论文名字paper_web = re.findall('view</b></p><ul><li class="ee"><a href="(.*?)" itemprop="url">',the_page,re.S)#存储对应网址for i in range(len(paper_web)):if (paper_web[i].find("arxiv") != -1): #查看网址中是否包含arxiv词汇#以下代码去除了原有网页论文名字中无法保存为window文件名的符号,采用下划线_代替paper_title[i] = paper_title[i].replace('"', '')list = paper_title[i].split(" ")paper_title[i] = "_".join(list)list = paper_title[i].split(":")paper_title[i] = "_".join(list)list = paper_title[i].split("?")paper_title[i] = "_".join(list)list = paper_title[i].split("<sub>")paper_title[i] = "_".join(list)list = paper_title[i].split("</sub>")paper_title[i] = "_".join(list)list = paper_title[i].split("<sup>")paper_title[i] = "_".join(list)list = paper_title[i].split("</sup>")paper_title[i] = "_".join(list)print(paper_title[i])path_dir = "E:\\paper\\offlineRL paper\\"dir_list=os.listdir(path_dir)path = paper_title[i] + "pdf"if path not in dir_list:get_pdf_arxiv(paper_web[i], path_dir + path)

除此以外,我个人还想下一些ICML的论文,所以对于上面的代码进行了微调,将下载地址中需要包含arxiv改为需要包含proceedings,并且根据ICML的网页特性,找到了下载pdf的链接,完整代码在如下ICML.py中。

ICML.py

import urllib.request
import re
import osdef get_pdf_arxiv(web_site,path):print(web_site,path)rep = urllib.request.urlopen(urllib.request.Request(web_site))page = rep.read().decode('utf-8')# pdf_download = re.findall('<meta name="citation_pdf_url" content="(.*?)"/>',page,re.S)pdf_download= re.findall('<li><a href="(.*?)" target="_blank" οnclick="(.*?)">Download PDF</a></li>',page,re.S)download = re.findall('http://(.*?).pdf',str(pdf_download[0]),re.S)download_url = "http://"+download[0]+".pdf"if (len(pdf_download) != 0):try:u = urllib.request.urlopen(download_url)except urllib.error.HTTPError:print(download_url, "url file not found")returnblock_sz = 8192with open(path, 'wb') as f:while True:buffer = u.read(block_sz)if buffer:f.write(buffer)else:breakprint("Sucessful to download " + path)for j in range(100):req = urllib.request.Request('https://dblp.uni-trier.de/search//publ/inc?q=ICML&s=ydvspc&h=30&b='+str(j))response = urllib.request.urlopen(req)the_page = response.read().decode('utf-8')paper_title = re.findall('<span class="title" itemprop="name">(.*?)</span>',the_page,re.S)paper_web = re.findall('view</b></p><ul><li class="ee"><a href="(.*?)" itemprop="url">',the_page,re.S)for i in range(len(paper_web)):# if (paper_web[i].find("arxiv") != -1):if (paper_web[i].find("proceedings") != -1):paper_title[i] = paper_title[i].replace('"', '')list = paper_title[i].split(" ")paper_title[i] = "_".join(list)list = paper_title[i].split(":")paper_title[i] = "_".join(list)list = paper_title[i].split("?")paper_title[i] = "_".join(list)list = paper_title[i].split("<sub>")paper_title[i] = "_".join(list)list = paper_title[i].split("</sub>")paper_title[i] = "_".join(list)list = paper_title[i].split("<sup>")paper_title[i] = "_".join(list)list = paper_title[i].split("</sup>")paper_title[i] = "_".join(list)print(paper_title[i])path_dir = "E:\\paper\\ICML paper\\"dir_list=os.listdir(path_dir)path = paper_title[i] + "pdf"if path not in dir_list:get_pdf_arxiv(paper_web[i], path_dir + path)

批量论文自动下载——从dblp数据库中查找并爬取论文相关推荐

  1. 用python爬取网页数据并存入数据库中源代码_Python爬取51cto数据并存入MySQL方法详解...

    [] 实验环境 1.安装Python 3.7 2.安装requests, bs4,pymysql 模块 实验步骤1.安装环境及模块 可参考https://www.jb51.net/article/19 ...

  2. java操作mysql导表_Java实现批量导入excel表格数据到数据库中的方法

    本文实例讲述了Java实现批量导入excel表格数据到数据库中的方法.分享给大家供大家参考,具体如下: 1.创建导入抽象类 package com.gcloud.common.excel; impor ...

  3. mysql查询低效语句_MySQL数据库中查找执行从命慢的SQL语句

    MySQL数据库中查找执行从命慢的SQL语句 (2011-09-15 08:21:35) 标签: 杂谈 去历:赛迪网 做者:Alizze 启动Mysql时减参数--log-slow-queries去挤 ...

  4. Android studio根据文本提取出的关键词在sqlite数据库中查找相关内容

    Android studio根据文本提取出的关键词在sqlite数据库中查找相关内容 一.介绍 二.Android studio连接.操作和查看sqlite数据库 三.在数据库中查找相关内容 四.运行 ...

  5. Laravel中curl_multi并发爬取百度关键词排名

    Laravel中curl_multi并发爬取百度关键词排名 框架使用的Laravel Linux中crontab定时任务添加 */1 * * * * /data/wwwroot/default/new ...

  6. C#实现自动下载阿里云数据库RDS,附转储阿里云OSS服务器

    本文属于个人原创作品.个人总结,谢绝转载.抄袭.如果您有疑问或者希望沟通交流,可以联系QQ:865562060. 一.简述 现阶段服务器.数据库上云的选择越来越多,但不是说服务器和数据库上云管理之后就 ...

  7. mybatis-plus实现自动填充数据如:数据库中createTime和updateTime

    关于数据库中每个表中,或者会有需要记录表中数据修改的时间.这个时候应该怎么做呢.当然我们的常规做法就是,首先在数据库中添加两个字段 然后在实体类中添加两个属性 private Date createT ...

  8. 自动备份SQL Server数据库中用户创建的Stored Procedures

    为了避免意外丢失/损坏辛苦创建的Stored Procedures,或者想恢复到以前版本的Stored Procedures,这样提供了一个有效方法,可以自动将指定数据库中的Stored Proced ...

  9. 韩国的开发者开源项目 paper with code论文自动下载

    链接:https://github.com/zziz/pwc#2018 自动下载论文代码: #!/usr/bin/env python # -*- coding:utf-8 -*- __author_ ...

最新文章

  1. Linux下的命令总结笔记(一)
  2. uva11111 Generalized Matrioshkas
  3. Android反编译 -- 错误代码还原
  4. Array | 74. Search a 2D Matrix
  5. 802. 找到最终的安全状态
  6. asp.net(C#)写SQL语句技巧
  7. Java--文本文档编写Java代码
  8. 分享两个完整javaweb项目源码
  9. 【读书笔记】终极算法
  10. 计算机网络---网卡,交换机和路由器|CSDN创作打卡
  11. RAID磁盘阵列有哪几种?
  12. 手把手教你 | 识别色环电阻/贴片电阻阻值
  13. html 页面没有鼠标,网页上鼠标箭头不见了 电脑上不显示鼠标箭头怎么办?
  14. SpringBoot 使用异常自定义错误码
  15. 19.1 快速幂的定义和模板
  16. PPT制作--这不是技巧,而是常识 然而好多人并不知道 (hsyl007转载整理)
  17. MySQL 基础——MySQL 起步
  18. 更新TTK失败,请检查网络连接
  19. ISO 标准下载 网站
  20. js实现网页的过滤打印(去掉你不想出现的内容)

热门文章

  1. 聚焦大规模分布式机器学习,全面剖析Google TensorFlow,来看阿里、京东等在人工智能技术的进展...
  2. revit插件怎么快速自动标高?可以使用有自动标高的revit插件来实现
  3. BERT生成能力改进:分离对话生成和对话理解
  4. Discus论坛System Error界面修改标语
  5. api接口文档编辑工具-YApi安装部署(window版)
  6. 用聚宽网写双均线策略(1)
  7. terminate called after throwing an instance of 'std::cad_alloc' what():std::bad_alloc
  8. psv2000注册连接不上服务器,PSV地域服务器须知
  9. 07【Listener、Ajax、Json】
  10. 孩子近视为什么不让立马配眼镜?近视还有真假之分?