经常需要下载论文,每次都需要去网页上搜索,然后点击下载,实在麻烦,正好最近刚入门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()

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

Python简易爬虫的更多相关文章

  1. python简易爬虫来实现自动图片下载

    菜鸟新人刚刚入住博客园,先发个之前写的简易爬虫的实现吧,水平有限请轻喷. 估计利用python实现爬虫的程序网上已经有太多了,不过新人用来练手学习python确实是个不错的选择.本人借鉴网上的部分实现 ...

  2. 爬虫系列1:python简易爬虫分析

    决定写一个小的爬虫系列,本文是第一篇,讲爬虫的基本原理和简易示例. 1.单个网页的简易爬虫 以下爬虫的主要功能是爬取百度贴吧中某一页面的所有图片.代码由主要有两个函数:其中getHtml()通过页面u ...

  3. python简易爬虫实现

    目的:爬取昵称 目标网站:糗事百科 依赖的库文件:request.sys.beautifulSoup4.imp.io Python使用版本:3.4 说明:参考http://cn.python-requ ...

  4. Python简易爬虫爬取百度贴吧图片

    通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.requ ...

  5. 【Python】Python简易爬虫爬取百度贴吧图片

    通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.requ ...

  6. python简易爬虫,帮助理解re模块

    20161203更新: 1.使用了BS4解析html 2.使用了mysql-connector插入了数据库表 pip install mysql-connector import urllib.req ...

  7. day17 python re模块 简易爬虫

    day17 python   一.re模块     1.re模块的基础方法         查找findall() import re #re.findall(pattern,string,flags ...

  8. 利用简易爬虫完成一道基础CTF题

    利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...

  9. 一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接

    [一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态. 今天小编以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来 ...

随机推荐

  1. SAE 安装未包含的第三方依赖包

    如何使用virtualenv管理依赖关系 当你的应用依赖很多第三方包时,可以使用virtualenv来管理并导出这些依赖包,流程如下: 首先,创建一个全新的Python虚拟环境目录ENV,启动虚拟环境 ...

  2. HDU2602 (0-1背包问题)

      N - 01背包 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Descri ...

  3. iOS工程适配64-bit经验分享

    终究还是来了.Apple下发了支持64位的最后通牒: As we announced in October, beginning February 1, 2015 new iOS apps submi ...

  4. X86架构与ARM架构比较

    引言 CPU是怎样运作的? CPU的运作与人脑的运作差不多.先谈一下人这个系统的工作方式.眼镜.耳朵.舌头.皮肤等等感觉器官接收到“触觉”,把信息传给大脑,大脑把信息处理后,把处理结果送给手.脚.嘴等 ...

  5. 离散傅里叶变换(DFT)

    目录     一.研究的意义     二.DFT的定义    三.DFT与傅里叶变换和Z变换的关系     四.DFT的周期性     五.matlab实验       五.1 程序         ...

  6. List<T> ForEach break

    有没有方法扩展跳出 list.foreach循环? 理论上它其实不是一个循环,而是一个方法 代理调用内部循环   public delegate void ForEachAction<T> ...

  7. ASP.NET 安全认证

    一. 新建一个测试项目 新建一个测试项目,包含三张页面(Default.aspx.Login.aspx.UserInfo.aspx).   二. 修改 Web.config 1.把<authen ...

  8. C++标准库的数值极限numeric_limits

    包含头文件:#include<limits> 它是一个模板类,它主要是把C++当中的一些内建型别进行了封装,比如说numeric_limits<int>是一个特化后的类,从这个 ...

  9. C# 关于NULL 可空值类型 ? 和空接操作符??

    作者 陈嘉栋(慕容小匹夫) C#引入了可空值类型的概念.在介绍究竟应该如何使用可空值类型之前,让我们先来看看在基础类库中定义的结构--System.Nullable<T>.以下代码便是Sy ...

  10. js 实现 di

    前些时候有使用过AngularJS一些时间,最大的感受就是Angular完全颠覆了我们开发Web应用的方式,自己被其许多耳目一新的设计思想所折服. 首先想说的就是依赖注入(DI),这也意味着,你在使用 ...