jquery 如何解决“CORS”,同时试图刮网站像Google.com使用JavaScript?[复制]

zf2sa74q  于 2023-01-30  发布在  jQuery
关注(0)|答案(2)|浏览(111)
    • 此问题在此处已有答案**:

XMLHttpRequest cannot load XXX No 'Access-Control-Allow-Origin' header(11个答案)
8小时前关门了。
我正在尝试使用JQuery Ajax抓取www.example.com(只是为了好玩)。google.com (just for fun) using JQuery Ajax.
主要是通过将整个站点提取到一个var中,然后从中剥离必要的标记。
然而,它有点工作的正常网站,但当我尝试www.example.com,它通过了一个CORS的问题。google.com, it passed a CORS issue.
如果我无法控制客户端站点或主机,我该如何解决这个问题?
例如,不能放置header('Access-Control-Allow-Origin: *');

    • 我的密码是:**
$.ajax({
     url: "https://www.google.com/",
     dataType: 'text',
     success: function(data) {
          var title = $("<div>").html(data)[0].getElementsByTagName("title")[0];     
            console.log(title);
     }
});
    • 错误:**Access to XMLHttpRequest at 'https://www.google.com/' from origin 'https://xxxxx.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

任何帮助都将不胜感激。

kiayqfof

kiayqfof1#

要抓取Google(或其他网站),你需要使用node.js(如果你想用javascript写的话),有三种常用的方法:

  • 使用HTTP请求+解析HTML;
  • 使用浏览器自动化;
  • 使用现成的API。

第一个解决方案(axios + cheerio).它快速而简单,但它不能从页面获取动态内容(使用JS构建),并可能被网站保护阻止(阅读更多内容,请参阅Reducing the chance of being blocked while web scraping博客文章):

const cheerio = require("cheerio");
const axios = require("axios");

const searchString = "some search query";

const AXIOS_OPTIONS = {
  headers: {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
  },
  params: { q: `${searchString}`, hl: "en", gl: "us" },
};

async function getLinks() {
  return axios.get(`http://www.google.com/search`, AXIOS_OPTIONS).then(async function ({ data }) {
    let $ = cheerio.load(data);

    const links = Array.from($(".yuRUbf > a")).map((el) => $(el).attr("href"));

    return links;
  });
}

getLinks();

第二个解决方案(puppeteer).给你更多的自由,它可以在页面上做任何人类能做的事情,但它很慢,很难用途:

const puppeteer = require("puppeteer");

const serchQuery = "some search query";

const searchParams = {
  query: encodeURI(serchQuery),
  hl: "en",
  gl: "us",
};

const URL = `http://www.google.com/search?q=${searchParams.query}&hl=${searchParams.hl}&gl=${searchParams.gl}`;

async function getLinks() {
  const browser = await puppeteer.launch({
    headless: true, // if you want to see what the browser is doing, you need to change this option to "false"
    args: ["--no-sandbox", "--disable-setuid-sandbox"],
  });

  const page = await browser.newPage();

  await page.goto(URL);

  const links = await page.evaluate(() => {
    return Array.from(document.querySelectorAll(".yuRUbf > a")).map((el) => el.getAttribute("href"));
  });

  await browser.close();

  return links;
}

getLinks();

第三种解决方案(serpapi)。它的主要优点是不需要从页面中选择必要的CSS选择器,也不需要维护你的scraper(当选择器随着时间的推移而改变时)。此外,它像一个简单的HTTP请求一样快速,但它并不支持所有的网站:

import { getJson } from "serpapi";

const getLinks = async () => {
  const response = await getJson("google", {
    api_key: API_KEY, // Get your API_KEY from https://serpapi.com/manage-api-key
    q: "some search query",
  });

  const links = response.organic_results.map((el) => el.link);

  return links;
};

getLinks();
h43kikqp

h43kikqp2#

我已经解决了它安装CORS扩展在我的默认浏览器。为此,我使用谷歌浏览器扩展在下面的链接:https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en

相关问题