抓取引用R中外部Javascript脚本的Javascript呈现网页
我正在尝试刮取此网页: 由于网页似乎是动态呈现的,因此我遵循本教程: 正如教程所建议的,我使用以下代码保存了一个名为“scrape_芥末.js”的文件:抓取引用R中外部Javascript脚本的Javascript呈现网页,javascript,r,web-scraping,phantomjs,Javascript,R,Web Scraping,Phantomjs,我正在尝试刮取此网页: 由于网页似乎是动态呈现的,因此我遵循本教程: 正如教程所建议的,我使用以下代码保存了一个名为“scrape_芥末.js”的文件: // scrape_mustard.js var webPage = require('webpage'); var page = webPage.create(); var fs = require('fs'); var path = 'mustard.html' page.open('https://www.mustardbet.c
// scrape_mustard.js
var webPage = require('webpage');
var page = webPage.create();
var fs = require('fs');
var path = 'mustard.html'
page.open('https://www.mustardbet.com/sports/events/302698', function (status) {
var content = page.content;
fs.write(path,content,'w')
phantom.exit();
});
然后,我表演
system("./phantomjs scrape_mustard.js")
但我得到了一个错误:
ReferenceError: Can't find variable: Set
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1 in t
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1 in t
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1 in t
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1 in t
https://www.mustardbet.com/assets/js/index.dfd873fb.js:1
现在,当我将“”粘贴到浏览器中时,我可以看到它是javascript,我可能需要
(1) 将其另存为文件,或
(2) 将其包含在scrape_芥末.js中
但是如果(1),我不知道如何引用这个新文件,如果(2),我不知道如何正确定义所有javascript以便可以使用它
我对javascript完全是个新手,但这个问题可能不太难吧
谢谢你的帮助 我能够使用js模块
puppeter.js
进行刮取
下载node.js
node.js
附带了npm
,这使您在安装模块时的生活更加轻松。您需要使用npm
安装木偶演员
在RStudio中,当您安装puppeter.js
时,确保您在工作目录中。安装node.js
后,执行()操作:
系统(“npm i木偶演员”)
scrape_芥末酱.js
:
// load modules
const fs = require("fs");
const puppeteer = require("puppeteer");
// page url
url = "https://www.mustardbet.com/sports/events/302698";
scrape = async() => {
const browser = await puppeteer.launch({headless: false}); // open browser
const page = await browser.newPage(); // open new page
await page.goto(url, {waitUntil: "networkidle2", timeout: 0}); // go to page
await page.waitFor(5000); // give it time to load all the javascript rendered content
const html = await page.content(); // copy page contents
browser.close(); // close chromium
return html // return html object
};
scrape().then((value) => {
fs.writeFileSync("./stackoverflow/page.html", value) // write the object being returned by scrape()
});
要在R
中运行scrape_芥末酱.js
:
library(magrittr)
system("node ./stackoverflow/scrape_mustard.js")
html <- xml2::read_html("./stackoverflow/page.html")
oddsMajor <- html %>%
rvest::html_nodes(".odds-major")
betNames <- html %>%
rvest::html_nodes("h3")
库(magrittr)
系统(“node./stackoverflow/scrape_mu.js”)
html域名
{xml_nodeset(60)}
[1] 查尔斯·豪厄尔三世\n
[2] 布赖恩·哈曼\n
[3] Austin Cook\n
[4] J.J.斯潘\n
[5] 韦布·辛普森\n
[6] Cameron Champ\n
[7] Peter Uichlein\n
[8] 承在音\n
[9] 尼克·沃特尼\n
[10] 格雷姆·麦克道尔\n
[11] 扎克·约翰逊\n
[12] 卢卡斯·格洛弗\n
[13] 科里·康纳斯\n
[14] 路加列表\n
[15] David Hearn\n
[16] 亚当·申克\n
[17] 凯文·基斯纳\n
[18] 布莱恩·盖伊\n
[19] 巴顿基齐尔\n
[20] 布里斯·加内特\n
...
我确信它可以通过
phantomjs
完成,但我发现puppeter
更容易抓取javascript呈现的网页。还要记住,phantomjs
我能够使用js模块puppeter.js
进行抓取
下载node.js
node.js
附带了npm
,这使您在安装模块时的生活更加轻松。您需要使用npm
安装木偶演员
在RStudio中,当您安装puppeter.js
时,确保您在工作目录中。安装node.js
后,执行()操作:
系统(“npm i木偶演员”)
scrape_芥末酱.js
:
// load modules
const fs = require("fs");
const puppeteer = require("puppeteer");
// page url
url = "https://www.mustardbet.com/sports/events/302698";
scrape = async() => {
const browser = await puppeteer.launch({headless: false}); // open browser
const page = await browser.newPage(); // open new page
await page.goto(url, {waitUntil: "networkidle2", timeout: 0}); // go to page
await page.waitFor(5000); // give it time to load all the javascript rendered content
const html = await page.content(); // copy page contents
browser.close(); // close chromium
return html // return html object
};
scrape().then((value) => {
fs.writeFileSync("./stackoverflow/page.html", value) // write the object being returned by scrape()
});
要在R
中运行scrape_芥末酱.js
:
library(magrittr)
system("node ./stackoverflow/scrape_mustard.js")
html <- xml2::read_html("./stackoverflow/page.html")
oddsMajor <- html %>%
rvest::html_nodes(".odds-major")
betNames <- html %>%
rvest::html_nodes("h3")
库(magrittr)
系统(“node./stackoverflow/scrape_mu.js”)
html域名
{xml_nodeset(60)}
[1] 查尔斯·豪厄尔三世\n
[2] 布赖恩·哈曼\n
[3] Austin Cook\n
[4] J.J.斯潘\n
[5] 韦布·辛普森\n
[6] Cameron Champ\n
[7] Peter Uichlein\n
[8] 承在音\n
[9] 尼克·沃特尼\n
[10] 格雷姆·麦克道尔\n
[11] 扎克·约翰逊\n
[12] 卢卡斯·格洛弗\n
[13] 科里·康纳斯\n
[14] 路加列表\n
[15] David Hearn\n
[16] 亚当·申克\n
[17] 凯文·基斯纳\n
[18] 布莱恩·盖伊\n
[19] 巴顿基齐尔\n
[20] 布里斯·加内特\n
...
我确信它可以通过
phantomjs
完成,但我发现puppeter
更容易抓取javascript呈现的网页。另外请记住,phantomjs
当然,如果有人能用另一种R方法来抓取这个页面,我很乐意听到!当然,如果有人有办法用另一种R方法来刮这一页,我会很高兴听到的!