浏览器抓包及headers设置(案例一:爬取知乎)

来自CloudWiki
123.232.235.119讨论2019年6月9日 (日) 11:13的版本 实战环节:爬取知乎
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

本节课程首先回顾前面所学习的爬虫的一般思路和流程,再通过具体例子分析如何通过谷歌浏览器卡发着工具获取Ajax加载的网页的真实请求,解决翻页后URL不发生变化的网站爬取问题,最后通过爬取知乎的例子具体讲授这种爬取方法。

爬虫的一般思路

  • 抓取网页、分析请求
  • 解析网页、寻找数据
  • 储存数据、多页处理

本节课主要讲授如何通过谷歌浏览器开发者工具分析真实请求的方法。


实战环节:爬取知乎

寻找真实请求的步骤

Bd3-11.png

  • 分析:使用谷歌浏览器开发者工具分析网页的请求
  • 测试:测试URL请求中每个参数的作用,找出控制翻页等功能的参数
  • 重复:多次重复寻找符合爬虫需要的真实请求

通过爬取知乎“轮子哥”——vczh关注的人分析Ajax或者JavaScript加载的数据的真实请求并展示这种爬取方法的具体过程。

寻找真实请求的测试

  • 通过禁止JavaScript加载的方法发现页面不能正常加载,确认该页面的翻页是通过JavaScript加载数据实现的
  • 使用谷歌浏览器开发者工具寻找包含关注人信息的真实请求,可以发现真实请求是以“followees”开头的请求,其返回一个JSON格式的数据,该数据对应下一页的“他关注的人”:(这个是网页的真实请求!)

Bd3-10.png

双击这个请求,返回一个JSON格式的数据,可以通过安装JSONView插件在浏览器中更好地显示该数据

接下来便可以尝试爬取该请求的数据

尝试爬取真实请求的数据

首先使用前几节课所学requests.get()尝试爬取数据


# -*- coding:utf-8 -*-

        import requests

        url = 'https://www.zhihu.com/api/v4/members/excited-vczh/followees?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=20&limit=20'
        response = requests.get(url).text

        print(response)

可以发现返回了“500 Server Error”,即由于网站反爬虫的原因,服务器返回了“500服务错误”

该问题可以通过添加hearders请求头信息解决

添加hearders请求头信息模拟浏览器访问

  • 请求头信息承载了关于客户端浏览器、请求页面、服务器等相关的信息,用来告知服务器发起请求的客户端的具体信息
  • 知乎的反爬虫机制是通过核对请求头信息实现的,所以需要在使用requests请求数据的时候加上所需的请求头
  • 对比知乎的请求头信息和常见的请求头信息,发现知乎请求头多了authorization和X-UDID的信息

Bd3-12.png


  • 在爬虫程序中添加请求头信息,即添加headers


       # -*- coding:utf-8 -*-

        import requests

        headers = {
           'cookie':' ', #括号中填上你的cookie
           'User-Agent':' ', #括号中填上你的User-Agent
        }cookie: 
        url = 'https://www.zhihu.com/api/v4/members/excited-vczh/followees?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=20&limit=20'
        response= requests.get(url, headers = headers).json()

        print(response) 

注:请求头中的cookie和User-Agent的值可以在谷歌浏览器 的如下页面中去查找:

Bd3-13.png

运行程序,成功返回数据

{'paging': {'is_end': False, 'totals': 3056, 'previous': 'https://www.zhihu.com/members/excited-vczh/followees?include=data%5B%2A%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit=20&offset=0', 'is_start': False, 'next': 'https://www.zhihu.com/members/excited-vczh/followees?include=data%5B%2A%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit=20&offset=40'}, 'data': [{'is_followed': False, 'avatar_url_template': 'https://pic1.zhimg.com/v2-673ad4bc27fd7b843acdcec1b962e414_{size}.jpg', 'user_type': 'people', 'answer_count': 4, 'is_following': False, 'headline': 'wb:冉冉橪', 

使用pandas把数据保存入库

pandas DataFrame的from_dict()方法可以很方便地把爬取到的数据保存为DataFrame格式的结构化数据


# -*- coding:utf-8 -*-

        import requests
        import pandas as pd

        headers = {
           'cookie':' ', #括号中填上你的cookie
           'User-Agent':' ', #括号中填上你的User-Agent
        }
        url = 'https://www.zhihu.com/api/v4/members/excited-vczh/followees?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=20&limit=20'
        response= requests.get(url, headers = headers).json()['data'] #添加上['data']是因为关注人的信息是保存在data下面的,只需要这一部分的数据

        df = pd.DataFrame.from_dict(response)
        df.to_csv('user.csv')

定义函数实现翻页爬取

定义一个get_user_data()函数,实现翻页爬取功能,并添加上爬取时间间隔以免由于爬取太频繁给服务器造成负担


 # -*- coding:utf-8 -*-


        import requests
        import pandas as pd
        import time

        headers = {
            'cookie':' ', #括号中填上你的cookie
            'User-Agent':' ', #括号中填上你的User-Agent
        }

        user_data = []
        def get_user_data(page):
            for i in range(page):
                url = 'https://www.zhihu.com/api/v4/members/excited-vczh/followees?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset={}&limit=20'.format(i*20)
                response = requests.get(url, headers=headers).json()['data']
                user_data.extend(response) #把response数据添加进user_data
                print('正在爬取第%s页' % str(i+1))
                time.sleep(1) #设置爬取网页的时间间隔为1秒

        if __name__ == '__main__':
            get_user_data(10)
            df = pd.DataFrame.from_dict(user_data)
            df.to_csv('users.csv')

对数据进行分析和可视化

可以对所爬取到的“轮子哥”关注的人的信息进行数据分析,比如“轮子哥”关注的人的男女比例,或者把个人简介形成词云图等

Bd3-14.png

课后作业

  • 分析今日头条的翻页方法
  • 将vczh改成其他人进行爬取
  • 尝试爬取知乎粉丝信息

补充知识

JSON

JSON是一个轻量级的数据交换格式,连接API进行数据爬取的时候,数据的一般返回格式为JSON。

JSONView插件:前往Chrome JSONView插件安装,下载并安装JSONView插件,使JSON格式的数据在谷歌浏览器中更好地呈现

HTTP请求

HTTP请求方法:阅读HTTP请求方法,学习HTTP的GET和POST请求方法,了解其它请求方法

HTTP Hearders:阅读HTTP响应头和请求头信息对照表,了解请求头和响应头的概念以及每个Header所代表的具体含义

Headers模拟登录知乎:阅读爬虫入门到精通-headers的详细讲解(模拟登录知乎),学习具体使用Headers模拟登录的方法

更多关于requests headers的用法,可以查阅requests的官方文档