教女朋友爬虫(续)

上次写的教程让女票高兴了很久,但她高兴的原因恐怕并不是学会了爬虫,这点我还是非常清醒的。这篇教程的续集我很早就想好,但碍于实在没有时间将它写出来,终于咖啡馆的网络不好用,又没带书,只好耐着性子写完它,算给自己为了爬虫痴迷那几天一个交代。我还是尽量写的通俗,以求能让更多的人看懂,比如我可爱的女票。

重要的前提,我假定你们已经看过第一篇爬虫教程,并且已经实操了,那么我们跳过环境设置,直入主题。最近开了博客(www.readlist.cn),我将教程放在那里,欢迎大家有空去看看,涨个人气。

我们的目的是爬取网页中的图片,可能你已经发现了,我们只能下载网页中的20张图片。实际上,我们用浏览器浏览该网页时,页面中的照片不止20张,随着滚动条的滚动,好像网页在不断的加载新的照片,可不可以贪心的把所有的照片下载下来呢?当然可以!

还用用chorme打开我们爬虫的目标网页,页面上右击选择显示网页源代码,我们在新打开的标签页看到了该网页的源代码。

显示源代码

有了前面的基础,我们可以轻松的找到我们需要的图片地址,<img class="pic" src="后面跟着的就是我们需要的图片地址。按command+F搜索这串代码,发现chrome在该源代码中找到20个对象,这与我们第一篇教程得到的结果是相符的。接下来,你可以试试,无论你怎么滚动滚动条,源代码不变,也就是源代码只有前20张照片的地址,那么后面的图片地址在哪里?

查找图片地址

异步加载

其实,这个网页用到了一种常见的网页加载技术——异步加载。试想一下,该网页可能有成千上万的照片,如果当浏览器访问时,全部显示显然要花很长时间才能全部加载,浪费时间浪费带宽,解决这一不合理状况的就是异步加载技术。你浏览该网页时,浏览器只会加载前20张照片,当你滚动条滑动最下面时,浏览器认为你还需要阅读更多的内容,就会向服务器提出申请说,“这个用户想看更多的,再来些“,服务器会再发20张图片的内容给浏览器,以此类推。

上述过程,你可以通过在网页空白处右键点击检查,下面的chrome工具栏中的Network标签会告诉你浏览器是怎么实现我们上面所述的异步加载。滚动滚动条至最下面,你会发现工具栏中出现了21个对象,其中20个为图片,就是页面新加载的20张图片,剩下1个是json文件。继续滚动,这里会再增加21个,以此类推,有没有很有意思。

检查元素

我们可以将json理解为一个包裹,这个包裹里放着的就是20张图片的地址,我们每滚动到页尾,就会向服务器申请一个包裹,然后浏览器拆开包裹,将里面的内容显示在网页上。可是,服务器里存放了无数个包裹,它怎么知道我们需要哪个包裹,有过网购经验的MM肯定可以想到,每个包裹都有一个唯一的身份证,我们称之为“快递单号”。这样,一切就可以解释,浏览器将我们需要的包裹号发送给服务器,服务器然后如实将该包裹发送回来。我们可以仔细看下json,选中json文件,在右侧的工具栏中选择Preview标签,里面的html中放着的是有新增加图片地址的源代码,last_key是下一段代码的包裹号,所以不难推测,源代码中有一个last_key指向本包裹。

JsonPreview

我们重新捋一下思路,首先爬取源代码中的图片,然后向服务器发送包裹号,获取包裹,解析其中的内容,然后再发送包裹号,再解析包裹中的内容,以此类推。接下来,终于可以上代码了。

#-*-coding:utf8-*-
import re
import requests
import json

url = 'http://www.qdaily.com/categories/17'
url_more = 'http://www.qdaily.com/categories/categorymore/17/'

html = requests.get(url).text
last_key = re.search('lastKey="(.*?)"',html,re.S).group(1)

for i in range(3):
    pic_url = re.findall('"pic" src="(.*?)"',html,re.S)
    j = 0
    for each in pic_url:
        url = 'http://www.qdaily.com' + each
        print('now downloading:' + url)
        pic = requests.get(url)
        fp = open('pic//' + str(i) +str(j) + '.jpg','wb')
        fp.write(pic.content)
        fp.close()
        j += 1
 
    url = url_more + last_key + 'json'
    data = requests.get(url)
    html = json.loads(data.text)[u'data'][u'html']
    last_key = str(json.loads(data.text)[u'data'][u'last_key'])

代码解析

#-*-coding:utf8-*-的意思上字符编码是utf-8

import re import requests import json的意思上导入rerequestsjson库,告诉电脑,我们下面要用这三个库中的程序了。

前面我们分析得到下一个包裹的包裹号,但是到底怎么获取它呢?可以在检查工具栏中,点击Headers,查看到json的地址。

显示下一个Json地址

接下来定义两个变量(就是存储容器)存放两个地址,我们接下来需要用到这两个地址。

url = 'http://www.qdaily.com/categories/17'
url_more = 'http://www.qdaily.com/categories/categorymore/17/'

然后获取url中地址的源代码,并且在源代码中查找last_key

html = requests.get(url).text
last_key = re.search('lastKey="(.*?)"',html,re.S).group(1)

下面的代码是我们这篇教程的核心,用循环来不断向获取新的包裹,拆开它,通过里面的图片地址下载图片,我们这里只循环3次,下载60张图片,当然你想循环多少次就改一下数字即可,相信你可以办到。for i in range(3):就是循环语句,表示接下来的语句要执行三次。
逻辑是非常清楚的:

  • 从源代码中获取图片地址
pic_url = re.findall('"pic" src="(.*?)"',html,re.S)
  • 将图片下载到指定文件夹
j = 0
for each in pic_url:
    url = 'http://www.qdaily.com' + each
    print('now downloading:' + url)
    pic = requests.get(url)
    fp = open('pic//' + str(i) +str(j) + '.jpg','wb')
    fp.write(pic.content)
    fp.close()
    j += 1
  • 获取下一批图片的源代码
url = url_more + last_key + 'json'
data = requests.get(url)
html = json.loads(data.text)[u'data'][u'html']
  • 获取下一批图片源代码中包含的last_key
last_key = str(json.loads(data.text)[u'data'][u'last_key'])

我没有详细解释代码的具体含义,因为接下来我要去逛书店,没有耐心了。如果你有疑问,欢迎到我的博客留言提问,有问必答。

执行程序

将上面到代码保存为picdownloader2.py,置于根目录下,并且新建文件夹pic。打开终端,写下如下代码,回车即可

python picdownloader2.py

终于完成了“教女朋友爬虫”的续集,关于爬虫的教程先告一段落。上次的教程让女票(领导)甚是开心,顺便提出了新要求,要我继续写教程,因为她还要学很多,学markdown,学印象笔记,学Hexo博客。。。再一次硬广,欢迎关注我的博客微博

今天是女票麻麻的生日,未来丈母娘生日快乐。


欢迎关注公众号“百杏果阁”
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容