作为初学爬虫的小白,近日跟着网上的爬虫代码进行了尝试。
参考教程:python 实现简单爬虫功能
在操作过程中,遇到一些问题,这里将问题进行整理记载,方便日后查询。
整体操作过程可分为三个步骤:
- 获取页面信息
- 读取图片链接
- 将图片保存在本地指定目录下
首先进行第一步。
这里要说明一下,python3.X进行了一些更改,它将urllib与urllib2库进行了合并,具体更改请参考:Python3学习笔记(urllib模块的使用)
其实最好还是看官方文档:python3.0中urllib的模块介绍
下面贴代码(代码是在参考文档的基础下进行的改动):
import urllib.request
def getHtml(url):
page = urllib.request.urlopen(url) #打开url地址
html = page.read().decode('utf-8') #读取url页面数据
return html
这里page.read()后面需加入decode(‘utf-8’)进行解码,不然会报错。
然后进入第二步,读取图片链接。先上代码~
def getImg(html):
reg = r'src=".+?\.jpg"'
imgre = re.compile(reg)
imglist = re.findall(imgre, html) #第一种findall
#imglist = imgre.findall(html) 第二种findall
这里涉及到正则表达式的匹配。
正则表达式对于爬虫有相当重要的应用,它可以在如此庞大的网页内容中匹配到想要的结果,并以列表的形式返回。
关于正则表达式,我对其也进行过搬运,点击查看哦 python爬虫之re正则表达式库
代码中先定义好正则表达式,然后对其通过compile()进行编译,方便在整篇文档中进行搜索匹配,这里findall()方法有两种方式进行搜索。
- 第一种是传入两个参数,para1为编译后的表达式对象,para2为要读取的html页面。
- 第二种方式是直接利用编译好的表达式对象,因为该对象编译后已经成为正则式,所以可以利用该对象的findall()函数,此时只需要一个函数para1,来传入读取的html页面。
当匹配完成后,我们会得到一个包含匹配结果的返回列表,列表的每一项都是依次匹配后得到的url字符串。到这里按理说我们应该可以进入第三步了,但是到后面我们会发现,这里的url是不能识别的格式。本人在这里纠结了好久,不知道错在了哪里,后来发现了另一篇解决该问题的博,如下:python获取网络图片
文中匹配了com后面的部分,利用append()函数将匹配结果添加至列表。并利用for循环把每一个匹配到的字符串增加了“http://……”的前缀,将其变为了可识别的url格式。
imgurllist = []
for imgurl in imglist:
src = re.compile(r'com(\/.+\.jpg)')
imgsrc = src.findall(imgurl)
imgurllist.append('http://img.mukewang.com'+imgsrc[0])
现在就可以进入第三步,将图片下载到本地。
x = 0
for imgurl in imgurllist:
path = os.path.abspath('.') #获取当前绝对路径
urllib.request.urlretrieve(imgurl, path + '/pic/%s.jpg' % x)
x += 1
这里用到的关键函数是urllib.request.urlretrieve(),它可以将远程数据直接下载到本地。可以看到,通过循环,访问每一个有效的url地址,将图片下载到指定文件夹中,并依次序进行命名。
至此,整个获取过程就完成了。
完整代码
import re
import os
import urllib.request
def getHtml(url):
page = urllib.request.urlopen(url) #打开url地址
html = page.read().decode('utf-8') #读取url页面数据
return html
def getImg(html):
reg = r'src=".+?\.jpg"'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
#imglist = imgre.findall(html) 第二种findall方式
imgurllist = []
for imgurl in imglist:
src = re.compile(r'com(\/.+\.jpg)')
imgsrc = src.findall(imgurl)
imgurllist.append('http://img.mukewang.com'+imgsrc[0])
x = 0
for imgurl in imgurllist:
path = os.path.abspath('.')
urllib.request.urlretrieve(imgurl, path + '/pic/%s.jpg' % x)
x += 1
return imgurllist
html = getHtml("http://www.imooc.com/course/list")
imgurllist = getImg(html)
print(imgurllist)