python自动从arxiv下载paper的示例代码


Posted in Python onDecember 05, 2020
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2020/02/11 21:44
# @Author : dangxusheng
# @Email  : dangxusheng163@163.com
# @File  : download_by_href.py
'''
自动从arxiv.org 下载文献
'''

import os
import os.path as osp
import requests
from lxml import etree
from pprint import pprint
import re
import time
import glob

headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36",
  "Host": 'arxiv.org'
}

HREF_CN = 'http://cn.arxiv.org/pdf/'
HREF_SRC = 'http://cn.arxiv.org/pdf/'
SAVE_PATH = '/media/dangxs/E/Paper/download_at_20200730'
os.makedirs(SAVE_PATH, exist_ok=True)

FAIL_URLS = []
FAIL_URLS_TXT = f'{SAVE_PATH}/fail_urls.txt'


def download(url, title):
  pattern = r'[\\/:*?"\'<>|\r\n]+'
  new_title = re.sub(pattern, " ", title)
  print(f'new title: {new_title}')
  save_filepath = '%s/%s.pdf' % (SAVE_PATH, new_title)
  if osp.exists(save_filepath) and osp.getsize(save_filepath) > 50 * 1024:
    print(f'this pdf is be existed.')
    return True
  try:
    with open(save_filepath, 'wb') as file:
      # 分字节下载
      r = requests.get(url, stream=True, timeout=None)
      for i in r.iter_content(2048):
        file.write(i)
    if osp.getsize(save_filepath) >= 10 * 1024:
      print('%s 下载成功.' % title)
      return True
  except Exception as e:
    print(e)
  return False


# 从arxiv.org 去下载
def search(start_size=0, title_keywords='Facial Expression'):
  # 访问地址: https://arxiv.org/find/grp_eess,grp_stat,grp_cs,grp_econ,grp_math/1/ti:+Face/0/1/0/past,2018,2019/0/1?skip=200&query_id=1c582e6c8afc6146&client_host=cn.arxiv.org
  req_url = 'https://arxiv.org/search/advanced'
  req_data = {
    'advanced': 1,
    'terms-0-operator': 'AND',
    'terms-0-term': title_keywords,
    'terms-0-field': 'title',
    'classification-computer_science': 'y',
    'classification-physics_archives': 'all',
    'classification-include_cross_list': 'include',
    'date-filter_by': 'date_range', # date_range | specific_year
    # 'date-year': DOWN_YEAR,
    'date-year': '',
    'date-from_date': '2015',
    'date-to_date': '2020',
    'date-date_type': 'announced_date_first', # submitted_date | submitted_date_first | announced_date_first
    'abstracts': 'show',
    'size': 50,
    'order': '-announced_date_first',
    'start': start_size,
  }
  res = requests.get(req_url, params=req_data, headers=headers)
  html = res.content.decode()
  html = etree.HTML(html)

  total_text = html.xpath('//h1[@class="title is-clearfix"]/text()')
  total_text = ''.join(total_text).replace('\n', '').lstrip(' ').strip(' ')
  # i.e. : Showing 1?50 of 355 results
  num = re.findall('\d+', total_text)
  # Sorry, your query returned no results
  if len(num) == 0: return [], 0

  total = int(num[-1]) # 查询总条数
  paper_list = html.xpath('//ol[@class="breathe-horizontal"]/li')
  info_list = []
  for p in paper_list:
    title = p.xpath('./p[@class="title is-5 mathjax"]//text()')
    title = ''.join(title).replace('\n', '').lstrip(' ').strip(' ')
    href = p.xpath('./div/p/a/@href')[0]
    info_list.append({'title': title, 'href': href})

  return info_list, total


# 去指定页面下载
def search_special():
  res = requests.get('https://gitee.com/weberyoung/the-gan-zoo?_from=gitee_search')
  html = res.content.decode()
  html = etree.HTML(html)

  paper_list = html.xpath('//div[@class="file_content markdown-body"]//li')
  info_list = []
  for p in paper_list:
    title = p.xpath('.//text()')
    title = ''.join(title).replace('\n', '').lstrip(' ').strip(' ')
    href = p.xpath('./a/@href')[0]
    info_list.append({'title': title, 'href': href})

  pprint(info_list)
  return info_list


if __name__ == '__main__':
  page_idx = 0
  total = 1000
  keywords = 'Facial Action Unit'
  while page_idx <= total // 50:
    paper_list, total = search(page_idx * 50, keywords)
    print(f'total: {total}')
    if total == 0:
      print('no found .')
      exit(0)

    for p in paper_list:
      title = p['title']
      href = HREF_CN + p['href'].split('/')[-1] + '.pdf'
      print(href)
      if not download(href, title):
        print('从国内镜像下载失败,从源地址开始下载 >>>>')
        # 使用国际URL再下载一次
        href = HREF_SRC + p['href'].split('/')[-1] + '.pdf'
        if not download(href, title):
          FAIL_URLS.append(p)
    page_idx += 1

  # 下载最后的部分
  last_1 = total - page_idx * 50
  paper_list, total = search(last_1, keywords)
  for p in paper_list:
    title = p['title']
    href = HREF_CN + p['href'].split('/')[-1] + '.pdf'
    if not download(href, title):
      FAIL_URLS.append(p)
    time.sleep(1)

  pprint(FAIL_URLS)
  with open(FAIL_URLS_TXT, 'a+') as f:
    for item in FAIL_URLS:
      href = item['href']
      title = item['title']
      f.write(href + '\n')

  print('done.')

以上就是python自动从arxiv下载paper的示例代码的详细内容,更多关于python 从arxiv下载paper的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
用xpath获取指定标签下的所有text的实例
Jan 02 Python
python实现QQ空间自动点赞功能
Apr 09 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
Django app配置多个数据库代码实例
Dec 17 Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
python实现处理mysql结果输出方式
Apr 09 Python
pycharm 激活码及使用方式的详细教程
May 12 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 Python
python使用dlib进行人脸检测和关键点的示例
Dec 05 #Python
python从ftp获取文件并下载到本地
Dec 05 #Python
python基于socket模拟实现ssh远程执行命令
Dec 05 #Python
Python实现PS滤镜中的USM锐化效果
Dec 04 #Python
python 模拟登陆github的示例
Dec 04 #Python
python中round函数保留两位小数的方法
Dec 04 #Python
python中pow函数用法及功能说明
Dec 04 #Python
You might like
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
Python多线程实例教程
2014/09/06 Python
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
Python的pygame安装教程详解
2020/02/10 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
教师自荐信范文
2015/03/06 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL