本笔记整理自中谷教育在线教育视频
学习笔记——正则表达式常用符号
这里学习过正则表达式后,简单做了一个爬虫程序,效果为从某个网站上下载网站上的符合要求的图片。这里选取了百度贴吧中的某个壁纸网站:实验网站,目标是下载实验网站上面的壁纸图片。
实现代码
import re
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.*?\.jpg)" width'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' %x)
x+=1
Html = getHtml("https://tieba.baidu.com/p/1112043392?pid=12757849991&cid=0&red_tag=0812006929#12757849991") \\选取某百度贴吧网址
getImg(Html)
代码分析
首先,这里导入正则表达式模块re、网页爬虫模块urliib
import re
import urllib
定义两个函数,getHtml()和getImg(),作用分别为获得网页的源代码和得到图片。
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
getHtml()函数实现了从网站url上获取源代码。
def getImg(html):
reg = r'src="(.*?\.jpg)" width'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' %x)
x+=1
getImg()函数实现了从源代码匹配图片的原网址代码,主要是正则的定义,分析过网站源代码后,发现图片原网址有以下共同特征:以'.jpg'结尾,网站前后有",在""之前有字符串'src=',之后有' width',于是,正则的定义可以如下:
reg = r'src="(.*?\.jpg)" width'
其中,reg = r'str'表示定义字符串str为正则;()表示只输出()内的字符串的内容,即在后面由re.findall()函数匹配后只输出图片源网站。这里的'.'表示任意字符,'*'表示取0到无限长,'?'表示进行最小匹配,防止在网站源代码内进行最大搜索,不能得到图片网址,这里第二个'.'前面加''表示这里的'.'是字符本身,而不是广泛的任意字符。
然后使用urllib.urlretrieve()实现图片的下载,命名。
urllib.urlretrieve(imgurl,'%s.jpg' %x)
几点问题
- 这里进行图片下载时首先要保证图片网站是能够进入的,笔者在实现时就出现了报错状态,原因是匹配的图片网站本身就是不可进入的。
- 匹配后可能会出现非要求的网址被匹配出来,这里就要求能够精确搜索条件,增加匹配的精度。
网友评论