python爬图指南

银杏叶子

我小时候曾在《科学美国人》上拜读过一篇文章,文中对比了地球上各种不同物种的移动速率,比如熊、猩猩、浣熊、鸟类、鱼类等——当然还有人类——计算它们每移动一公里消耗的热量,最后秃鹫赢了,它的移动效率最高。作为万物之灵的人类,排在倒数第几位。但是杂志特地测量了人类骑自行车的速率。结果把秃鹫远远甩在了身后,在排名上遥遥领先。这篇文章给我留下了深刻的印象,人类擅长发明工具,工具赋予我们奇妙的能力。 苹果以前有一条广告:计算机是头脑的自行车 ,我彻头彻尾地坚信如果将来有人回顾人类历史,计算机将是人类最伟大的发明。

----Steve Jobs(对,就是乔布斯说的,你没看错!!)

那么,正事来了,如何高效看图(别问我看什么图)。

下面的内容就是,当我们有了一定的python基础,如何写这样的一个宅男爬虫(也就是实现打开网页,寻找网页中所有存有网页链接的图片,然后download图片,并且保存在我们指定的文件夹中)。

在我的爬虫中用到了re,os,threading,requests,time这几个模块,其中我使用request模块,替代了官方的urllib2,为毛用requests 不用urllib2,那是因为request的官方文档中的这句话迷住了我:"Requests is the only Non-GMO HTTP library for Python, safe for human consumption.",嘎嘎。

下面正式说思路:我们平时浏览网页,都是在浏览器中输入网址,然后等待网站返回数据,浏览器将网页加载显示出来。在这个过程中,主要是如下几步:

  1. 浏览器向目标网站服务器发送请求,
  2. 目标服务器接受请求,
  3. 目标服务器发送响应数据到浏览器。
  4. 浏览器再将获取的数据解析,形成你所看到的网站(要想更详细的了解整个过程参见书: 计算机网络(自顶向下法))
    目标服务器的响应数据应该长这个样子(有点丑,是吧,哈哈):
<head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;and they lived at the bottom of a well.
</p>
<p class="story">...</p>

这些标题通常有特殊含义:例如<title></title>表示文章标题,<a></a>表示链接,<img href = "......" />表示图片链接,我们就要获取<img>href参数的数据,这里储存着我们需要获取的图片链接地址。然后再打开这个链接,获取里面的图片数据保存就大功告成了。

steps (只描述实现思路,代码起描述作用!!!)

静觅爬虫系列教程(不错的爬虫教程)
下面按步骤介绍实现思路,当你实现时,应该各个功能封装成函数,或者封装成类,并且加入异常监测,以保证代码运行的稳定性,并且将程序中出现的错误记入写入log,方便以后查看。

  1. 调用类似下面的代码,获取我们所需的网站内容(也就是HTML文本,CSS样式表,JavaScript):
import requests
web = requests.get('http://www.baidu.com')
print web.text```

2. 编写正则表达式,以某种特定格式匹配我们需要获取的内容,然后将获取内容保存:

import request
import re
page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

有些服务器会对请求进行验证,加入headers装作我是好人

headers = { 'User-Agent' : user_agent }

获取目标站的Http代码

web = requests.get(url,headers=headers)

根据目标站的Http代码,找到我们要获取的内容格式特点,书写正则,并测试

pattern = re.compile('<div.?author">.?<a.?<img.?>(.?)</a>.?<div.?'+
'content">(.
?).?</div>(.?)<div class="stats.?class="number">(.?)</i>',re.S)

所有的查找匹配结果都会储存在imgurl这个列表中

imgurl = re.findall(pattern,web.content)


3. 既然我们成功获取了要匹配的数据(我假设是图片链接),那么就可以打开图片链接进行处理

import request
import re
import os
page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

有些服务器会对请求进行验证,加入headers装作我是好人

headers = { 'User-Agent' : user_agent }

获取目标站的Http代码

web = requests.get(url,headers=headers)

根据目标站的Http代码,找到我们要获取的内容格式特点,书写正则,并测试

pattern = re.compile('<div.?author">.?<a.?<img.?>(.?)</a>.?<div.?'+
'content">(.
?).?</div>(.?)<div class="stats.?class="number">(.?)</i>',re.S)

所有的查找匹配结果都会储存在imgurl这个列表中

imgurl = re.findall(pattern,web.content)

创建要保存的文件夹

os.mkdir('/home/picture')
for item in imgurl:
imgdata = requests.get(item,headers=headers)
picorder = picorder + 1
f = open('/home/picture/'+str(picorder),'rw')
f.write()
f.flush()
f.close()


4. 当上面所有的都完成之后,你良好的运行一阵,是否觉得下载图片太慢,那么下面我们再加入多线程
>**CPython**实现细节:在Cpython,由于全局解释器锁(Global interpreter Lock GIL),每次只能有一个线程可以 执行Python 代码(即使某些以效率为导向的库(performance-oriented libraries)可能克服这些限制)。如果你希望你的应用更好的利用电脑的多核资源。建议你使用**multiprocessing
** 或者**concurrent.futurres.ProcessPollExector
**模块。然而多线程仍然是适当的模块,当你使用多IO并行任务时(multiple I/O - bound tasks simultaneously)

import request
import re
import os
page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

有些服务器会对请求进行验证,加入headers装作我是好人

headers = { 'User-Agent' : user_agent }

获取目标站的Http代码

web = requests.get(url,headers=headers)

根据目标站的Http代码,找到我们要获取的内容格式特点,书写正则,并测试

pattern = re.compile('<div.?author">.?<a.?<img.?>(.?)</a>.?<div.?'+
'content">(.
?).?</div>(.?)<div class="stats.?class="number">(.?)</i>',re.S)

所有的查找匹配结果都会储存在imgurl这个列表中

imgurl = re.findall(pattern,web.content)

创建要保存的文件夹

os.mkdir('/home/picture')
picorder = picorder +1

当要下载内容不空时,开启4个下载线程

while items:
if threading.activeCount()<5:
a = threading.Thread(target=downfunc,args=(items.pop(),picoder))
a.start()

定义一个下载函数

def downfunc(url,order)
imgdata = requests.get(url,headers=headers)
f = open('/home/picture/'+str(order),'rw')
f.write()
f.flush()
f.close()


整体代码思路就向上面类似,不过自己实现要学习**```request,re,threading,os```**这几个库,关于匹配还可以引入**```beautifulsoup```** 或者**```xpath```**更方便快捷的解析```HTML```文本。革命尚未成功,同志仍需努力!!!!!!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,700评论 6 28
  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 18,070评论 45 523
  • 文/ 陈皓 至今,在家里的衣柜里,还珍藏着我兵之初的有些褪色的军用挎包。它时刻会提醒我,在从军路上要敢于担当、...
    沂蒙文学阅读 2,496评论 5 9
  • 人似乎就是这般不公,用自己个人的目光来判断一个人的好坏,并就此划分喜恶,极端而尖锐,然后就此形成一个社交圈。 每一...
    酉它阅读 151评论 2 0