• 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请求的参数是怎么获得的,就没问题了。

  • 相关阅读:
    页面上有10个多选框,实现三个按钮(重置、反选、全选)功能
    鼠标点哪 哪出15*15的圆型div
    es写简单的留言板
    面试准备(3)事件循环
    面试准备(2)async+await的使用与原理
    面试准备(1)重排与重绘和验证码
    vue项目修改el-input样式
    echarts画雷达图详解
    决心
    国庆中秋
  • 原文地址:https://www.cnblogs.com/nan86150/p/4272452.html
Copyright © 2020-2023  润新知