热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

抓取花瓣网图片

接触Python也好长时间了,一直没什么机会使用,没有机会那就自己创造机会!呐,就先从爬虫开始吧,抓点美女图片下来。废话不多说了,讲讲我是怎么做的。1.分析网站想要下载图片,只要知

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

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

1. 分析网站

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

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

下一步就是借助一些工具,如firefox的Firebug或者chrome的F12,分析网站。具体步骤有些繁琐,我就不细说了。分析结果是,首先,发送一个get请求,请求url为http://huaban.com/favorite/beauty/,得到一个html页面,在这个页面中标签下有一行以 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和图片类型。首先,用正则处理页面,得到页面中标签中 app.page["pins"] 开头的一行

prog = re.compile(rapp\.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(self, 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请求的参数是怎么获得的,就没问题了。

抓取花瓣网图片


推荐阅读
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • 本文介绍了 AngularJS 中的 $compile 服务及其用法,通过示例代码展示了如何使用 $compile 动态编译和链接 HTML 元素。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • ZooKeeper 入门指南
    本文将详细介绍ZooKeeper的工作机制、特点、数据结构以及常见的应用场景,包括统一命名服务、统一配置管理、统一集群管理、服务器动态上下线和软负载均衡。 ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 系统数据实体验证异常:多个实体验证失败的错误处理与分析
    在使用MVC和EF框架进行数据保存时,遇到了 `System.Data.Entity.Validation.DbEntityValidationException` 错误,表明存在一个或多个实体验证失败的情况。本文详细分析了该错误的成因,并提出了有效的处理方法,包括检查实体属性的约束条件、调试日志的使用以及优化数据验证逻辑,以确保数据的一致性和完整性。 ... [详细]
  • 装饰者模式(Decorator):一种灵活的对象结构设计模式
    装饰者模式(Decorator)是一种灵活的对象结构设计模式,旨在为单个对象动态地添加功能,而无需修改原有类的结构。通过封装对象并提供额外的行为,装饰者模式比传统的继承方式更加灵活和可扩展。例如,可以在运行时为特定对象添加边框或滚动条等特性,而不会影响其他对象。这种模式特别适用于需要在不同情况下动态组合功能的场景。 ... [详细]
  • 本文详细解析了Autofac在高级应用场景中的具体实现,特别是如何通过注册泛型接口的类来优化依赖注入。示例代码展示了如何使用 `builder.RegisterAssemblyTypes` 方法,结合 `typeof(IEventHandler).Assembly` 和 `Where` 过滤条件,动态注册所有符合条件的类,从而简化配置并提高代码的可维护性。此外,文章还探讨了这一方法在复杂系统中的实际应用及其优势。 ... [详细]
author-avatar
A因为爱情Q_860
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有