Python 爬虫: 抓取花瓣网图片

 

接触Python也好长时间了,一直没什么机会使用,没有机会那就自己创造机会!呐,就先从爬虫开始吧,抓点美女图片下来。

废话不多说了,讲讲我是怎么做的。

1. 分析网站

想要下载图片,只要知道图片的地址就可以了,So,现在的问题是如何找到这些图片的地址。

首先,直接访问http://huaban.com/favorite/beauty/会看到页面有20张所要抓取的图片还有一些其他干扰的图片信息(用户的头像、页面的一些图标之类的)。当点击一张美女图片时,页面会跳转到一个新的页面,在这个页面里,是之前那张图片更清晰版本,我们要下当然就要最好的了,就是点击完图片后新页面中那张图片啦。

下一步就是借助一些工具,如firefox的Firebug或者chrome的F12,分析网站。具体步骤有些繁琐,我就不细说了。分析结果是,首先,发送一个get请求,请求url为http://huaban.com/favorite/beauty/,得到一个html页面,在这个页面中<script>标签下有一行以 app.page["pins"] 开头的,就是我们要找的部分,等号后面是一个json字符串,格式化后如下:

 

每张要找的图片对应一个字典,图片的url地址与"file"下的"key"有关,图片类型与"file"下的"type"有关,只要得到这两个值就可以下载到图片了。

在每次下拉刷新时,也是发送了一个get请求,在这个请求中有一个关键参数max,这个就是当前页面中最后一个图片的"pin_id",所以,需要抓取三个内容,分别是"pin_id","file"."key"和"file"."type"。

 

2. 编写爬虫

2.1 requests

使用Python自带的urllib和urllib2库几乎可以完成任何想要的http请求,但是就像requests所说的,Python’s standard urllib2 module provides most of the HTTP capabilities you need, but the API is thoroughly broken. 所以,我这里推荐使用的是requests库,中文文档在这里

2.2 抓取主页面

直接发送get请求,得到html页面

req = requests.get(url = "http://huaban.com/favorite/beauty/")
htmlPage = req.content

2.3 处理html页面

分析html页面,得到图片的pin_id、url和图片类型。首先,用正则处理页面,得到页面中<script>标签中 app.page["pins"] 开头的一行

prog = re.compile(r'app\.page\["pins"\].*')
appPins = prog.findall(htmlPage)

再将这一行中的数据提取出来,直接生成一个Python字典

null = None
result = eval(appPins[0][19:-1])

注:由于javascript中null在Python中为None,所以要让null=None,appPins中还有一个干扰用切片去掉。

之后就可以得到图片的信息,将这些信息以字典形式存入一个列表中

images = []
for i in result:
    info = {}
    info['id'] = str(i['pin_id'])
    info['url'] = "http://img.hb.aicdn.com/" + i["file"]["key"] + "_fw658"
    info['type'] = i["file"]["type"][6:]
    images.append(info)

到此,图片的信息都已经得到了。

2.4 下载图片

知道了图片的url,下载图片就变的非常简单了,直接一个get请求,然后再将得到的图片保存到硬盘。

for image in images:
    req = requests.get(image["url"])
    imageName = image["id"] + "." + image["type"]
    with open(imageName, 'wb') as fp:
            fp.write(req.content)

2.5 处理下拉刷新

 其实处理下拉刷新与之前讲到的处理主页面几乎是一样的,唯一不一样的是每次下拉刷新是get请求的url中max的值不一样,这个值就是我们得到的最后一张图片信息的pin_id。

def make_ajax_url(No):
    """ 返回ajax请求的url """
    return "http://huaban.com/favorite/beauty/?i5p998kw&max=" + No + "&limit=20&wfl=1"

htmlPage = requests.get(url = make_ajax_url(images[-1]['id'])).content

 

最终程序

最终程序见 Github

 

附注:花瓣网不需要登录、没有验证码,甚至网站都没有做最基本的反爬虫检测,可以直接得到想要的内容,相对来说还是比较容易处理,很适合刚开始接触爬虫的同学学习。唯一复杂点的是页面下拉刷新是用的ajax,这个也不难,找到每次get请求的参数是怎么获得的,就没问题了。

posted @ 2015-02-04 17:56 nan86150 阅读(...) 评论(...) 编辑 收藏