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 相关文章推荐
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
Python安装Numpy和matplotlib的方法(推荐)
Nov 02 Python
python设置值及NaN值处理方法
Jul 03 Python
基于python实现简单日历
Jul 28 Python
浅析python继承与多重继承
Sep 13 Python
设置python3为默认python的方法
Oct 31 Python
python实现XML解析的方法解析
Nov 16 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
Python3 集合set入门基础
Feb 10 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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
php弹出提示框的是实例写法
2019/09/26 PHP
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
python调用新浪微博API项目实践
2014/07/28 Python
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
基于python指定包的安装路径方法
2018/10/27 Python
python Tkinter的图片刷新实例
2019/06/14 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
Python使用re模块验证危险字符
2020/05/21 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
电气自动化大学生求职信
2013/10/16 职场文书
鉴定评语大全
2014/05/05 职场文书
广告宣传策划方案
2014/05/21 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
初中重阳节活动总结
2015/05/05 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
学生病假条范文
2015/08/17 职场文书