对于网上简单爬虫爬取网站图片实例的操作体会

时间:2022-02-09 03:00:03

作为初学爬虫的小白,近日跟着网上的爬虫代码进行了尝试。
参考教程: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)