【问题标题】:Trying to build query string and scrape Google results尝试构建查询字符串并抓取 Google 结果
【发布时间】:2014-08-07 20:37:22
【问题描述】:

我正在尝试构建一个 Google 查询字符串,向该页面发出请求,抓取 HTML,然后在 Chrome 扩展程序(即 JavaScript)中对其进行解析。所以我有以下代码:

var url = "https://www.google.com/search?#q=" + artist + "+" + title;
searchGoogleSampleInformation(url);

function searchGoogleSampleInformation(url)
{
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, false);
    xhr.onreadystatechange = function ()
    {
        if (xhr.readyState == 4)
        {
            return parseGoogleInformation(xhr.responseText, url);
        }
    }

    xhr.send();
}

function parseGoogleInformation(search_results, url)
{
    var link = $(".srg li.g:eq(0) .r a", search_results).attr('href');
}

parse 方法只是获取第一个搜索结果的 url(我不想这样做,只是为了测试 HTTP 请求是否正常工作)。但是link 在该行之后是undefined。然后我使用alert(url) 并验证我的查询字符串构建正确;我从警报窗口复制它并粘贴到另一个选项卡中,它按预期提取了结果。然后我用search_results打开了一个新窗口,它似乎是谷歌的常规主页,根本没有搜索。我认为这个问题可能是由于xhr.open 调用的异步性而发生的,但是翻转也没有帮助。我错过了什么明显的东西吗?

【问题讨论】:

    标签: javascript google-chrome-extension xmlhttprequest


    【解决方案1】:

    这是因为"https://www.google.com/search?#q=" + artist + "+" + title最初在内容中没有搜索结果。 Google 最初呈现页面时没有结果,然后通过 JavaScript 动态加载结果。由于您只是获取页面的 HTML 并对其进行处理,因此 HTML 中的 JavaScript 永远不会被执行。

    【讨论】:

    • 是的,这就是问题所在。有没有办法在 Chrome 扩展程序中处理这个问题?我之前在这里问过类似的问题,但一无所获,并通过这篇文章阅读了 100 次 stackoverflow.com/questions/6508393/…
    • 一种选择是在选项卡中打开 URL 并注入脚本以解析呈现的结果。
    【解决方案2】:

    您正在进行跨域 Ajax 调用,默认情况下是不允许的。除非服务器支持并且您传递了适当的标头,否则您无法进行跨域调用。

    但是,正如您提到的,您正在构建一个 Chrome 扩展程序,可以通过在清单文件中添加一些字段:https://developer.chrome.com/extensions/xhr#requesting-permission

    【讨论】:

    • 不,我在 manifest.json 中有 google,但我没有在控制台中收到跨域错误。
    • 您检查了 search_results 变量吗?响应的格式是什么?是 JSON/HTML 吗?似乎 $ 是 google.com 主页上提供的功能,但我相信您通过 XHR 获得的响应不会在 DOM 中,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    相关资源
    最近更新 更多