前言
目前SegmentFault
还没有开放API
,17年的时候高阳大大说有计划,虽然那会我还没用SegmentFault
用PHP
随便写了一个获取某个标签下信息的代码,没什么技术含量,用来定时获取
目的是如果有问题可以解决就帮助解决一下,或者是广告的话可以进行举报
获取URL
主要获取标签动态下的就可以了,包含了技术问答和专栏文章
- 标签动态
https://segmentfault.com/t/*
- 技术问答
https://segmentfault.com/t/*/questions
- 专栏文章
https://segmentfault.com/t/*/blogs
XPath节点
PHP
使用XPath
采集也是还可以的,也相对简单
-
标签动态
- 标题
//h4/a/text()
- 链接
//h4/a/@href
- 标题
-
技术问答
仔细点的话可以带一个
class
属性- 标题
//h2[@class="title"]/a/text()
- 链接
//h2[@class="title"]/a/@href
- 标题
-
专栏文章
- 标题
//h2/a/text()
- 链接
//h2/a/@href
- 标题
效果截图
使用
需要补全代码中的相关信息,URL
、XPath
节点以及json
文件路径
可选择使用 @Easy 的 PushBear 进行一对多推送,需要补全key
crontab定时
crontab
定时任务30分钟一次,获取第一页的信息
*/30 * * * * php /www/wwwroot/tag.php >> /tmp/sf.log
PHP代码
<?php
$url = ''; // 需要采集的URL
$key = ''; // PushBear的SendKey
$title_xpath = ''; // 标题的XPath节点
$url_xpath = ''; // 对应链接的XPath节点
$json_path = "/tmp/sf.json";
$html = file_get_contents($url);
$dom = new DOMDocument();
// 从一个字符串加载HTML
@$dom->loadHTML($html);
// 使该HTML规范化
$dom->normalize();
// 用DOMXpath加载DOM,用于查询
$xpath = new DOMXPath($dom);
// 获取对应的xpath数据
$title_hrefs = $xpath->query($title_xpath); // 标题
$data = [];
for ($i = 0; $i < $title_hrefs->length; $i++) {
$href = $title_hrefs->item($i);
$title = $href->nodeValue;
$data[$i]['title'] = $title;
}
// 获取对应的xpath数据
$url_hrefs = $xpath->query($url_xpath); // 链接
for ($i = 0; $i < $url_hrefs->length; $i++) {
$href = $url_hrefs->item($i);
$url = $href->nodeValue;
$data[$i]['url'] = 'https://segmentfault.com'.$url;
}
$json = json_encode($data);
// 判断文件是否存在
if (file_exists($json_path)) {
// 存在
$old = file_get_contents($json_path);
// 文件不同
if ($old != $json) {
// 替换掉 写新文件
file_put_contents($json_path, $json);
$oldInfo = json_decode($old, true);
// 获取差值
$data = getDiffArrayByTitle($data, $oldInfo);
} else {
// 相同就不发了
echo date('Y-m-d H:i:s', time()). "内容相同".PHP_EOL;
return;
}
} else {
// 不存在 写文件
file_put_contents($json_path, $json);
}
$str = "";
foreach ($data as $key => $item) {
$num = $key + 1;
$str .= "{$num}. [{$item['title']}]({$item['url']}) \n\n";
}
// 推送
if (!empty($key)) {
echo sendByBear('***标签动态', $str);
}
function getDiffArrayByTitle($arr1, $arr2, $pk='title'){
$res = [];
foreach($arr2 as $item) $tmpArr[$item[$pk]] = $item;
foreach($arr1 as $v) if(! isset($tmpArr[$v[$pk]])) $res[] = $v;
return $res;
}
function sendByBear($text, $desp = '', $key = '')
{
$postData = http_build_query(
array(
'text' => $text,
'desp' => $desp,
'sendkey' => $key
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postData
)
);
$context = stream_context_create($opts);
$result = file_get_contents('https://pushbear.ftqq.com/sub', false, $context);
return $result;
}
结语
放个Github仓库链接,如果本文有侵权思否官方可以删除?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。