社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
通过爬取知乎“轮子哥”——vczh关注的人分析Ajax或者JavaScript加载的数据的真实请求并展示这种爬取方法的具体过程。
- 首先,进入“轮子哥——vczh”关注的人的页面(注意:需要先登录个人知乎账号)
- 通过禁止JavaScript加载的方法发现页面不能正常加载,确认该页面的翻页是通过JavaScript加载数据实现的
- 使用谷歌浏览器开发者工具寻找包含关注人信息的真实请求,可以发现真实请求是以“followees”开头的请求,其返回一个JSON格式的数据,该数据对应下一页的“他关注的人”:
- 双击这个请求,返回一个JSON格式的数据,可以通过安装JSONView插件在浏览器中更好地显示该数据
- 接下来便可以尝试爬取该请求的数据
可以发现返回了“500 Server Error”,即由于网站反爬虫的原因,服务器返回了“500服务错误”
该问题可以通过添加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')
- JSON是一个轻量级的数据交换格式,连接API进行数据爬取的时候,数据的一般返回格式为JSON。
- JSONView插件:前往Chrome JSONView插件安装,下载并安装JSONView插件,使JSON格式的数据在谷歌浏览器中更好地呈现
- HTTP请求方法:阅读HTTP请求方法,学习HTTP的GET和POST请求方法,了解其它请求方法
- HTTP Hearders:阅读HTTP响应头和请求头信息对照表,了解请求头和响应头的概念以及每个Header所代表的具体含义
- Headers模拟登录知乎:阅读爬虫入门到精通-headers的详细讲解(模拟登录知乎),学习具体使用Headers模拟登录的方法
- 更多关于requests headers的用法,可以查阅requests的官方文档
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!