Python爬虫(入门+进阶)学习笔记 1-6 浏览器抓包及headers设置(案例一:爬取知乎) - Go语言中文社区

Python爬虫(入门+进阶)学习笔记 1-6 浏览器抓包及headers设置(案例一:爬取知乎)


爬虫的一般思路:

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

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

寻找真实请求的三个步骤

  • 分析:使用谷歌浏览器开发者工具分析网页的请求
  • 测试:测试URL请求中每个参数的作用,找出控制翻页等功能的参数

  • 重复:多次重复寻找符合爬虫需要的真实请求

实战环节:爬取知乎

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

1. 寻找真实请求的测试

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

2. 尝试爬取真实请求的数据

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

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

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

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

    请求头信息承载了关于客户端浏览器、请求页面、服务器等相关的信息,用来告知服务器发起请求的客户端的具体信息

    知乎的反爬虫机制是通过核对请求头信息实现的,所以需要在使用requests请求数据的时候加上所需的请求头

    对比知乎的请求头信息和常见的请求头信息,发现知乎请求头多了authorization和X-UDID的信息

        

    在爬虫程序中添加请求头信息,即添加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%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=20&limit=20'
response= requests.get(url, headers = headers).json()

print(response) 


最终代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 20 16:01:47 2018

@author: Jackie
"""

import requests
import pandas as pd
import time

headers = {
        'authorization':'Bearer 2|1:0|10:1519627538|4:z_c0|92:Mi4xYzBvWkFBQUFBQUFBSU1JaTVqRU1EQ1lBQUFCZ0FsVk5FdnVBV3dEdHdaRmtBR1lmZEpqT3VvdmtpSm5QMWtkZ1ZB|787597598f41757929f46f687f78434dbc66d6abc980e40fb50b55cd09062b07',
        'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
        'x-udid':'ACDCIuYxDAyPTg7eVnDe8ytVGX6ivGdKZ9E=',
        }


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)
        print('正在爬取第%s页' %str(i+1))
        time.sleep(1)
    
    
if __name__ == '__main__':
    get_user_data(3)
    df = pd.DataFrame(user_data)
    df.to_csv('users.csv')

补充知识

1. JSON

  • JSON是一个轻量级的数据交换格式,连接API进行数据爬取的时候,数据的一般返回格式为JSON。
  • JSONView插件:前往Chrome JSONView插件安装,下载并安装JSONView插件,使JSON格式的数据在谷歌浏览器中更好地呈现

2. HTTP请求



版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/kissazhu/article/details/79717991
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 19:43:05
  • 阅读 ( 1609 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