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自定义解析简单xml格式文件的方法
May 11 Python
python 排序算法总结及实例详解
Sep 28 Python
python之PyMongo使用总结
May 26 Python
python如何压缩新文件到已有ZIP文件
Mar 14 Python
pandas Dataframe行列读取的实例
Jun 08 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
Python多项式回归的实现方法
Mar 11 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
Dec 05 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 Python
python用字节处理文件实例讲解
Apr 13 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.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
如何在微信小程序中存setStorage
2019/12/13 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
更改Python命令行交互提示符的方法
2015/01/14 Python
python批量生成本地ip地址的方法
2015/03/23 Python
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
超简单使用Python换脸实例
2019/03/27 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
Python如何重新加载模块
2020/07/29 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
优秀交警事迹材料
2014/01/26 职场文书
银行办公室岗位职责
2014/03/10 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
货款欠条范本
2015/07/03 职场文书
教师远程培训心得体会
2016/01/09 职场文书
PyTorch的Debug指南
2021/05/07 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis