美文网首页codepy爬虫Python应用实战
【爬虫】一个简单爬虫

【爬虫】一个简单爬虫

作者: 贰拾贰画生 | 来源:发表于2015-05-07 13:47 被阅读1310次

    环境:
    Mac OS X Yosemite 10.10.4
    Python2.7.6


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

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

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

    C8B5C564-89AD-4086-91A6-73F73A471435.png
    那么,我们的思路就是获取网页内容之后,通过正则表达式匹配到所有图片的src,然后将图片保存为本地文件。
    ok,每张图片对应一个<img >中,为确保图片使我们想下载的图片,可以在向外匹配到<span> </span>,该正则表达式的匹配模式是 <span>.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?</span>(关于正则表达式可参考正则表达式学习笔记(一)),看到两个()是引用分组,可通过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
    恩,顺利得到网页文本没有问题

    屏幕快照 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'<span>.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?</span>', re.S)
    imgs = re.findall(pattern, text)
    
    for img in imgs:
        print img[0], img[1]
    

    终端执行



    然后,将图片保存在本地,并通过同时获取的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'<span>.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?</span>', 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,给图片编号。
    终端执行


    到现在,已经完成了主要工作,要下载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'<span>.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?</span>', 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)
    

    相关文章

      网友评论

      本文标题:【爬虫】一个简单爬虫

      本文链接:https://www.haomeiwen.com/subject/jpwifttx.html