亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 5393 | 回復(fù): 2
打印 上一主題 下一主題

python自動(dòng)抓取美圖網(wǎng)圖片 [復(fù)制鏈接]

論壇徽章:
3
CU大;照
日期:2013-03-13 15:32:35CU大;照
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-12-05 16:33 |只看該作者 |倒序?yàn)g覽
本帖最后由 wulien88 于 2012-12-05 16:35 編輯

經(jīng)常去美圖網(wǎng)上看圖片,于是就想搞個(gè)爬蟲(chóng)去自動(dòng)下載,反復(fù)搞了一星期,都是動(dòng)態(tài)鏈接不好解析出來(lái),開(kāi)始還以為手動(dòng)的寫(xiě)的爬蟲(chóng)不給力,于是又學(xué)習(xí)了一下scrapy,以為可以把動(dòng)態(tài)的鏈接給抓下來(lái),沒(méi)想到還是不行,http://blog.scrapy.org/scraping-ajax-sites-with-scrapy也說(shuō)了要手動(dòng)分析,感謝crifan的教程,于是利用firebug去分析了一下ajxa動(dòng)態(tài)鏈接,最后算是可以自動(dòng)抓取了,程序?qū)懙谋容^隨意,就是一個(gè)思路,歡迎大家一起學(xué)習(xí)交流。

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/69962,http://www.meitu.com/22266296/photo/69366
# 3.解析2中鏈接,獲得兩個(gè)id值,見(jiàn)4中兩個(gè)id
# 4.封裝ajax動(dòng)態(tài)鏈接,格式:http://www.meitu.com/photos/ajax ... 6773&direction=,并發(fā)送請(qǐng)求
# 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)
#################開(kāi)始#########################
if __name__ == '__main__':
        url = "http://www.meitu.com"
        mySpider = spider(url)
        mySpider.go()

純屬交流貼,歡迎拍磚,下載時(shí)注意數(shù)量限制,一直爬下去說(shuō)不定會(huì)封ip,呵呵

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-12-05 22:31 |只看該作者
不錯(cuò),我最近也在想做圖片抓取,很有借鑒意義!

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-12-30 13:52 |只看該作者
回復(fù) 1# wulien88


你是如何解決內(nèi)存的問(wèn)題的。我的2G內(nèi)存的服務(wù)器再爬內(nèi)容的時(shí)候。幾個(gè)小時(shí)就把內(nèi)存吃滿(mǎn)了。
你有沒(méi)有什么好的解決方案,針對(duì)爬蟲(chóng)使用內(nèi)存的
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP