前两天整B站那个活动学了一下python爬虫,今儿早打开自己主页一看。
好家伙,用了这么久的一言API咋也出现奇怪的东西了。
这也没办法,人家的api,我这儿也没权限筛选。心想干脆自己搭一个吧。
参考https://zhang.ge/5127.html的代码我写了自己的API。
<?php
$path = dirname(__FILE__);
$file = file($path."/koto.txt");
for($arr=mt_rand(0,count( $file));$arr%2!=0;$arr+1){
$arr = mt_rand( 0, count( $file ));
}
$content = trim($file[$arr]);
if (isset($_GET['charset']) && !empty($_GET['charset'])) {
$charset = $_GET['charset'];
if (strcasecmp($charset,"gbk") == 0 ) {
$content = mb_convert_encoding($content,'gbk', 'utf-8');
}
} else {
$charset = 'utf-8';
}
$source = trim($file[$arr+1]);
if (isset($_GET['charset']) && !empty($_GET['charset'])) {
$charset = $_GET['charset'];
if (strcasecmp($charset,"gbk") == 0 ) {
$source = mb_convert_encoding($source,'gbk', 'utf-8');
}
} else {
$charset = 'utf-8';
}
header("Content-Type: text/html; charset=$charset");
if ($_GET['format'] === 'js') {
echo "function fkunhitokoto(){document.write('" . $content ."');}";
echo "function fkunhitokotosource(){document.write('" . $source ."');}";
} else {
echo $content;
echo $source;
}
在同目录下创建koto.txt把自己收集的句子放进去就可以了。
html页面调用方法,首先引入。
<script type="text/javascript" src="https://接口网址/hitokoto/?format=js&charset=utf-8"></script>
在需要显示的地方插入
<p id="hitokoto" style="font-size:1rem;">
<script>hitokoto()</script>
</p>
<p id="hitokotosource" style="font-size:50%">
<script>hitokotosource()</script>
</p>
相比原作,我增加了来源的输出,因为实在懒得想真正的一言API一样使用Json输出。所以还是保留了读取本地txt的方案,我通过奇偶行区分句子内容和出处。在php文件中可以看到,生成随机数后进入判断,检查余数,如果是奇数,则倒着往前减1。所以确保行数一直是偶数,输出行数的前一行则为对应的句子内容。
然后说这个为啥用了python爬虫,我打开原来的API,抄了两句,然后累了。本着能用几行代码解决的事情绝对不做没有意义的劳动。
import json
from urllib.request import Request, urlopen
for i in range(0,100):
url = "https://v1.hitokoto.cn/?c=a"
firefox_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101
Firefox/23.0'}
request = Request( url, headers=firefox_headers )
html = urlopen( request )
data = html.read()
data_json = json.loads(data)
print(data_json['hitokoto'])
print(data_json['from'])
参考了https://www.jianshu.com/p/7e98c1550466这篇文章,原作是爬取金融信息,似乎更加复杂,需要对一整夜的json数据进行拆分再重新打包。我这里就只是把for循环拿到外面,让脚本不断刷新页面即可。
短短几秒,一百条新鲜的内容就拉下来了。感觉还是有些贪心了,请求数过多估计会被BAN,公益API还是要省着点用。