python3爬⾍下载⽹页上的pdf
今天在⽹上看⼀个课程的讲义,每次都点pdf打开什么的有点⿇烦,就想着⽤爬⾍把他们都下载下来。虽然⽹上资料很多,但毕竟python不是很熟,期间遇到好多问题,不过最终也下载完成了。
主要参考了
2 廖雪峰关于正则表达式的教程(感觉写的看着有点费劲呢)
电脑上装的是3.6.3。
针对我想爬的⽂件进⾏修改,在这⼀过程⾥遇到了(不分先后):
1.正则表达式⾥‘_’的匹配问题,他应该是个特殊字符要加转义符‘\_’才能匹配;
2. 解码时遇到不能识别的错误,这⾥我直接在decode时加上了忽略错误的参数‘ignore’;
3. 匹配的url列表中有很多重复项,下载时有重复⼯作,这⾥我先⽤set把重复项去掉再转换成了list返回(不过这样list顺序就乱了,可以再sort⼀下);
4. 创建⽂件夹前进⾏了判断,存在时就不创建了,不然碰到⽂件夹存在程序会终⽌的;(下载⽂件时同
样是判断下⽐较好,但这⾥偷懒了,‘w’参数有对应机制)
5. 获取⽂件getFile时,有可能爬取到的⽂件字符串对应⽹址并不存在的错误,这会导致程序中断,我加了个try判断,遇到时把错误⽹址抛出;
最后代码如下
# coding = UTF-8
# 爬取⼤学nlp课程的教学pdf⽂档课件 ccl.pku.edu/alcourse/nlp/
quest
import re
import os
# open the url and read
def getHtml(url):
page = quest.urlopen(url)
html = ad()
page.close()
return html
# compile the regular expressions and find
# all stuff we need
def getUrl(html):
reg = r'(Chapter\_\d\d)' #匹配了Chapter_01
url_re = repile(reg)
url_lst = url_re.findall(html.decode('UTF-8', 'ignore')) #匹配的数组
return(list(set(url_lst))) #把重复项去掉
def getFile(url):
file_name = url.split('/')[-1]
try:
u = quest.urlopen(url)
HTTPError:
#碰到了匹配但不存在的⽂件时,提⽰并返回
print(url, "url file not found")
return
block_sz = 8192
with open(file_name, 'wb') as f:
while True:
buffer = u.read(block_sz)
if buffer:
f.write(buffer)
else:
break
print ("Sucessful to download" + " " + file_name)
root_url = 'ccl.pku.edu/alcourse/nlp/' #下载地址中相同的部分raw_url = 'ccl.pku.edu/alcourse/nlp/' #检索匹配名字的源⽹址
html = getHtml(raw_url)
url_lst = getUrl(html)
print("url_lst", url_lst)
if not ists('pdf_download') :
# ⽂件夹不存在时,再进⾏创建
os.mkdir('pdf_download')
os.chdir(os.path.wd(), 'pdf_download'))
for url in url_lst[:]:
url = root_url + "LectureNotes/" + url+'.pdf' #形成完整的下载地址
getFile(url)
基于参考1⾥博客的代码作为模板进⾏更改的
# coding = UTF-8
# 爬取⾃⼰编写的html链接中的PDF⽂档,⽹址:file:///E:/ZjuTH/Documents/pythonCode/pythontest.html
quest
import re
import os
# open the url and read
def getHtml(url):
page = quest.urlopen(url)
html = ad()
page.close()
return html
# compile the regular expressions and find
# all stuff we need
def getUrl(html):
reg = r'([A-Z]\d+)' #匹配了G176200001
url_re = repile(reg)
url_lst = url_re.findall(html.decode('UTF-8')) #返回匹配的数组
return(url_lst)
def getFile(url):
file_name = url.split('/')[-1]
u = quest.urlopen(url)
f = open(file_name, 'wb')
block_sz = 8192
while True:
python 爬虫教学buffer = u.read(block_sz)
if not buffer:
break
f.write(buffer)
f.close()
print ("Sucessful to download" + " " + file_name)
root_url = 'v/tempublicfiles/' #下载地址中相同的部分
raw_url = 'file:///E:/ZjuTH/Documents/pythonCode/pythontest.html'
html = getHtml(raw_url)
url_lst = getUrl(html)
os.mkdir('pdf_download')
os.chdir(os.path.wd(), 'pdf_download'))
for url in url_lst[:]:
url = root_url + url+'/'+url+'.pdf' #形成完整的下载地址
getFile(url)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论