先说下具体思路
1.打开一个包含图片的网页;
2.查看其源代码,寻找图片的格式,一般为src=***.jpg/png;
3.利用python自带模块进行匹配,提取出图片url的列表;
4.利用for循环遍历整个列表;
5.同时将图片保存在本地。
学习笔记
1.url要用decode方法解码一下,一般解码成utf-8的格式,具体可以查看下网页源代码中charset是什么;
2.有关findall:当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序;当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容);当给出的正则表达式中不带括号时,列表的元素为字符串,此字符串为整个正则表达式匹配的内容;
3.如果想在字符串里添加变量,请用%s的形式,如下例倒数第四行,如果把%s换成i的话,将保存最后一张图片(把之前的覆盖了),因为i在引号里会恒为1。
源代码
#coding=utf-8
import urllib
import urllib.request
import re
def getHtml(url):
page = urllib.request.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.+?\.jpg)"'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
return imglist
html = getHtml("http://www.feixingrui.com/pspiliang.html").decode('utf-8')
i = 1
for n in getImg(html):
urllib.request.urlretrieve(n,"/Users/Feixingrui/Desktop/python_spider/%s.jpg" %i)
print('%s/%s' %(i,len(getImg(html))))
i += 1
print ('finish!')
疑问&进阶
1.(.+?\.jpg).+为通配符,但是?是什么意思呢?
答:?的意思是+可有可无,其实.+的意思就是一个或多个字符,所以此处?可有可无。
2.如果网页中图片有很多很多该如何抓取?
3.如何优化代码(清除缓存,提高效率等)?
4.如何抓取多个页面的图片(需要点击下一页,比如百度图片)?
答:可以查看多个页面的URL的不同点,一半均为balabalabala=数字这种格式,通过循环,一个页面一个页面打开并抓取即可。
5.如何设置其它命名规则(如按日期、自定义等等)?
本文思路来源于网络,由www.feixingrui.com完善整理。
费星瑞|爱学习