Python爬虫8-异步加载

目录

9.1异步加载技术与爬虫方法

9.1.1异步加载技术概述

9.1.2异步加载网页示例

9.1.3逆向工程

9.2综合案例1-爬取简书网用户动态信息

9.2.1爬虫思路分析

​ 9.2.2爬虫代码及分析


9.1异步加载技术与爬虫方法

9.1.1异步加载技术概述

        传统的网页如果需要更新内容,必须重新加载整个网页页面,网页加载速度慢,用户体验差,而且数据传输少,会造成宽带浪费。异步加载技术(AJAX),即异步JavaScript和XML,是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,AJAX可以是网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

9.1.2异步加载网页示例

        上节讲到的简书网“首页投稿”热评文章的信息(http://www.jianshu.com/c/bDHhpK),通过下滑进行浏览,并没有分页的信息,而是一直浏览下去,但网址信息并没有改变。传统的网页不可能一次性加载如此庞大的信息。通过分析可判断该网页使用了异步加载技术。

9.1.3逆向工程

        使用异步加载技术,不再是立即加载所有网页内容,而展示的内容也就不再HTML的源代码中。这样通过前面的方法就无法抓取到数据。想要抓取这些通过异步加载方法的网页数据,需要了解网页时如何加载这些数据的,该过程就叫做逆向工程,俗称“抓包”。具体内容大家可以返回上一节进行查看。

9.2综合案例1-爬取简书网用户动态信息

9.2.1爬虫思路分析

        (1)本节爬取的内容为简书网用户动态的信息(http://www.jianshu.com/u/9104ebf5e177)

Python爬虫8-异步加载_第1张图片

         (2)当首次打开该网页URL时,单机“动态”链接后,发现网页URL并没有发生变化,所以判断该网页采用了异步加载技术。

Python爬虫8-异步加载_第2张图片

        (3)打开Chrome浏览器的开发者工具(按F12),选择Network选项卡,再选择XHR项,可发现网页加载了用户“动态”内容的文件。 

Python爬虫8-异步加载_第3张图片

        (4)观察该文件的Reponse信息发现返回的是XML文件,内容正是用户“动态”内容,每个li标签就是一个用户动态内容。删除timeline后面的字符串也可以返回正确的内容,以次构造第一页的URL为 http://www.jianshu.com/users/9104ebf5e177/timeline

        (5)通过下滑浏览发现,该网页也是使用异步加载技术进行分页处理的。以此来记录前几页的URL

        罗罗攀 - 简书

        罗罗攀 - 简书

        罗罗攀 - 简书        

Python爬虫8-异步加载_第4张图片

         (6)通过手工删除URL中的max_id字段,发现不能返回正常的内容。说明max_id是一个很关键的字段。而我们可以发现每个页面的max_id都不相同,通过观察数字也没有找到明显的规律。而构造URL的重点就在于如何获取max_id的数字。

        (7)前面分析到每一个li标签就是用户的一条动态内容,我们发现,li标签的id字段有着一串没有规律的胡子信息。通过观察发现,前一页最后一个li标签中的id数字,刚好是它下一页URL中的max_id数字+1,以此来构造出URL。

Python爬虫8-异步加载_第5张图片

         (8)由于Response返回的是XML的文档,便可以通过Lxml库进行数据的抓取工作,需要抓取的内容为用为“动态”类型和时间信息。 

Python爬虫8-异步加载_第6张图片 9.2.2爬虫代码及分析

import requests
from lxml import etree
import pymongo

def get_time_info(url,page):
    user_id = url.split('/')
    user_id = user_id[4]
    if url.find('page='):
        page = page+1
    html = requests.get(url)
    selector = etree.HTML(html.text)
    infos = selector.xpath('//ul[@class="note-list"]/li')
    for info in infos:
        dd = info.xpath('div/div/div/span/@data-datetime')[0]
        type = info.xpath('div/div/div/span/@data-type')[0]
        timeline.insert_one({'data':dd,'type':type})
    id_infos = selector.xpath('//ul[@class="note-list"]/li/@id')
    if len(infos) > 1:
        feed_id = id_infos[-1]
        max_id = feed_id.split('-')[1]
        next_url = 'https://www.jianshu.com/users/%s/timeline?max_id=%s&page=%s' %(user_id,max_id,page)
        get_time_info(next_url,page)

if __name__=='__main__':
    get_time_info('https://www.jianshu.com/users/9104ebf5e177/timeline?max_id',1)

你可能感兴趣的:(Python爬虫,python,爬虫)