爬虫的一般思路:抓取网页、分析请求

解析网页、寻找数据

储存数据、多页处理

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

寻找真实请求的三个步骤

分析:使用谷歌浏览器开发者工具分析网页的请求

测试:测试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')

Python网页抓取tcp python 获取浏览器抓包_知乎

补充知识

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

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

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

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

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

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