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共存的配置方法
May 22 Python
Python机器学习之决策树算法
Dec 22 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
Jan 15 Python
python 编码规范整理
May 05 Python
python学生管理系统开发
Jan 30 Python
python和c语言的主要区别总结
Jul 07 Python
python3实现微型的web服务器
Sep 03 Python
python 并发下载器实现方法示例
Nov 22 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
Python3使用 GitLab API 进行批量合并分支
Oct 15 Python
用python读取xlsx文件
Dec 17 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 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模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
使用angular写一个hello world
2015/01/23 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
vue实现计步器功能
2019/11/01 Javascript
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
品恩科技软件测试面试题
2014/10/26 面试题
会计主管岗位职责
2014/01/03 职场文书
《火烧云》教学反思
2014/04/12 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
协会周年庆活动方案
2014/08/26 职场文书
学校创先争优活动总结
2014/08/28 职场文书
售后服务承诺函格式
2015/01/21 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle