有没有一种使用PHP从Google学术下载Bibtex的方法?

8

你好,是否有一种方法可以使用PHP从Google Scholar下载某个内容的BibTeX条目,而不必一个一个手动下载BibTeX?例如,设置搜索值为“研究”,然后通过代码自动下载相关的BibTeX链接。

任何帮助都会受到赞赏。我尝试获取HTML页面,但是当我尝试获取页面内容时,“导入到BibTeX”链接在检索到的页面内容上消失了。

我的代码:

<?php
$url = 'http://scholar.google.com/scholar?q=honors+college&amp;hl=en&amp;btnG=Search&     amp;as_sdt=1%2C4&amp;as_sdtp=on';
$needle = 'Import into bibtex';
$contents = file_get_contents($url);
echo $contents;
if(strpos($contents, $needle)!== false) {
echo 'found';
} else {
echo 'not found';
}
?>

谷歌的许多基于Web的界面都严重依赖JavaScript,这是您的屏幕抓取程序无法处理的。 您需要弄清楚后台发生了什么,然后通过脚本复制它。 - Marc B
我认为,“导入到bitex”的链接只会在您登录时显示。尝试登录Google(我不知道如何通过编程完成此操作),然后获取学者页面。 - koppor
2个回答

1
短答案是不能这样做。
谷歌没有提供搜索/学者的API,并使用固定的速率限制。问题在于,对于每个BibTex条目,您需要2个额外的请求(1个用于查询,1个用于“导入链接”,最后一个用于获取实际的BibTex条目内容)。
我编写了一个脚本来爬取谷歌学者的结果,并找到BibTex链接并保存结果。但是,由于速率限制不可行,几乎会立即被阻止。
代码可以在此处查看:https://gist.github.com/Tessmore/11099509,并且可以免费使用,但风险自负。

1

正如Tessmore所说 - 你不能做到。但是你可以使用SerpApi的Google Scholar Organic Results API来绕过配额限制和搜索引擎的封锁,这样你就不必考虑如何降低被封锁的几率。

例如:

toc_02


首先通过composer安装google-search-results-php包:

$ composer require serpapi/google-search-results-php:2.0

集成代码和在线IDE中的完整示例

<?php
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);
error_reporting(E_ALL);

require __DIR__ . "/vendor/autoload.php";

function getResultIds () {
    $result_ids = array();

    $params = [
        "engine" => "google_scholar", // parsing engine
        "q" => "biology"              // search query
    ];
    
    $search = new GoogleSearch(getenv("API_KEY"));
    $response = $search->get_json($params);
    
    foreach ($response->organic_results as $result) {
        // print_r($result->result_id);
        
        array_push($result_ids, $result->result_id);
    }

    return $result_ids;
}

function getBibtexData () {
    $bibtex_data = array();

    foreach (getResultIds() as $result_id) {
        $params = [
            "engine" => "google_scholar_cite",  // parsing engine
            "q" => $result_id
        ];
    
        $search = new GoogleSearch(getenv("API_KEY"));
        $response = $search->get_json($params);

        foreach ($response->links as $result) {
            if ($result->name === "BibTeX") {
                array_push($bibtex_data, $result->link);
            }
        }
    }
    
    return $bibtex_data;
}

