【爬虫】一个简单爬虫

环境:
Mac OS X Yosemite 10.10.4
Python2.7.6


哎,其实早就迫不及待的想动手了,今天下午终于抽时间写了个很简单的爬虫的小例子。
例子的目标是

下载 豆瓣妹子 从n1页到n2页的照片(n1, n2自定义)

打开豆瓣妹子主页 http://www.dbmeinv.com/?pager_offset=1 右键审查元素,查找图片对应的代码

【爬虫】一个简单爬虫_第1张图片
C8B5C564-89AD-4086-91A6-73F73A471435.png

那么,我们的思路就是获取网页内容之后,通过正则表达式匹配到所有图片的src,然后将图片保存为本地文件。
ok,每张图片对应一个 中,为确保图片使我们想下载的图片,可以在向外匹配到 ,该正则表达式的匹配模式是 .*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?(关于正则表达式可参考 正则表达式学习笔记(一)),看到两个 ()是引用分组,可通过num获取对应的分组文本,这里分别获取 src 和 alt,src 是获取图片的资源链接,alt可以用来给保存本地的图片命名。
好,下一步是获取该网页的文本内容,新建文件dbmeizi.py代码:

# -*- coding:utf-8 -*-
import urllib
import urllib2

url = 'http://www.dbmeinv.com/?pager_offset=1'
response = urllib2.urlopen(url)
text = response.read()
print text

在终端执行 python dbmeizi.py
恩,顺利得到网页文本没有问题

【爬虫】一个简单爬虫_第2张图片
屏幕快照 2015-05-06 下午9.10.55.png

然后通过正则表达式获取图片的url

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re

url = 'http://www.dbmeinv.com/?pager_offset=1'
response = urllib2.urlopen(url)
text = response.read()

pattern = re.compile(r'.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?', re.S)
imgs = re.findall(pattern, text)

for img in imgs:
    print img[0], img[1]

终端执行


【爬虫】一个简单爬虫_第3张图片

然后,将图片保存在本地,并通过同时获取的alt给图片命名。

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import os

url = 'http://www.dbmeinv.com/?pager_offset=1'
response = urllib2.urlopen(url)
text = response.read()

pattern = re.compile(r'.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?', re.S)
imgs = re.findall(pattern, text)

i = 0
os.system("mkdir images")   #通过命令行的方式创建图片保存目录

for img in imgs:
    imagePath = "images/%d_%s.png" % (i, img[0])
    imageUrl = img[1]
    imageData = urllib.urlopen(imageUrl).read()
    f = open(imagePath, 'w')
    f.write(imageData)
    print '正在保存图片:', imagePath
    f.close()
    i += 1

需要注意的是,我们引入了 模块 os为了执行命令行命令创建图片保存目录。还声明了一个全局变量i,给图片编号。
终端执行

【爬虫】一个简单爬虫_第4张图片

到现在,已经完成了主要工作,要下载n1页到n2页的所有图片,只需要对url中的p进行修改。还可以对代码进行必要的封装,比如将下载图片和保存图片单独封装成一个类方法。下载n1到n2封装成一个类方法,统一调用。
最后代码如下:

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import os

class ImageSpider(object):
    """docstring for ClassName"""

    num = 0;

    def __init__(self):
        pass

    def saveImage(self, imageUrl, imageName):
        imageData = urllib.urlopen(imageUrl).read()
        f = open(imageName, 'w')
        f.write(imageData)
        print '正在保存图片:', imageName
        f.close()
    

    def getImageFormUrl(self, url):
        response = urllib2.urlopen(url)
        text = response.read()

        pattern = re.compile(r'.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?', re.S)
        imgs = re.findall(pattern, text)

        for img in imgs:
            imageName = "images/%d_%s.png" % (ImageSpider.num, img[0])
            imageUrl = img[1]
            self.saveImage(imageUrl, imageName)
            ImageSpider.num += 1


    def getImagePageRange(self, fromPage, toPage):

        os.system('mkdir images')   #创建保存图片的目录

        i = int(fromPage)
        while i <= int(toPage):
            url = "http://www.dbmeinv.com/?pager_offset=" + str(i)
            print "\n第%d页" % i
            self.getImageFormUrl(url)
            i += 1

imageSpider = ImageSpider()
beginPage = raw_input("输入开始页:")
endPage = raw_input("输入结束页:")
imageSpider.getImagePageRange(beginPage, endPage)
【爬虫】一个简单爬虫_第5张图片

你可能感兴趣的:(【爬虫】一个简单爬虫)