Python爬虫学习记录——6.浏览器抓包及headers设置

爬虫的一般思路

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

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

分析具体网页请求

  1. 观察以下网址翻页后的URL
    https://web.zkh360.com/view/home/zkh_catalog_side.html?proSkuId=3
    可以发现翻页后URL并没有发生变化,思考:

    • 翻页后URL不变该如何寻找请求?
    • 哪些网站也是如此(翻页后URL不变)?
  2. 使用谷歌浏览器分析网页的真实请求

    1. 谷歌浏览器——检查——Network
    2. 首先清空请求列表,点击下一页(第2页)
    3. 在请求列表里查找真实的请求,可发现包含商品信息的真实请求为:
      在这里插入图片描述
    4. 以下是第2、3、4页的请求,通过对比可以发现网站是通过pageIndex参数控制翻页的,并且pageSize参数删去之后并不会对请求产生影响
      1. 第2页:http://www.zkh360.com/Product/SearchProduct?catalogueId=3&pageIndex=2&pageSize=20
      2. 第3页:http://www.zkh360.com/Product/SearchProduct?catalogueId=3&pageIndex=3&pageSize=20
      3. 第4页:http://www.zkh360.com/Product/SearchProduct?catalogueId=3&pageIndex=4&pageSize=20
    5. 有关参数的信息可以在Hearders的Query String Parameters里查找到
      在这里插入图片描述
    6. 翻页后URL不发生变化的网站的数据一般都是通过Ajax或者JavaScript加载的,可以在过滤器的XHR或者JS中找到真实请求
  3. 寻找真实请求的三个步骤
    在这里插入图片描述

    • 分析:使用谷歌浏览器开发者工具分析网页的请求
    • 测试:测试URL请求中每个参数的作用,找出控制翻页等功能的参数
    • 重复:多次重复寻找符合爬虫需要的真实请求
  4. 尝试寻找头条的请求
    打开今日头条的网站:https://www.toutiao.com/,向下滚动发现网址并没有发生变化。可以通过以上所学的方法尝试查找真实的请求。

实战

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

  1. 寻找真实请求的测试

    1. 首先,进入“轮子哥——vczh”关注的人的页面(注意:需要先登录个人知乎账号):https://www.zhihu.com/people/excited-vczh/following
    2. 通过禁止JavaScript加载的方法发现页面不能正常加载,确认该页面的翻页是通过JavaScript加载数据实现的
    3. 使用谷歌浏览器开发者工具寻找包含关注人信息的真实请求,可以发现真实请求是以“followees”开头的请求,其返回一个JSON格式的数据,该数据对应下一页的“他关注的人”: 在这里插入图片描述
    4. 双击这个请求,返回一个JSON格式的数据,可以通过安装JSONView插件在浏览器中更好地显示该数据
    5. 接下来便可以尝试爬取该请求的数据
  2. 尝试爬取真实请求的数据

    1. 首先使用前面所学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%2		Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=20&limit=20'
      response = requests.get(url).text
      
      print(response)
      
    2. 可以发现返回了“500 Server Error”,即由于网站反爬虫的原因,服务器返回了“500服务错误”

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

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

    1. 请求头信息承载了关于客户端浏览器、请求页面、服务器等相关的信息,用来告知服务器发起请求的客户端的具体信息
    2. 知乎的反爬虫机制是通过核对请求头信息实现的,所以需要在使用requests请求数据的时候加上所需的请求头
    3. 对比知乎的请求头信息和常见的请求头信息,发现知乎请求头多了authorization和X-UDID的信息 在这里插入图片描述
    4. 在爬虫程序中添加请求头信息,即添加headers
    # -*- coding:utf-8 -*-
    
    import requests
    
    headers = {
     'authorization':' ', #括号中填上你的authorization
     '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%2	Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=20&limit=20'
    response= requests.get(url, headers = headers).json()
    
    print(response) 
    
    1. 运行程序,成功返回数据
  4. 使用pandas把数据保存入库
    pandas DataFrame的from_dict()方法可以很方便地把爬取到的数据保存为DataFrame格式的结构化数据

    # -*- coding:utf-8 -*-
    
    import requests
    import pandas as pd
    
    headers = {
     'authorization':' ', #括号中填上你的authorization
     '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%2	Cis_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')
    
  5. 定义函数实现翻页爬取
    定义一个get_user_data()函数,实现翻页爬取功能,并添加上爬取时间间隔以免由于爬取太频繁给服务器造成负担

    # -*- coding:utf-8 -*-
    
    
    import requests
    import pandas as pd
    import time
    
    headers = {
    	'authorization':' ', #括号中填上你的authorization
    	'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')
    
  6. 对数据进行分析和可视化
    可以对所爬取到的“轮子哥”关注的人的信息进行数据分析,比如“轮子哥”关注的人的男女比例,或者把个人简介形成词云图等
    在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赈川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值