以下是百万级别知乎用户数据抓取与分析之PHP开发的完整攻略:
1. 准备工作
在开始之前,需要先安装PHP环境和相关扩展,如CURL扩展、SimpleXML扩展等。
除此之外,还需要获取知乎的API访问令牌,可以参考知乎开放平台官方文档进行获取和配置。
2. 数据抓取
在完成准备工作之后,就可以开始进行数据抓取了。
2.1. 获取用户ID列表
首先需要获取一些知乎用户的ID列表。
可以通过知乎API获取某个话题下的热门问题,从而获取回答这些问题的用户。
以下是通过知乎API获取某个话题下的热门问题的代码示例:
$url = "https://www.zhihu.com/api/v4/topics/19550517/hot_questions?limit=20";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$resp = curl_exec($ch);
curl_close($ch);
$data = json_decode($resp, true);
上述代码中,$url
表示访问的API地址,$ch
表示初始化CURL句柄,curl_setopt
用于设置CURL选项,$resp
表示API返回的结果,$data
是将API返回的结果转换为数组的形式。
通过热门问题的回答者,可以获取这些用户的ID列表。以下是获取用户ID列表的代码示例:
$user_ids = array();
foreach ($data["data"] as $question) {
$url = "https://www.zhihu.com/api/v4/questions/{$question["id"]}/answers?include=data[*].author.badge[?(type=best_answerer)].topics&limit=20&offset=0&platform=desktop&sort_by=default";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$resp = curl_exec($ch);
curl_close($ch);
$data = json_decode($resp, true);
foreach ($data["data"] as $answer) {
$user_ids[] = $answer["author"]["id"];
}
}
$user_ids = array_unique($user_ids);
上述代码中,$url
表示访问的API地址,$user_ids
表示用户ID列表,使用array_unique
函数去重。
2.2. 获取用户信息
有了用户ID列表之后,就可以依次获取这些用户的信息。
以下是获取用户信息的代码示例:
$user_info = array();
foreach ($user_ids as $user_id) {
$url = "https://www.zhihu.com/api/v4/members/{$user_id}?include=data[*].educations,employments[1],answer_count,business,locations,articles_count,gender,follower_count,following_count,headline,identity,is_advertiser,is_org,vip_info,description,question_count,thanked_count,favorited_count,voteup_count,pins_count,question_frequency,commercial_question_count,commercial_thank_count,columns_count,following_columns_count,accepted_commercial_question_count&limit=20";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$resp = curl_exec($ch);
curl_close($ch);
$data = json_decode($resp, true);
$user_info[] = $data;
}
上述代码中,$url
表示访问的API地址,$user_info
表示用户信息列表。
2.3. 存储用户信息
有了用户信息之后,就可以将这些信息存储到数据库或者文件中,以便后续的分析。
以下是将用户信息存储到MySQL数据库中的代码示例:
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$stmt = $pdo->prepare("INSERT INTO users(id, name, gender, avatar_url, headline, description, location, business, job, school, major, industry, follower_count, following_count, answer_count, question_count, articles_count, pins_count, voteup_count, thanked_count, favorited_count, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
foreach ($user_info as $info) {
$stmt->bindValue(1, $info["id"], PDO::PARAM_STR);
$stmt->bindValue(2, $info["name"], PDO::PARAM_STR);
$stmt->bindValue(3, $info["gender"], PDO::PARAM_INT);
$stmt->bindValue(4, $info["avatar_url"], PDO::PARAM_STR);
$stmt->bindValue(5, $info["headline"], PDO::PARAM_STR);
$stmt->bindValue(6, $info["description"], PDO::PARAM_STR);
$stmt->bindValue(7, implode(",", array_column($info["locations"], "name")), PDO::PARAM_STR);
$stmt->bindValue(8, $info["business"]["name"], PDO::PARAM_STR);
$stmt->bindValue(9, isset($info["employments"][1]["job"]["name"]) ? $info["employments"][1]["job"]["name"] : "", PDO::PARAM_STR);
$stmt->bindValue(10, isset($info["educations"][0]["school"]["name"]) ? $info["educations"][0]["school"]["name"] : "", PDO::PARAM_STR);
$stmt->bindValue(11, isset($info["educations"][0]["major"]["name"]) ? $info["educations"][0]["major"]["name"] : "", PDO::PARAM_STR);
$stmt->bindValue(12, isset($info["employments"][0]["company"]["industry"]["name"]) ? $info["employments"][0]["company"]["industry"]["name"] : "", PDO::PARAM_STR);
$stmt->bindValue(13, $info["follower_count"], PDO::PARAM_INT);
$stmt->bindValue(14, $info["following_count"], PDO::PARAM_INT);
$stmt->bindValue(15, $info["answer_count"], PDO::PARAM_INT);
$stmt->bindValue(16, $info["question_count"], PDO::PARAM_INT);
$stmt->bindValue(17, $info["articles_count"], PDO::PARAM_INT);
$stmt->bindValue(18, $info["pins_count"], PDO::PARAM_INT);
$stmt->bindValue(19, $info["voteup_count"], PDO::PARAM_INT);
$stmt->bindValue(20, $info["thanked_count"], PDO::PARAM_INT);
$stmt->bindValue(21, $info["favorited_count"], PDO::PARAM_INT);
$stmt->bindValue(22, date("Y-m-d H:i:s", $info["created_at"]), PDO::PARAM_STR);
$stmt->execute();
}
上述代码中,首先使用PDO连接到MySQL数据库,然后使用prepare和bindValue函数来构造预处理语句并填充数据,最后执行execute函数进行插入操作。
3. 数据分析
有了用户信息之后,就可以进行一些数据分析了。
以下是获取知乎用户性别比例的代码示例:
$total = count($user_info);
$male = 0;
$female = 0;
$unknown = 0;
foreach ($user_info as $info) {
switch ($info["gender"]) {
case 1:
$male++;
break;
case 0:
$female++;
break;
default:
$unknown++;
break;
}
}
$male_ratio = round($male / $total * 100, 2);
$female_ratio = round($female / $total * 100, 2);
$ratio_str = "{$male_ratio}%:{$female_ratio}%";
上述代码中,首先使用count函数获取用户总数,然后遍历所有用户的信息,使用switch语句统计男女和未知性别的人数,最后计算并返回男女比例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:百万级别知乎用户数据抓取与分析之PHP开发 - Python技术站