python之批量下载网页数据
要下载如下网页所示数据,一个一个点下载繁琐,我们用python代码来批量下载。
python代码:
import urllib.request # url request
import re # regular expression
import os # dirs
import time
'''
url 下载网址
pattern 正则化的匹配关键词
Directory 下载目录
'''
def BatchDownload(url, pattern, Directory):
# 拉动请求,模拟成浏览器去访问网站->跳过反爬虫机制
headers = {'User-Agent',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 获取网页内容
content = opener.open(url).read().decode('utf8')
# 构造正则表达式,从content中匹配关键词pattern
raw_hrefs = re.findall(pattern, content, 0)
# set函数消除重复元素
hset = set(raw_hrefs)
# 下载链接
for href in hset:
# 之所以if else 是为了区别只有一个链接的特别情况
if (len(hset) > 1):
link = url + href[0]
filename = os.path.join(Directory, href[0])
print("正在下载", filename)
urllib.request.urlretrieve(link, filename)
print("成功下载!")
else:
link = url + href
filename = os.path.join(Directory, href)
print("正在下载", filename)
urllib.request.urlretrieve(link, filename)
print("成功下载!")
# 无sleep间隔,网站认定这种行为是攻击,反反爬虫
time.sleep(1)
BatchDownload('http://download.alleninstitute.org/informatics-archive/current-release/mouse_ccf/annotation/ccf_2017/structure_masks/structure_masks_10/',
'(structure_(\d+).nrrd)',
'D:/allen')
上述代码BatchDownload有三个参数,分别为下载网址,下载文件名,保存路径,使用时,修改为自己的参数就可以正常下载,需要注意的是文件名正则化匹配,需要按照自己的文件名来匹配,我所下载文件的名称统一为structure_xxx.nrrd,且xxx均为数字,因此正则化匹配可以写为structure_(\d+).nrrd,其中(\d+)表示1次或n次数字。
参考文章:
https://zhuanlan.zhihu.com/p/65474873