马上全国大学生数学竞赛就要开始,这种比赛肯定是要做题的,但题目很多都只能在线看,感觉还是纸质的好些,但好多都不能单击右键保存图片(保存下来的也是一个网页形式),如果了解过前端知识的话,就可以按f12打开控制台来找对应图片的url然后在一张一张的下载,但题目从09-现在有七八十张图爿一张一张下有点麻烦,所以就想用python写一个脚本来实现自动的下载图片,并保存在一个目录中,下面废话不多说,贴出我的代码:
这里需要说明:在你爬取之前,你需要分析一下你要爬取的图片html:
第一个代码在你的目录下会出现11.html文件,然后你就可以分析html <img的组成
import urllib.request,re, os def imageCrawler(url, toPath): headers = { "User-Agent": "Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)", } req = urllib.request.Request(url, headers=headers)#先构造一个请求体 response = urllib.request.urlopen(req)#打开一个网页 htmlStr = response.read() print(htmlStr) with open(r'11.html', 'wb') as f: f.write(htmlStr) url = 'https://mp.weixin.qq.com/s/p7vdIKfwHNPYZYcOIvfKzQ'#目标网址 toPath = r'E:\math context'#存储的位置 imageCrawler(url, toPath)
下面是获取图片的代码
import urllib.request,re, os def imageCrawler(url, toPath): headers = { "User-Agent": "Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)", } req = urllib.request.Request(url, headers=headers)#先构造一个请求体 response = urllib.request.urlopen(req)#打开一个网页 htmlStr = response.read().decode('utf-8')#这里注意从网页返回的是byte型需要将其转化为str所以要解码 #下面是我找的网站的正则匹配 #pat = r'<img data-ratio=".*?" data-w="550" data-type="png" data-s="300,640" data-src="(.*?)" />' pat = r'<img data-s="300,640" data-type="png" data-src="(.*?)" data-copyright="0" class="" data-ratio=".*?" data-w=".*?" />' #pat = r'<img data-ratio=".*?" data-w="550" data-type="png" data-s="300,640" data-src="(.*?)" />' #pat = r'<img data-s="300,640" data-type="png" data-src="(.*?)" style="" data-ratio=".*?" data-w="550" />' #pat = r'<img data-s="300,640" data-type="png" data-src="(.*?)" style="" data-ratio="1.4153005464480874" data-w="549" />' re_image = re.compile(pat) imagesList = re_image.findall(htmlStr) print(imagesList) print(len(imagesList))#这可以判断下载几个图片 num = 1 for imageUrl in imagesList: path = os.path.join(toPath, str(num) + ".jpg")#构造文件路径 num += 1 urllib.request.urlretrieve(imageUrl, filename=path)#打开网址并下载 url = 'https://mp.weixin.qq.com/s/p7vdIKfwHNPYZYcOIvfKzQ'#目标网址 toPath = r'E:\math context'#存储的位置 imageCrawler(url, toPath)
这样就说明你成功了