下载《物理》文章的Python脚本

本人虽然是个物理渣,没事还是喜欢看看物理方面的内容以陶冶情操。一个比较好的来源是《物理》,这里的文章是可以免费下载的。但是一篇篇下载有点麻烦,而且保存的文件名是文章标题的utf-8编码,下完了还得改下文件名。文章的下载地址不是直接写在网页里的,而是在点击下载的时候生成的,于是像DownThemAll、迅雷之类的工具就没用了。于是自己动手写一个下载脚本。

通过查看网页的源码,它是用文件的类型(应该都是pdf)和id来生成下载地址的。它是用的post,我用的get,我还不是很清楚这之间的区别,也准备学习下jQuery的内容。

我原本希望能只下载感兴趣的文章。网页上每篇文章对应有一个勾选框,勾选后对应的文章就会高亮,说实话我不知道网站用这个来干什么。。也许我可以勾选感兴趣的文章后再下载。勾选后这个元素的class会从noselectrow变为selectedrow. 相关的代码如下:

function hightlightrowaction(rowid) {
    var thisrow = $("#"+rowid);
    if ($(thisrow).hasClass("selectedrow")) {
        $(thisrow).removeClass("selectedrow");
        $(thisrow).addClass("noselectrow");
    } else {
        $(thisrow).addClass("selectedrow");
        $(thisrow).removeClass("noselectrow");
    }
}

但有时勾选后class没变,似乎有点问题,还没搞清楚。

Python脚本如下,用到了BeautifulSoup和requests。正则表达式写得很渣。。

 1 # -*- coding: utf-8 -*-
 2 """
 3 This script is used to download file from《物理》(http://www.wuli.ac.cn/CN/volumn/home.shtml) automatically.
 4 example usage:
 5
 6 downloadFiles(u‘f:\\物理\\‘, "http://www.wuli.ac.cn/CN/volumn/volumn_1696.shtml")
 7 """
 8 import requests
 9 from bs4 import BeautifulSoup
