Python学习随笔

本笔记整理自中谷教育在线教育视频

学习笔记——正则表达式常用符号

这里学习过正则表达式后,简单做了一个爬虫程序,效果为从某个网站上下载网站上的符合要求的图片。这里选取了百度贴吧中的某个壁纸网站:实验网站,目标是下载实验网站上面的壁纸图片。

实现代码

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)

几点问题

  • 这里进行图片下载时首先要保证图片网站是能够进入的,笔者在实现时就出现了报错状态,原因是匹配的图片网站本身就是不可进入的。
  • 匹配后可能会出现非要求的网址被匹配出来,这里就要求能够精确搜索条件,增加匹配的精度。

你可能感兴趣的:(Python学习随笔)