WordPress从某网站不问自取的方法

捣鼓了一个函数,可以从某网站自动获取想要的情报。
跟WordPress关系不太大,主要就是在php里写了一堆我不擅长的正则。
例子里取的内容是电影的。音乐和读书的类似,自己追加正则就是了。没有的项目也自己增加正则就好了。抓取不是目的,目的是提供一个思路。
注意:本文写于2020年9月11日,正则表达式配合的是当天的某网站的格式,不保证以后也可以用!

function wp_fetch_from_douban($url) {
    $response = @wp_remote_get( 
        htmlspecialchars_decode($url), 
        array( 
            'timeout'  => 1000, 
        ) 
    );
    if ( is_wp_error( $response ) || !is_array($response) )
    {
        return array();
    }
    preg_match_all('/(<div id="mainpic"[\s\S]+?<\/div>)|(<div id="info"[\s\S]+?<\/div>)|(<strong .+? property="v:average">.+?(<\/strong>|>))/',wp_remote_retrieve_body($response),$matches);
    if (is_array($matches) && is_array($matches[0]) && count($matches[0])>=3) {
        $mainpic_div_str = $matches[0][0];
        $info_div_str = $matches[0][1];
        $score_str = $matches[0][2];

        //图
        preg_match('/(?<=img src=").*?(?=")/',$mainpic_div_str,$match_imgs);
        if (is_array($match_imgs)) {
            $ret['pic'] = $match_imgs[0];
        }

        //分
        preg_match('/(?<= property="v:average"\>).*?(?=\<)/',$score_str, $match_score);
        if (is_array($match_score)) {
            $ret['average_score'] = $match_score[0];
        }

        $info_grep_keys = array(
            array('pattern'=>'/(?<="v:directedBy"\>).*?(?=\<)/', 'item'=>'director(s)'),
            array('pattern'=>'/(?<="v:starring"\>).*?(?=\<)/', 'item'=>'actor(s)'),
            array('pattern'=>'/(?<="v:genre"\>).*?(?=\<)/', 'item'=>'genre(s)'),
            array('pattern'=>'/(?<=\<span property="v:initialReleaseDate" content=").*?(?=")/', 'item'=>'release_date(s)'),
        );

        foreach ($info_grep_keys as $grep) {
            unset($matches);
            preg_match_all( $grep['pattern'], $info_div_str, $matches);
            if (is_array($matches) && is_array($matches[0]) && count($matches[0])>=1) {
                if(count($matches[0])>1) {
                    $ret[$grep['item']] = implode(',', $matches[0]);
                }
                else {
                    $ret[$grep['item']]  = $matches[0][0];
                }
            }
        }
    }
    //var_dump($ret) ;
    return $ret;
}

已有8条评论

    1. 同感啊,看不懂又超级敬佩

    1. 去看了一下,不适合我用啊。因为我把自己的豆瓣ID注销了。

  1. 看了半天,只能先收藏了。

  2. 代码如诗,看来大致哥最近性质不错

  3. 相当于就是舆情监控的功能吧。

    1. 并不是。

    1. 对。因为我不是干网络开发的,所以这块就是瞎搞。昨天循环调用,发现IP被当不良爬虫给封掉了= =

你好,新朋友。留言前请先填写昵称邮箱