10 import urllib
11 import re
12 import os
13 def hasDownloadLink(tag):
14     return tag.has_attr(‘onclick‘) and tag[‘onclick‘].startswith(‘showArticleFile‘)
15
16 def getFileTypeAndID(fileInfo):
17     """
18     :param fileInfo:
19     :return: file type(usually pdf) and file ID
20     """
21     m = re.match(r‘[^,]*,\s*[\‘\"](.*)[\‘\"][^,]*,\s*([^\)]*).*‘, fileInfo)
22     return m.groups()[0], m.groups()[1]
23
24 def getPublicationYearMonth(tag):
25     """
26     :param tag:
27     :return: publication year and month in the form YYYY-MM
28     """
29     return re.match(r‘.*(\d{4}-\d{2}).*‘, tag.get_text()).groups()[0]
30
31 def modifyFileName(fname):
32     # get rid of characters which are not allowed to be used in file name by Windows
33     for inValidChar in r‘\/:?"<>|‘:
34         fname = fname.replace(inValidChar, ‘‘)
35     return fname
36
37 def writeLog(saveDirectory, errMsg):
38     fhandle = open(saveDirectory + "download log.txt", ‘w‘)
39     for msg in errMsg:
40         fhandle.write(msg.encode(‘utf-8‘));
41     fhandle.close()
42
43 def downloadFiles(saveDirectory, url, onlyDownloadSeleted = False):
44     """
45     :param saveDirectory: directory to store the downloaded files
46     :param url: url of the download page
47     :param onlyDownloadSeleted: not implemented yet. Ideally, it should allow one to download only interested instead of all files.
48     :return: None
49     """
50     page = urllib.urlopen(url)
51     soup = BeautifulSoup(page)
52     volumeAndDateTag = soup.find(class_="STYLE5")
53     yearMonth = getPublicationYearMonth(volumeAndDateTag)
54     year = yearMonth[:4]
55     relativePath = year + "\\" + yearMonth + "\\"
56     absolutePath = saveDirectory + relativePath
57     if not os.path.exists(absolutePath):
58         os.makedirs(absolutePath)
59     articleMark = "selectedrow" if onlyDownloadSeleted else "noselectrow"
60     articles = soup.find_all(class_ = articleMark)
61     errMsg = []
62     for index, article in enumerate(articles, 1):
63         print ‘Downloading the %d th file, %d left.‘ % (index, len(articles) - index)
64         # the title of one article in contained in the first anchor
65         title = article.find(‘a‘).get_text()
66         title = modifyFileName(title)
67         try:
68             downloadAnchor = article.find(hasDownloadLink)
69             fileInfo = downloadAnchor[‘onclick‘]
70             fileType, fileID = getFileTypeAndID(fileInfo)
71             fileName = title+‘.‘+fileType.lower()
72             filePath = absolutePath + fileName
73             param = {"attachType":fileType, "id":fileID}
74             if not os.path.exists(filePath):
75                    articleFile = requests.get("http://www.wuli.ac.cn/CN/article/downloadArticleFile.do",params=param)
76                    fhandle = open(filePath, "wb")
77                    fhandle.write(articleFile.content)
78                    fhandle.close()
79         except:
80             errMsg.append(title + " download failed")
81
82     if len(errMsg) > 0:
83         writeLog(absolutePath, errMsg)
84
85 if __name__ == "__main__":
86     downloadFiles(u‘f:\\物理\\‘, "http://www.wuli.ac.cn/CN/volumn/volumn_921.shtml")

时间: 2024-12-26 08:11:36

下载《物理》文章的Python脚本的相关文章

利用python脚本自动下载ICML会议接受的文章

最近需要下载ICML会议2015年接受的最新的文章,但是到官网一看,那么多的文章,如果我一篇一篇点击下载的话,什么时候是个头呢?于是就想着用python脚本对文章的页面进行处理,得到相关文章的url,然后进行下载. 通过观察ICML会议的Accepted Papers发现,其的结构还是比较整齐的,其中我们需要的信息的代码片段如下: <div class="paper"> <p class="title">Approval Voting and

定时运行Python脚本(下载数据)

阿里云对象存储通过外网下载的数据需要收费,标准型存储的外网流出流量计费方式: 00:00-08:00(闲时):0.25元/GB:8:00-24:00(忙时):0.50元/GB. 如果对数据的时效要(wei)求(le)不(sheng)高(qian),可以做一个Python脚本,每天早上07:00自动运行下载数据. WIN10,Python 3.7.4 准备好调试完成的下载数据脚本 oss_download.py,放到"E:\data"目录下(如果是其他目录,下面文件中的相关地址记得要一起

1.蛤蟆Python脚本学习笔记一环境搭建

1.蛤蟆Python脚本学习笔记一环境搭建 蛤蟆一直在想在工作的时候能不能有一个牛逼的工具来让自己工作更加轻松和快乐.用过C, C++, C#, JAVA,  SHELL,TCL,汇编,BAT等,感觉这些都是需要的时候能发挥作用,不能和我想象的一样.突然有一天,感觉Python实在不错,那么就和小伙伴们一起乐呵乐呵呗.万事开头难,我们先来搭建环境吧. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48058315 1. 相关

使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)

一.基本知识 (1)NuGet : NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件,同时也可以通过NuGet来安装一些Visual Studio的插件等.作为一名开发人员,您可能也会开发一些公共组件以供他人使用,本文将一步步介绍如何以最简单的方式将自己所开发的类库包发布到nuget上,以供更多的人使用[1]. (2)ProGet: 非常优秀的库创建服务器,用于放置packages.

将Python脚本文件包装成可执行文件

将Python脚本文件包装成可执行文件,其目的有二: 一则: 不需要依赖Python编译器就可以运行软件 二则: 不想让自己的源码公布出去 常用的工具有: py2exe.cx_freeze等 [工具:py2exe] 安装py2exe 安装该工具很简单: 只需要从官方网站:http://www.py2exe.org/下载与版本对应的安装程序,点击下一步即可完成安装. 安装后,执行import py2exe,不报错则表示安装成功! >>> import py2exe >>>

新个税计算器 Python脚本

新个税计算器 Python脚本 新个税计算器(Python):一个极其简单,也没有做任何排错处理的初学脚本,发上来只是为了大家可以增加自己的代码丰富它. 点这里下载:NewTax.zip 1 # -*- coding: cp936 -*- 2 #This script is using in MIC only,Powered by rexchenhan 3 #养老保险公司比例 4 EI_CoRate=0.323 5 #养老保险个人比例 6 EI_EmpRate=0.11 7 #公积金公司比例 8

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

Python脚本访问Greenplum数据库安装指导

安装前准备 (1)操作系统(系统上面要安装一些必备的开发工具(比如gcc等)) linux-82:/home/PyODBC # cat/etc/SuSE-release SUSE Linux EnterpriseServer 11 (x86_64) VERSION = 11 PATCHLEVEL = 1 (2)安装所需的软件包 greenplum-connectivity-4.3.0.0-build-2-SuSE10-x86_64.zip --GP官网下载,GP的JDBC和ODBC驱动 pyod

另外一个给微信企业号发文字信息的python脚本

http://chenx1242.blog.51cto.com/10430133/1954634 文章里面有一个python脚本可以用来给微信企业号发信息,如果你不喜欢那篇文章里面"title+content"的样式,可以使用如下的脚本: #coding:utf-8 import urllib2 import json import sys def getMsg():     #为了避免发送中文消息报错,使用utf8方式编码     reload(sys)     sys.setdef