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实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python3 操作符重载方法示例
Nov 23 Python
Python基于plotly模块实现的画图操作示例
Jan 23 Python
详解python中的数据类型和控制流
Aug 08 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
Django 自定义分页器的实现代码
Nov 24 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
Pytorch 之修改Tensor部分值方式
Dec 27 Python
Python基于pandas爬取网页表格数据
May 11 Python
python wsgiref源码解析
Feb 06 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的urlencode()URL编码函数浅析
2011/08/09 PHP
php类的定义与继承用法实例
2015/07/07 PHP
php加密解密字符串示例
2016/10/13 PHP
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
如何编写jquery插件
2017/03/29 jQuery
JS实现微信摇一摇原理解析
2017/07/22 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
Python的print用法示例
2014/02/11 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
南京某公司笔试题
2013/01/27 面试题
座谈会主持词
2014/03/20 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
一体化教学实施方案
2014/05/10 职场文书
任命书格式
2014/06/05 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
政风行风评议整改方案
2014/09/15 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
村干部任职承诺书
2015/01/21 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书