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中字典dict常用操作方法实例总结
Apr 04 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
Python应用库大全总结
May 30 Python
使用Python监控文件内容变化代码实例
Jun 04 Python
python 抓包保存为pcap文件并解析的实例
Jul 23 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
Python如何使用Gitlab API实现批量的合并分支
Nov 27 Python
Django如何实现防止XSS攻击
Oct 13 Python
Python机器学习之基础概述
May 19 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表单提交问题的解决方法
2011/04/12 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
python爬虫常用的模块分析
2014/08/29 Python
Python类的专用方法实例分析
2015/01/09 Python
python装饰器初探(推荐)
2016/07/21 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
python输出决策树图形的例子
2019/08/09 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
Python 实现进度条的六种方式
2021/01/06 Python
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
给民警的表扬信
2014/01/08 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书