经常需要下载论文,每次都需要去网页上搜索,然后点击下载,实在麻烦,正好最近刚入门Python,心血来潮,想着写一个爬虫

经过一天查阅资料,基本算是完成了,但是还是不足,比如对知网和万方暂时还不行,但是对于英文文献是基本上没有问题的,思路就是在百度学术上进行搜索,拿到它搜索结果的第一个页面,然后把里面的下载链接全部爬下来,循环,进行判断,只要下载成功,就退出。但是对于少部分的外国文献库,知网和万方,他们是的下载链接是需要拿到百度学术搜索连接后,在把这个页面下的下载链接爬下来,这一点写个递归最好了,时间有限,这个问题等过几天再进行补充。

下面直接上代码:

import urllib
import urllib.request
import re
import os #获得百度学术的第一个搜索结果
def baidusearch(key):
#百度中的用是gbk编码,像Google中则是utf8编码,因此这里
#需要先编码
key=urllib.request.quote(key.encode('gbk'))
url='''http://xueshu.baidu.com/s?wd={}'''.format(key)
response=urllib.request.urlopen(url)
str1=response.read().decode(encoding='utf8')
#匹配百度学术中的所有搜索结果
mat=re.compile(r'href="/s\?wd=paperuri\S+"')
str1=mat.findall(str1)
#取出第一个搜索结果
#将前后的href和引号去掉
str1=str1[0][6:-1]
#拼接为完整的路径
str1=r'http://xueshu.baidu.com'+str1
return str1 #获得搜索结果页面中的可用的下载链接
def getLink(key):
response=urllib.request.urlopen(baidusearch(key))
str1=response.read().decode(encoding='utf8')
#匹配真正的下载地址
mat=re.compile(r'<a class="dl_item" \S+ \S+"')
str1=mat.findall(str1)
#去掉地址的前后多余信息
if str1:
for i in range(len(str1)):
str1[i]=str1[i][41:-1]
#为了防止链接失效,这里返回所有可下载地址
return str1 #得到下载链接的响应报文头
def filesize(url):
request=urllib.request.Request(url)
response=urllib.request.urlopen(request)
return dict(response.info()) #下载文件
def dFile(key,path='d:\\'):
li=getLink(key)
if len(li):
for dowpath in li:
name=dowpath.split('/')[-1]
try:
if filesize(dowpath)['Content-Type']=='application/pdf':
print('将要从',dowpath,'下载')
#输出下载进度
def abk(a,b,c):
per=a*b/c*100.0
if per>100:
per=100
print('已完成:%.2f%%' %per)
#开始下载
print(name)
urllib.request.urlretrieve(dowpath,os.path.join(path,name),abk)
break
except:
continue def main():
while True:
key=input('请输入论文名,支持模糊搜索\n')
path=input('请输入下载路径,例如:c:\,默认为D盘根目录\n')
if len(path)==0:
path='D:\\'
print('开始下载\n')
dFile(key,path)
yn=input('下载完成,是否继续:y/n:')
if yn=='y':
continue
else:
break
#调试模块
if __name__=='__main__':
main()

这只是一个试验品。等过几天完善一下 在详细说明

最新文章

  1. [已解决] No syntax specified for the proto file : xxx.proto
  2. 使用angularjs定义html中的属性ng-attr-(suffix)
  3. jboss4.2.3禁用http put/delete等请求
  4. Mono for Android (1) 之布局
  5. U盘安装Debian 7
  6. PHP常用的基本文件和目录操作总结
  7. (10.09作业)学生选课数据库SQL语句练习题
  8. java获取数据库的列名、类型等信息
  9. 64位win7安装jdk和eclipse
  10. java基础解析系列(十)---ArrayList和LinkedList源码及使用分析
  11. hdu 4939
  12. html-简单的简历表制作
  13. 最新App Store审核10大被拒理由
  14. JAVA堆栈的区别
  15. clickhouse的使用和技巧,仅个人
  16. ELK日志系统介绍
  17. 【blog】SpringBoot的可执行文件如何在Linux中后台运行(待补充...)
  18. [转]iOS 中几种定时器 - 控制了时间,就控制了一切
  19. 1.linux6 x86-64 RPM包安装mysql5.7.20
  20. gerp , sed , awk

热门文章

  1. Flask_SqlAlchemy 1215, &#39;Cannot add f oreign key constraint&#39;
  2. 一个CS出身的基本素养
  3. 在Linux下写一个线程池以及线程池的一些用法和注意点
  4. shell排序算法
  5. QBImagePickerController 用法
  6. www.nt-kaisheng.com
  7. [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】
  8. animate基础
  9. 用它解决大问题啦,STRACE应用
  10. netstat详解