设为首页 收藏本站
查看: 770|回复: 0

[经验分享] Python 爬虫: 抓取花瓣网图片

[复制链接]

尚未签到

发表于 2015-11-29 13:15:23 | 显示全部楼层 |阅读模式
  
  接触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字符串,格式化后如下:
DSC0000.png
  每张要找的图片对应一个字典,图片的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请求的参数是怎么获得的,就没问题了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144940-1-1.html 上篇帖子: APScheduler —— Python化的Cron 下篇帖子: python construct文档
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表