print_r(json_encode(getBibtexData(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
?>

输出:

[
    "https://scholar.googleusercontent.com/scholar.bib?q=info:KNJ0p4CbwgoJ:scholar.google.com/&output=citation&scisdr=CgXjqB_WGAA:AAGBfm0AAAAAYkm8amenawYn_EBidiCQT5QBh0L1KJEX&scisig=AAGBfm0AAAAAYkm8at9X4P3eIWKUCOc6UriCEDKVsQE0&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:6zRLFbcxtREJ:scholar.google.com/&output=citation&scisdr=CgWhqfi6GAA:AAGBfm0AAAAAYkm8bDoIhTlfTkQFCOzYGax54Bst576o&scisig=AAGBfm0AAAAAYkm8bMe_7Nq4e4pB5lg_eR9jmeGrO8ek&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:6Yb0qOX88FMJ:scholar.google.com/&output=citation&scisdr=CgXn_4MdGAA:AAGBfm0AAAAAYkm8bi8ypCZcFDNEQZYZeoSlvx-U1OSk&scisig=AAGBfm0AAAAAYkm8bnFMnwTWGfkfJDCNEx0C4n-aQwql&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:HFdEElNr3IgJ:scholar.google.com/&output=citation&scisdr=CgXKCFpQGAA:AAGBfm0AAAAAYkm8byukcQCl4WHQx-nSNp2pC1gUFSKG&scisig=AAGBfm0AAAAAYkm8b8EReTVkLwtxfth_pjwMyyY3dqts&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:bs-D_MeC14YJ:scholar.google.com/&output=citation&scisdr=CgXEUXwWGAA:AAGBfm0AAAAAYkm8bwwfMNJrffe16EaGypsem9JlmGTi&scisig=AAGBfm0AAAAAYkm8b6nWlPOQL63fXg6dV2U-JQbpyQyS&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:Rn1qFVLRfKwJ:scholar.google.com/&output=citation&scisdr=CgU-HswkGAA:AAGBfm0AAAAAYkm8cHE1YRK23eHV8nzF89Eem-Bsuz72&scisig=AAGBfm0AAAAAYkm8cDEj8ZrzZjAo2bNX-tjYYYJYQZay&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:d8thHtTwq6YJ:scholar.google.com/&output=citation&scisdr=CgXj7oe9GAA:AAGBfm0AAAAAYkm8cTYamCKGKImjdg5MQdgbxUIIHAEY&scisig=AAGBfm0AAAAAYkm8cTcop1ceKzKYvKAKtvlSQ1EdEtSN&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:IUmhOhGaDaEJ:scholar.google.com/&output=citation&scisdr=CgU0qZ2_GAA:AAGBfm0AAAAAYkm8ctCPwoihZkjbNcdEqSnwa0J3jwDy&scisig=AAGBfm0AAAAAYkm8cingBcYnEp8YRqFDFdN-FAEBgDT7&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:PWsf8O5OMQEJ:scholar.google.com/&output=citation&scisdr=CgVBAJxXGAA:AAGBfm0AAAAAYkm8c3CDKQG0Wh_lWsXU_DZxEJkwZz5y&scisig=AAGBfm0AAAAAYkm8c6I-HjAxD1Gy6FLFDRdxH_qU4OBr&scisf=4&ct=citation&cd=-1&hl=en",
    "https://scholar.googleusercontent.com/scholar.bib?q=info:yGvgHH8ROuIJ:scholar.google.com/&output=citation&scisdr=CgXFuhOkGAA:AAGBfm0AAAAAYkm8dD0rcSR4LQF8GgTxx865BADtXNDN&scisig=AAGBfm0AAAAAYkm8dIQhodz3rHF9IUdaCSRlhdudACNQ&scisf=4&ct=citation&cd=-1&hl=en"
]

第一个URL的Bibtex数据:

@article{woese2004new,
  title={A new biology for a new century},
  author={Woese, Carl R},
  journal={Microbiology and molecular biology reviews},
  volume={68},
  number={2},
  pages={173--186},
  year={2004},
  publisher={Am Soc Microbiol}
}

免责声明,我是SerpApi的员工。

尝试通过链接下载BibTeX时,我仍然遇到403错误。 - christianbrodbeck
似乎也有某种计数器,我每天只能下载几个引用,然后就会得到403错误。 - christianbrodbeck
@christianbrodbeck 如果您正在使用SerpApi,它不应该有任何限制。它使用专用代理和验证码解决程序。如果使用SerpApi,请随时在此处提出详细的问题。这里是如何报告问题。您将获得比在此处评论中更快的解决方案。 - Dmitriy Zub
我正在使用serpapi获取bibtext链接,但是为了检索bibtex本身,我随后直接使用该链接。是否有一种通过serpapi检索bibtex(即通过脚本中打印的链接获取内容)的方法? - christianbrodbeck
@christianbrodbeck 很抱歉迟回复了。目前这个功能还不可用。你可以在SerpApi public-roadmap看到一个开放的问题,我也通过使用reqeusts发出另一个请求来编写了一个解决方法 - Dmitriy Zub
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接