Bubbles~blog

用爱发电

a photo crawler

这是以前写的一个爬虫了,最近整理发现还能用,而且也比较典型,所以就拿出来分享一下。
下面是要爬取的页面
淘宝某库
打开页面你会查看源代码你会发现源码里并没有我们需要爬取的图片链接,也就是说这些链接是由JavaScript生成的,而且点击翻页也没有页面的刷新,这样使用普通的方法当然是没法爬的,一般对于动态页面我们可能会选择selenium+PhantomJs的组合,其实这样也挺简单方便的,selenium的模拟输入也是非常爽的,不过我们也可以对界面进行逆向分析来进行破解,刚好这个页面也比较典型,如果再复杂一点可能我们也分析不出啥来。。。

首先我们使用f12来分析这个网站的请求,在network里我们可以看到所有往来的数据包,
翻到下面就能看到我们需要爬取的各种图片了
这里我们就要找到包含了图片地址的数据包,这种一般是用jason来返回信息,翻啊翻,
终于我们看到了一个可疑的网址,在response中查看,果然返回的是jason信息,而且包含的就是我们需要的数据

https://mm.taobao.com/alive/list.do?scene=all&page=1&_ksTS=1505012006719_128&callback=jsonp129
而且我们分析这个url,其实也是很有特点的,里面有page=1,那么我们想改成其他的是否依然可行,一试果然可以,而且其他部分都是不用更改的,那么这样我们就可以直接使用普通的方法来爬取我们需要的数据了
下面就直接上代码了,因为当时写的比较粗糙,可能效率也不是很高,凑合看吧。。。

# _*_ coding: utf-8 _*_
import urllib2
import re
import uuid
import os
import urllib
 
 
localpath='C:\\Users\\john\\Desktop\\tuku\\taobaophoto'
photolists = []
def download(url):
    print 'downloading:',url
    try:
        html = urllib2.urlopen(url).read()
    except urllib2.URLError as e:
        print 'download error:',e.reason
        html=None
        if hasattr(e,'code') and 499<e.code<600:
            return download(url)
    return html
#获取图片链接
def photolink(url):
    a='http:'
    html = download(url)
    photopattern = re.compile(r'avatarUrl":"(.*?)"')
    photolist = photopattern.findall(html)
    for x in photolist:
        if a not in x:
            x = a+x
            photolists.append(x)
        else:
            photolists.append(x)
    return photolists
#选择要爬取的页面
def morepages():
    for page in xrange(1,10):
        url='https://mm.taobao.com/alive/list.do?scene=all&page=%d&_ksTS=1498925467840_182&callback=jsonp183' % page
        photolink(url)
#生成文件名
def filename():
    return str(uuid.uuid1())
#创建文件
def createfile(localpaths,filenames):
    totalpath = localpaths+'\\'+filenames
    if not os.path.exists(totalpath):
        file = open(totalpath,'a+')
        file.close()
        return totalpath
 
def getphoto(imgurl):
    if(len(imgurl)!=0):
        filenames = filename()+'.jpg'
        try:
            urllib.urlretrieve(imgurl,createfile(localpath,filenames),callbackfunc)
        except urllib.ContentTooShortError:
            print 'net error.... reloading'
            getphoto(imgurl)
#显示下载进度
def callbackfunc(blocknum, blocksize, totalsize):
 
    percent = 100.0 * blocknum * blocksize / totalsize
    if percent > 100:
        percent = 100
    print "%.2f%%"% percent
 
morepages()
id = 1
for urls in photolists:
    getphoto(urls)
    print ('saving...%d' % id)
    id = id+1