现学现卖

前两天整B站那个活动学了一下python爬虫,今儿早打开自己主页一看。

ScreenShot_2020-10-26_12-32-05.png
ScreenShot_2020-10-26_12-32-05.png

好家伙,用了这么久的一言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还是要省着点用。

ScreenShot_2020-10-27_19-46-05.png
ScreenShot_2020-10-27_19-46-05.png

评论区

评论列表