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网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Python爬取网易云音乐上评论火爆的歌曲
Jan 19 Python
Python自动发邮件脚本
Mar 31 Python
使用Python写一个小游戏
Apr 02 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
Python文字截图识别OCR工具实例解析
Mar 05 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
python实战之用emoji表情生成文字
May 08 Python
python3中apply函数和lambda函数的使用详解
Feb 28 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中Closure类的使用方法及详解
2015/10/09 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
htm调用JS代码
2007/03/15 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
如何编写jquery插件
2017/03/29 jQuery
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
Python字符串拼接六种方法介绍
2017/12/18 Python
python删除不需要的python文件方法
2018/04/24 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
python列表的逆序遍历实现
2020/04/20 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
matplotlib基础绘图命令之imshow的使用
2020/08/13 Python
Python之Sklearn使用入门教程
2021/02/19 Python
高校学生干部的自我评价分享
2013/11/04 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
家长给孩子的评语
2014/01/30 职场文书
母亲节寄语大全
2015/02/27 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
整改通知书
2015/04/20 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
军训新闻稿范文
2015/07/17 职场文书
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers