python爬虫的最佳实践(四)--扒取异步加载内容并存入mongo数据库

ps:课前规矩,ps一下。上节我们讲了最简单的爬虫,但是在真实的网络环境下,并不是所有的网页都能用那样的方式抓取,用ajax异步请求数据的网页就没办法用如上方式,那么我们今天就来看看如何抓取异步加载数据的网页。(找网页的时候发现简书的部分页面也是用这种方式加载的,忍了很久还是放过了简书~~)

代码预览

#coding:utf-8
from bs4 import BeautifulSoup
import requests
import json
import pymongo

url = 'http://www.guokr.com/scientific/'

def dealData(url):
    client = pymongo.MongoClient('localhost', 27017)
    guoke = client['guoke']
    guokeData = guoke['guokeData']
    web_data = requests.get(url)
    datas = json.loads(web_data.text)
    print datas.keys()
    for data in datas['result']:
        guokeData.insert_one(data)

def start():
    urls = ['http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset={}&_=1462252453410'.format(str(i)) for i in range(20, 100, 20)]
    for url in urls:
        dealData(url)

start()

代码剖析

细心的同学可能发现了,这和昨天的没什么区别啊0.0。其实不是这样的,这次我们要抓取的数据是果壳网的科学人分页,如果直接通过requests.get('http://www.guokr.com/scientific/')你会发现我们要的数据都不在返回网页源代码中,这是因为我们要的数据都是通过ajax的方式异步加载的。那我们应该如何抓取这部分内容呢?首先用浏览器打开我们要抓的网页

1.png

随便选择一个地方点开查看元素,细心的同学发现我们这次不用chrome改用火狐了,原因一会告诉大家~

2.png

选择网络标签和XHR分页,然后我们向下滑动鼠标滚轮可以发现一个一个的GET请求被列了出来,这便是ajax异步加载的数据,此时进行观察,如下图:

3.png

我们可以看到每次请求的url,然后通过观察url变化我们找到了规律,每次的偏移量offset都不一样,代表了我们取出从什么位置取出多少条数据,观察完url规律,我们点击其中一条url,切换到响应分页,如下图所示:


4.png

我们可以看到请求回来的数据格式是json,而且数据结构非常清晰,这也是我选用火狐的原因,我们一眼可以找出我们需要的数据就在result这个key下面。

下面进入我们的代码,start()中拼接url的代码我就不在赘述,我们可以看到这次和上次不同的是引入了两个新库

import json
import pymongo

json库是python自带的json解析库,功能够我们使用的。pymongo是python和mongoDB交互用的库。首先我们来看这段代码:

client = pymongo.MongoClient('localhost', 27017)
guoke = client['guoke']
guokeData = guoke['guokeData']

PS:一定记得在执行这段代码之前先打开你本地的mongoDB数据库,我在环境配置章节有讲怎么安装mongoDB,不会的同学请参见第二章环境配置。
第一句,建立一个pymongo的数据交互客户端,第二句选择名为guoke的database,注意:如果有名为guoke的database则会直接使用已有的,如果没有则会自动建立。第三句选择guoke数据库中名为guokeData的collection。

接下来:

datas = json.loads(web_data.text) 
print datas.keys()

用json库加载我们取出的数据,然后打印出数据的keys,


5.png

我们可以看到和我们在火狐浏览器中的数据结构一致,我们需要用的是其中的result字段,刚刚我们通过火狐观察到result是一个list,然后我们遍历result依次存入guokeData这个collection之中。所以,最后一句

guokeData.insert_one(data)

就是给collection中插入一条数据,我个人很喜欢抓取返回格式是json的网站,因为数据格式很规范,可以直接存入mongo中任意取用,操作简单。不用做数据序列化操作,而我们上节那样解析出来的数据要存入数据库就需要做序列化操作。

下来时代码执行完毕后数据库的情况,可以看到我们的数据已经尽数插入数据库
![6.png]ACURNVC.png](http://upload-images.jianshu.io/upload_images/1957582-b3cd1e541ed57afd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看到很舒服的数据结构。

至此,这一节的内容告一段落,当然,并不是所有的异步加载网页都需要我们去通过观察法获取url然后再采集,这样岂不是会很累,下节将向大家介绍一种非常舒服的方式去做这件事。

写在最后

惯例,最佳实践的前两步我帮你们做完了,有兴趣的同学可以看一下扩展作业哦。
作业:抓取http://rent.591.com.hk/ 这个网站租房的信息,信息都是采用ajax异步加载的方式。而且刚好和我们上节的内容是个强烈对比,不能通过更改url获取分页的数据了,很适合练手~~

有兴趣的同学可以加群498945822一起交流学习哦~~
发现问题的同学欢迎指正,直接说就行,不用留面子,博主脸皮厚!

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,042评论 25 707
  • 最近由于涉及到短视频项目,在滤镜这一块不可避免会和OpenGL ES2.0打交道。iOS在这一块由于GPUImag...
    高小冻阅读 206评论 0 0
  • 1橡皮泥 回到家 闺女给我惊喜 用橡皮泥给我做了个手表 别小看哦 还带扣滴(๑‾ ꇴ ‾๑) 便于穿戴 是不是很形...
    莹莹生辉阅读 240评论 0 0
  • 只因那天阳光正好,微风不燥。 他那时嘴角带着一抹笑,看着我 我看到他眼里只有我,我莫名心悸,听到心脏砰砰的跳。 我...
    本宝宝好萌阅读 177评论 0 0