免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5340 | 回复: 2
打印 上一主题 下一主题

python自动抓取美图网图片 [复制链接]

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-05 16:33 |只看该作者 |倒序浏览
本帖最后由 wulien88 于 2012-12-05 16:35 编辑

经常去美图网上看图片,于是就想搞个爬虫去自动下载,反复搞了一星期,都是动态链接不好解析出来,开始还以为手动的写的爬虫不给力,于是又学习了一下scrapy,以为可以把动态的链接给抓下来,没想到还是不行,http://blog.scrapy.org/scraping-ajax-sites-with-scrapy也说了要手动分析,感谢crifan的教程,于是利用firebug去分析了一下ajxa动态链接,最后算是可以自动抓取了,程序写的比较随意,就是一个思路,欢迎大家一起学习交流。

import urllib
import urllib2
import urlparse
import sgmllib
import re
import pprint
import os

# 流程:
# 1. 入口链接:http://www.meitu.com
# 2:解析出包含的图片链接,如:http://www.meitu.com/12873415/photo/69962http://www.meitu.com/22266296/photo/69366
# 3.解析2中链接,获得两个id值,见4中两个id
# 4.封装ajax动态链接,格式:http://www.meitu.com/photos/ajax ... 6773&direction=,并发送请求
# 5.解析4中链接,得到图片下载链接:http://img14.meitudata.com/20121 ... l.jpg!thumbnail1000

class findLink(sgmllib.SGMLParser):
        def __init__(self):
                sgmllib.SGMLParser.__init__(self)
                self.links = []
        #获得包含图片的链接,如http://www.meitu.com/12873415/photo/69962
        def start_a(self, attributes):
                for link in attributes:
                        tag, attr = link[0 : 2]
                        if "href" == tag:
                                self.links.append(attr)
class Retrieve(object):
        def __init__(self, url):
                #下载图片的保存路径
                self.localdir = "F:\\pic\\autoCatch"
                self.url = url
                self.file = self.filePath(url)

        def filePath(self, url):
                if len(url):
                        #解析http://img14.meitudata.com/20121 ... l.jpg!thumbnail1000,获得文件夹和文件名
                        #F:\pic\autoCatch\201211\fhb1plyt88ty9nz2ol.jpg
                        parsedurl = urlparse.urlparse(url)
                        path = parsedurl[2]
                        path = path.split("/")
                        name = path[-1].split(".")[0]
                        path = "\\" + path[1]
                        path = self.localdir + path + "\\"
                        try:
                                os.mkdir(path)
                        except WindowsError:
                                print "dir is already exist!"

                        name = path + name + '.jpg'
                else:
                        name = ""
                        RuntimeError("parsing url is empty!")
                return name
        def download(self):
                if len(url):
                        retval = urllib.urlretrieve(self.url, self.file)
                        print "DownLoad %s is OK" % self.file
                else:
                        RuntimeError("DownLoad is error!")

class spider(object):
        def __init__(self, url):
                self.url = url;

        def getPage(self, url):
                #入口链接地址,并封装头部
                opener = urllib2.build_opener()
                opener.addheaders = [('User-agent', 'Mozilla/5.0')]
                self.page = opener.open(url).read()
                return self.page

        def parseUrl(self):
                linkUrl = findLink()
                linkUrl.feed(self.page)
                rFilter = "http://www.meitu.com/([\d]+)/photo/([\d]+)"
                self.q = []
                for link in linkUrl.links:
                        success = re.match(rFilter, link)
                        if  success is not None:
                                # print success.group()
                                self.q.append(success.group())
                return self.q
               
        def parsePicAndGetUrl(self, page):
                rTarget_id = "id=\"target_id\" value=\"(\d+)\""
                targetList = re.findall(rTarget_id, page)
                targetId = targetList[0]
                rAlbum_id = "id=\"album_id\" value=\"(\d+)\""
                albumList = re.findall(rAlbum_id, page)
                albumId = albumList[0]
                picUrl = "http://www.meitu.com/photos/ajaxDetail?id=" + targetId+ "&album_id=" + albumId + "&direction="
                return picUrl

        def parsePicUrl(self, page):
                rFilterPic = "\"thumb_pic\":\"(http:.+thumbnail\d{3}\d+)"
                finalPicUrlList = re.findall(rFilterPic, page)
                if len(finalPicUrlList):
                        finalPicUrl = finalPicUrlList[0]
                        finalPicUrl = "".join(finalPicUrl.split("\\"))
                        print finalPicUrl
                else:
                        finalPicUrl = ""
                        RuntimeError("Can't find picture url in page!")
               
                return finalPicUrl

        def go(self):
                self.getPage(self.url)
                print "Get '%s' page is OK!" % self.url
                self.parseUrl()
                print "Parse '%s' is OK" % self.url
                i = 0
                for qUrl in self.q:
                        if (i == 10):
                                break
                        i += 1
                        qPage = self.getPage(qUrl)
                        print "Get '%s' page is OK!" % qUrl
                        picUrl = self.parsePicAndGetUrl(qPage)
                        print "Parse '%s' dynamic url is OK!" % picUrl
                        picPage = self.getPage(picUrl)
                        print "Get '%s' page is OK!" % picUrl
                        finalPicUrl = self.parsePicUrl(picPage)
                        print "Get finalPicUrl '%s' is OK" % finalPicUrl
                        if not qUrl:
                                print "url '%s' is empty" % qUrl
                        else:
                                picRetrive = Retrieve(finalPicUrl)
                                picRetrive.download()
                print "DownLoad all pictures OK! Total is ", len(self.q)
#################开始#########################
if __name__ == '__main__':
        url = "http://www.meitu.com"
        mySpider = spider(url)
        mySpider.go()

纯属交流贴,欢迎拍砖,下载时注意数量限制,一直爬下去说不定会封ip,呵呵

论坛徽章:
0
2 [报告]
发表于 2012-12-05 22:31 |只看该作者
不错,我最近也在想做图片抓取,很有借鉴意义!

论坛徽章:
0
3 [报告]
发表于 2012-12-30 13:52 |只看该作者
回复 1# wulien88


你是如何解决内存的问题的。我的2G内存的服务器再爬内容的时候。几个小时就把内存吃满了。
你有没有什么好的解决方案,针对爬虫使用内存的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP