【爬虫学习3】Python爬取动态页面思路(一)

ajax异步加载动态内容爬虫

  • 之前在爬取知乎timeline内容时,因为动态加载只爬取到了少量内容,于是研究了下对动态加载页面的爬取。
  • 这篇文章主要是对非加密的ajax异步加载内容的爬取,顺便加入了一些json的知识。
  • 然鹅很不幸知乎是加密的,所以这个办法并不能解决问题。
  • 计划试试selenium+PhantomJS来解决知乎的问题,这个就看下一篇文章了。
  • 全部代码见于我的GitHub页面

原料

chrome浏览器
果壳网-科学人 页面
代码

找到异步数据在哪

1.进入果壳网-科学人分页

2.F12打开“审查元素”选则Network窗格并刷新页面以抓包
【爬虫学习3】Python爬取动态页面思路(一)_第1张图片

3.在页面上滑动鼠标滚轮使页面向下
此时可以看到页面是动态加载的
相应的在监控窗口可以看到有数据收发(下图红圈处)
【爬虫学习3】Python爬取动态页面思路(一)_第2张图片
所以异步传输数据必然是在此时发生的

4.双击上图红圈处,可以筛选出在此时变动的数据包
【爬虫学习3】Python爬取动态页面思路(一)_第3张图片

5双击数据包,右侧展开包的相关信息
【爬虫学习3】Python爬取动态页面思路(一)_第4张图片
可以发现是GET方式传输的json信息(实际上这也是ajax异步加载的特点)

6.将包的相关信息切换到Preview选项卡
【爬虫学习3】Python爬取动态页面思路(一)_第5张图片
我们可以看到chrome已经很直观的为我们将json信息格式化显示了
json中包含五个键值对分别是limit now offset ok 以及一个json数组result
条目信息就在result中
到这里,我们就找到异步加载的数据在哪了
但是你肯定会问,那怎么不断的爬取异步数据呢?这就是下一点了

大量的获取异步数据

第一种方法:
我们分析包的url以及包的内容
=1508143436759”>http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset=18&=1508143436759
url里面limit=20
而result中也是20条数据
咦?好像有点联系
尝试修改limit值为30直接打开url发现有效,于是可以以limit来构建爬虫
第二种方法:
继续向下滑动页面,使页面再ajax加载一次,对比两次包url
=1508143436759”>http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset=18&=1508143436759
=1508143436760”>http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset=38&=1508143436760
发现改变的是offset,并且差值是20正是条目的数目
即offset就是条目数
于是可以以offset来构建爬虫

进行爬虫

因为获取的是json数据所以这里尝试通过json模块来获取所需内容
采用第一二种方法结合:将limit设置为1,offset+1递增的方式构建
几个要点:
1.利用pprint帮助观察result中数据
2.保存为文件时 open函数中加入encoding=utf-8,否则保存数据中文乱码

    with open('result.txt', 'a',  encoding='utf-8') as fo:
        fo.write(str(items)+'\n')

3.核心代码

def get_datas(offset):
    '''从页面中获取数据'''
    items = {}
    url = 'http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=1&offset=' + str(offset) + '&_=1508134471173'
    html = get_page(url)
    #datas = json.loads(html.text)
    #pprint.pprint(datas['result'])
    datas = json.loads(html.text)['result'][0]
    items['type'] = datas['author']['nickname']
    items['keyword'] = datas['subject']['name']
    items['title'] = datas['title']
    items['summary'] = datas['summary']
    #pprint.pprint(items)
    with open('result.txt', 'a',  encoding='utf-8') as fo:
        fo.write(str(items)+'\n')

结果如下:
【爬虫学习3】Python爬取动态页面思路(一)_第6张图片

你可能感兴趣的:(网络爬虫)