美文网首页Python爬虫从入门到放弃
python爬虫从入门到放弃之九:Json解析

python爬虫从入门到放弃之九:Json解析

作者: 52d19f475fe5 | 来源:发表于2019-07-30 18:20 被阅读7次

    ——JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

    了解爬虫中数据的分类

    在爬虫爬取的数据中有很多不同类型的数据,我们需要了解数据的不同类型来又规律的提取和解析数据

    • 结构化数据:json,xml等
      处理方式:直接转化为python类型

    • 非结构化数据:HTML
      处理方式:正则表达式、xpath

    介绍结构化数据和非结构化数据

    • 结构化数据例子:
    • 非结构化数据例子:

    我们看结构化数据:像极了字典!

    json是什么?

    在Python语言当中,json是一种特殊的字符串,这种字符串特殊在它的写法——它是用列表/字典的语法写成的。

    json和html一样,常用来做网络数据传输。它存在于在Network-XHR里,严格来说其实它不是列表/字典,它是json。

    json数据如何查找?
    1. chrome 开发者工具:F12

    各面板说明:

    Element :查找网页源代码HTML中元素,实时在浏览器里面得到反馈
    
    Network:实时网络请求的记录
    
    All:查看全部
    
    top250 :这是豆瓣图书top250第0个请求
    
    Headers :该资源的HTTP头信息
    
    Preview :根据你选择的资源类型(JSON、图片、文本)显示相应的预览
    
    Response:响应信息面板包含资源还未进行格式处理的内容
    
    HXR :一种不借助网页刷新即可传输数据的对象
    

    分析网页时,先判断提取的数据在HTML中,还是Json中

    点开Nekwork → All → 第0个请求,看Preview(优先)或Response,看看里面有没有我们想要的信息,有的话数据就在html源代码中,否则数据在json中,要去看XHR

    如上图,我们在豆瓣图书T250的第0个请求可以看到书本信息,那么书本信息就在html源代码中

    2. json数据查找方法

    打开开发者工具,选中选中XHR面板

    1. 刷新页面,逐个查看Preview(预览),看看有没有我们想要的

    2. 如果刷新后出来的数量过多,可以清空所有,点下一页,去看下一页的预览

    3. 如果没有看到本页的数据,但可以看到类似的数据,那么它应该是下一页的数据,就是本页加载下一页的,按照这个逻辑,那么第一页的数据如何获取呢?

    4. 获取第一页的数据,我们先去第三页(之后的页数都可以),刷新第三页 →清空 →点开第一页,这样一般可以拿到第一页和第二页的数据。

    json数据如何解析?

    实例展示:提取知乎文章的标题、概要、链接

    # url = `https://www.zhihu.com/people/zhang-jia-wei/posts?page=1
    
    1. 分析网页

    点开Nekwork → All → (posts?page=1)第0个请求 → Preview,查看页面预览


    发现只有两篇文章,显然不是我们想要的数据,也就是说,这个url 并不是我们想要提取的数据的真正url,如果我们去请求这个url只能拿到两篇文章

    2. 查找json数据

    打开开发者工具,选中XHR面板,通过上面的查找方法,可以拿到真正的数据

    3. 分析Requests请求

    在上面我们已经看了响应的数据,那么我们如何发送请求呢?点开Headers面板


    我们知道,Requests对象包含URL,请求方式,请求头,请求体(携带的参数)

    • General中可以看到,Requests URL一大串,其实Requests URL?号后面是get请求携带的params参数,和Query String Parameters中的数据是一样的,但是我们不知道那些数据是变化的,大概猜一下,offset:0可能是变化的,limit:20应该是死的,表示当页文章的数量

    • Requests Headers中user-agent是伪装浏览器的,其它的应该没用的

    我们直接去拿第二页的数据来做下对比,就可以了


    通过对比我们发现:offset的值由0变20,其它的没什么变化,可以不管!那么这个offset应该就是对应页数的变化了,下面我们提取3页的文章

    代码实现:

    import requests
    
    for i in range(3):
        url = 'https://www.zhihu.com/api/v4/members/zhang-jia-wei/articles?'
        headers = {'user-agent': 'Mozilla/5.0'}
        params = {'include': 'data[*].comment_count,suggest_edit,is_normal,thumbnail_extra_info,thumbnail,can_comment,comment_permission,admin_closed_comment,content,voteup_count,created,updated,upvoted_followees,voting,review_info,is_labeled,label_info;data[*].author.badge[?(type=best_answerer)].topics',
        'offset': str(i*20),
        'limit': '20',
        'sort_by': 'created'
        } 
        r = requests.get(url,headers = headers,params = params)
        print(r.status_code)
        print(type(r.json()))
    
    

    运行结果:

    200
    <class 'dict'>
    200
    <class 'dict'>
    200
    <class 'dict'>
    >>> 
    

    我们发现,请求成功了,r.json()是Requests库内置的Json解析器的方法,我们看到结果返回字典dict,这个字典是多层字典嵌套的,我们一层一层扒开不就提取到数据了?

    完整代码:

    
    import requests
    
    for i in range(3):
        url = 'https://www.zhihu.com/api/v4/members/zhang-jia-wei/articles?'
        headers = {'user-agent': 'Mozilla/5.0'}
        params = {'include': 'data[*].comment_count,suggest_edit,is_normal,thumbnail_extra_info,thumbnail,can_comment,comment_permission,admin_closed_comment,content,voteup_count,created,updated,upvoted_followees,voting,review_info,is_labeled,label_info;data[*].author.badge[?(type=best_answerer)].topics',
        'offset': str(i*20),
        'limit': '20',
        'sort_by': 'created'
        } 
        r = requests.get(url,headers = headers,params = params)
        articles = r.json()['data']
        for article in articles:
            title = article['title']
            excerpt = article['excerpt']
            link = article['url']
            print(title,excerpt,link)
     
    
    数据提取之小结:
    • 看第0个请求判断数据在html中还是json中

    • json数据查找方法是刷新→清空→翻页

    • Requests库的json解析方法是json()

    • json解析成字典结构一层一层提取


      >>>阅读更多文章请点击以下链接:

    python爬虫从入门到放弃之一:认识爬虫
    python爬虫从入门到放弃之二:HTML基础
    python爬虫从入门到放弃之三:爬虫的基本流程
    python爬虫从入门到放弃之四:Requests库基础
    python爬虫从入门到放弃之五:Requests库高级用法
    python爬虫从入门到放弃之六:BeautifulSoup库
    python爬虫从入门到放弃之七:正则表达式
    python爬虫从入门到放弃之八:Xpath
    python爬虫从入门到放弃之九:Json解析
    python爬虫从入门到放弃之十:selenium库
    python爬虫从入门到放弃之十一:定时发送邮件
    python爬虫从入门到放弃之十二:多协程
    python爬虫从入门到放弃之十三:Scrapy概念和流程
    python爬虫从入门到放弃之十四:Scrapy入门使用

    相关文章

      网友评论

        本文标题:python爬虫从入门到放弃之九:Json解析

        本文链接:https://www.haomeiwen.com/subject/foxorctx.html