PHP 爬虫实战怎么爬取 Github 上的数据
更新时间:2023-12-17第一段:了解Github API
在开始爬取Github数据之前,首先你需要了解Github的API。Github API是一组用于访问Github上数据的RESTful API,你可以使用它来读取和修改Github上的数据。在爬取Github数据时,我们可以使用Github API提供的接口来获取所需数据,这样可以遵循Github的API访问限制,并保证数据的准确性。
// 以PHP为例,使用curl php扩展进行API请求,获取Github用户的信息
// 设置Github API的请求地址和参数
$url = 'https://api.github.com/users/username';
$options = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
CURLOPT_HTTPHEADER => ['Accept: application/vnd.github.v3+json'],
];
// 使用curl发送请求
$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
// 解析响应的JSON数据,并输出用户信息
$user = json_decode($response);
echo 'Username: ' . $user->login . '
';
echo 'Followers: ' . $user->followers . '
';
echo 'Location: ' . $user->location . '
';
第二段:如何实现爬取 Github 上的数据
接下来,我们需要确定要爬取的Github数据和API接口,以及爬取数据的方法。在Github中,我们可以爬取一些流行仓库的信息,如: star 数,fork 数,代码质量,贡献者等等。下面是使用Github API爬取仓库信息的几个步骤:
- 使用Github API获取仓库的URL
- 使用curl获取仓库的信息
- 解析并处理得到的JSON数据
- 保存数据到数据库或文件中
// 以爬取Symfony仓库的star数为例,实现了以上的几个步骤
// 获取仓库的URL
$repoUrl = 'https://api.github.com/repos/symfony/symfony';
// 设置请求头,需要授权
$options = [
CURLOPT_URL => $repoUrl,
CURLOPT_HTTPHEADER => ["Authorization: token $token"],
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
];
// 使用curl发送请求
$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
// 解析得到仓库的star数
$repo = json_decode($response);
$stars = $repo->stargazers_count;
echo 'Symfony repository has ' . $stars . ' stars.';
第三段:如何处理Github API的访问限制
Github API有着明确的访问次数和频率限制,如果我们过度地请求API,会导致我们的IP被禁止或者限制访问。为了做到合理、高效地访问Github API,建议你按以下方式操作:
- 认真阅读Github API的官方文档,了解API的每日请求次数和访问频率限制
- 使用API的认证方法,比如token验证。token是Github提供的一种身份验证方式,可以保证请求的合法性,并增加请求限制
- 使用缓存技术,减少请求API的次数,提高代码的效率。比如,可以使用redis缓存API响应的数据,减少请求次数,或者设置缓存的过期时间等
// 以token验证为例,使用Github API的token机制减少API请求次数
// 设置API请求地址和请求头
$url = 'https://api.github.com/repos/symfony/symfony';
$options = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: token YOUR_TOKEN', 'Accept: application/vnd.github.v3+json'],
];
// 使用curl发送API请求
$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
// 解析API响应的JSON数据,并输出仓库的信息
$repo = json_decode($response);
echo 'Repository name: ' . $repo->name . '
';
echo 'Repository stars: ' . $repo->stargazers_count . '
';
echo 'Repository forks: ' . $repo->forks_count . '
';
第四段:如何保存Github爬虫的数据
最后,我们需要考虑数据的保留和存储问题。保存爬取到的Github数据,可以采用多种方法,比如保存到数据库中,写入文件或者发送到其他服务中。选择哪种方法,主要依据数据的大小、类型和处理方式等。无论使用哪种方式,保证数据的安全性和完整性是优先考虑的问题。
// 以使用MySQL数据库保存Symphony仓库为例,实现以下代码
// 加载MySQL扩展程序
$mysqli = new mysqli("localhost", "username", "password", "database");
// 检查连接是否成功
if (!$mysqli) {
die("Connection failed: " . mysqli_connect_error());
}
// 获取Github API数据
$repoUrl = 'https://api.github.com/repos/symfony/symfony';
$options = [
CURLOPT_URL => $repoUrl,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Accept: application/vnd.github.v3+json'],
];
// 使用curl发送API请求
$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
// 解析API响应数据,并保存到MySQL
$repo = json_decode($response);
$name = $mysqli->real_escape_string($repo->name); // 防止注入
$stars = $repo->stargazers_count;
$forks = $repo->forks_count;
// 插入数据到MySQL
$sql = "INSERT INTO symfony (name, stars, forks) VALUES ('$name', '$stars', '$forks')";
if ($mysqli->query($sql) === true) {
echo "Data saved successfully";
} else {
echo "Error: " . $sql . "
" . $mysqli->error;
}
// 关闭MySQL连接
$mysqli->close();