Scraping Images

一直觉得爬虫是个很有意思的东西,初学爬虫走了些弯路。个人觉得看视频进度太慢了,还是推荐直接看 python document 以及大部分问题在 stackoverflow 上都找得到。

本文使用的库是 urllibBeautifulSoup4
值得注意的是,python 3 以后的版本中,urllib2 已经并入到 urllib.requesturllib.error 中,详见https://docs.python.org/2/library/urllib2.html
BeautifulSoup4 的安装方法是 pip install beautifulsoup4

本文爬虫功能:爬取图片

首先要获取我们的目标网站信息,使用 urlopen 打开,用 read() 读取

1
2
3
url = 'http://yooooh.net/'

html = urllib.request.urlopen(url).read()

其次要把对象解析为 html 或者 xml,注意这里第二个参数是 html.parser,如果解析为 xml,传入参数是 lxml-xmlxml,详见Beautiful Soup Documentation

1
soup = BeautifulSoup(html, "html.parser")

下面是关键部分,如何在 soup 对象里识别 img 标签。如果要存储为数组,那么用下面的小 trick 就行。

1
2
3
4
soup_img = soup.find_all('img')

# store as array for convenience in for-loop
images = [img for img in soup.find_all('img')]

我们要从中提取图片超链接。观察网站源码(以本此博客为例),格式为<img src="http://i.imgur.com/VzYMnK3.png" alt="">,故可用 element.get('src') 来获取图片超链接。

1
image_links = [each.get('src') for each in images]

接下来就是扫尾部分:通过超链接下载图片并存储到本地路径。根据用户需求,可以分为下载到指定路径和下载到代码文件所在文件夹,而且通常是新建一个 Images 文件来存储图片,方便管理。

  • 下载到指定目录。注意这里使用了双斜杠,其实是转义为单斜杠

    1
    2
    3
    imgPath = 'C:\\Images\\'

    urllib.request.urlretrieve(each, imgPath+filename)
  • 下载到代码文件所在文件夹

    1
    2
    3
    4
    5
    6
    7
    import os

    folderName = 'Images'
    if not os.path.exists(folderName):
    os.makedirs(folderName)

    urllib.request.urlretrieve(each, os.path.join(folderName, filename))

下面给出例子的完整源码:DLImages.py

作为参考,还给出了如何批量下载 qq 头像的代码:QQAvatar.py

结果发现大部分 qq 都是初始头像(估计是一大波僵尸号)。