笔者下载乌普萨拉大学网站的pdf时,发现如果一个个点开再另存为太机械化了,不如写一个脚本,让其自动下载。
但是在用到urllib.request.urlretrieve下载的时候,报错:件下载不完全错误。而且下载时间巨长。
解决方案1
使用socket模块,设置一个超时时间。
解决方案2
使用urllib.request.urlopen(url),再将其二进制写入想要.pdf文件。这种方法还不错
除此之外,还有很多地方的pdf需要用这种方法下载:
比如上一篇blog提到的
1、cs486计算机视觉课件 课件
2、CS280: Computer Vision 课件
3、CS4670/5670 Lectures, Spring 2016 康奈尔大学计算机视觉课件
4、CSE/EE486 Computer Vision I 宾夕法尼亚州立大学计算机视觉课件
等等这些网站上的课件都有一个特点,都是在tbody 大标签下,所以只需要替换程序中的url文件即可。
代码如下:
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import re
import os
import urllib
#import socket
#socket.setdefaulttimeout(30) #设置超时时间为30s
def gethtml(url,headers):
r=requests.get(url,headers=headers)
return r
def bs4parser(html):
soup=BeautifulSoup(html,'html.parser')
return soup
if __name__=="__main__":
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'}
url=r'http://www.it.uu.se/edu/course/homepage/bild1/ht17'
r=gethtml(url,headers=headers)
r.encoding=r.apparent_encoding
s1=bs4parser(r.text)
for tr in s1.find('tbody').find_all('tr'):
for a in tr('a'):
temp=re.findall('(.pdf)',a['href'])
if len(temp)!=0:
# i=1
# urllib.request.urlretrieve(str('http://www.it.uu.se')+str(a['href']),r'C:\Users\Y\Desktop\s2\%g.pdf'%i)
#urlib.request.urlretrieve 会造成文件下载不完全错误,解决方法用socket模块
#urllib.request.urlopen 要好很多
u = urllib.request.urlopen(str('http://www.it.uu.se')+str(a['href']))
filename=os.path.split(str(a['href']))[-1]
f=open(r'C:\Users\Y\Desktop\s1\%s'%filename,'wb')
block_sz = 8192
while True:
buffer = u.read(block_sz)
if not buffer:
break
f.write(buffer)
f.close()
print(str('http://www.it.uu.se')+str(a['href'])+":"+"完成")
# i+=1