- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 UFC 比赛的博彩网站练习网络抓取。我正在使用 javascript 和包 request-promise 和 cheerio。
网站:https://www.oddsshark.com/ufc/odds
我想为每个博彩公司抓取战士的名字和他们各自的投注线。
我的目标是最终得到类似于对象数组的东西,我以后可以用它来为 postgresql 数据库做种。
我想要的输出示例(不必完全一样但相似):
[
{ fighter 1: 'Khabib Nurmagomedov', openingBetLine: -333, bovadaBetLine: -365, etc. },
{ fighter 2: 'Dustin Poirier', openingBetLine: 225, bovadaBetLine: 275, etc. },
{ fighter 3: etc.},
{ fighter 4: etc.}
]
下面是我目前的代码。我对此一窍不通:
const rp = require("request-promise");
const url = "https://www.oddsshark.com/ufc/odds";
// cheerio to parse HTML
const $ = require("cheerio");
rp(url)
.then(function(html) {
// it worked :)
// console.log("MMA page:", html);
// console.log($("big > a", html).length);
// console.log($("big > a", html));
console.log($(".op-matchup-team-text", html).length);
console.log($(".op-matchup-team-text", html));
})
// why isn't catch working?
.catch(function(error) {
// handle error
});
我上面的代码返回索引作为键,嵌套对象作为值。下面仅举其中之一作为示例。
{ '0':
{ type: 'tag',
name: 'span',
namespace: 'http://www.w3.org/1999/xhtml',
attribs: [Object: null prototype] { class: 'op-matchup-team-text' },
'x-attribsNamespace': [Object: null prototype] { class: undefined },
'x-attribsPrefix': [Object: null prototype] { class: undefined },
children: [ [Object] ],
parent:
{ type: 'tag',
name: 'div',
namespace: 'http://www.w3.org/1999/xhtml',
attribs: [Object],
'x-attribsNamespace': [Object],
'x-attribsPrefix': [Object],
children: [Array],
parent: [Object],
prev: [Object],
next: [Object] },
prev: null,
next: null },
我不知道从这里开始做什么。我是否调用了正确的类(op-matchup-team-text)?如果是这样,我如何从网站中提取战斗机名称和投注线标签元素?
//////////////////////////////////////////////////////////////////////在原始帖子上更新 1/////////////////////////
更新:使用 Henk 的建议,我能够抓取战士的名字。使用战斗机名称的代码模板,我也能够抓取战斗机投注线。
但我不知道如何在同一个对象上同时获取这两个对象。例如,我如何将投注线与他/她本人相关联?
下面是我用来抓取 OPENING 公司投注线的代码:
rp(url)
.then(function(html) {
const $ = cheerio.load(html);
const openingBettingLine = [];
// parent class of fighter name
$("div.op-item.op-spread.op-opening").each((index, currentDiv) => {
const openingBet = {
opening: JSON.parse(currentDiv.attribs["data-op-moneyline"]).fullgame
};
openingBettingLine.push(openingBet);
});
console.log("openingBettingLine array test 2:", openingBettingLine);
})
// why isn't catch working?
// eslint-disable-next-line handle-callback-err
.catch(function(error) {
// handle error
});
控制台输出以下内容:
openingBettingLine array test 2: [ { opening: '-200' },
{ opening: '+170' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '' },
{ opening: '+105' },
{ opening: '-135' },
{ opening: '-165' },
{ opening: '+135' },
{ opening: '-120' },
{ opening: '-110' },
{ opening: '-135' },
{ opening: '+105' },
{ opening: '-165' },
{ opening: '+135' },
{ opening: '-115' },
{ opening: '-115' },
{ opening: '-145' },
{ opening: '+115' },
{ opening: '+208' },
{ opening: '-263' },
etc.
我想要的对象输出仍然是(如下例)。那么我如何将 openingBettingLine 放入与战斗机关联的对象中呢?
[
{ fighter 1: 'Khabib Nurmagomedov', openingBetLine: -333, bovadaBetLine: -365, etc. },
{ fighter 2: 'Dustin Poirier', openingBettingLine: 225, bovadaBetLine: 275, etc. },
{ fighter 3: etc.},
{ fighter 4: etc.}
]
//////////////////////////////////////////////////////////////////////在原始帖子上更新 2/////////////////////////
我不能让 BOVADA 公司的赌注赔钱。我将代码隔离到下面的这家公司。
//BOVADA 投注线数组 --> 不工作
rp(url)
.then(function(html) {
const $ = cheerio.load(html);
const bovadaBettingLine = [];
// parent class of fighter name
$("div.op-item.op-spread.border-bottom.op-bovada.lv").each(
(index, currentDiv) => {
const bovadaBet = {
BOVADA: JSON.parse(currentDiv.attribs["data-op-moneyline"]).fullgame
};
bovadaBettingLine.push(bovadaBet);
}
);
console.log("bovadaBettingLine:", bovadaBettingLine);
})
// why isn't catch working?
// eslint-disable-next-line handle-callback-err
.catch(function(error) {
// handle error
});
它返回:bovadaBettingLine: []
没有任何内容。
以下是网站该部分的 HTML 代码。
最佳答案
短:
详细信息:
首先分析你想要的数据的源代码:
<div class="op-matchup-team op-matchup-text op-team-top" data-op-name="{full_name:Jessica Andrade,short_name:}"><span class="op-matchup-team-text">Jessica Andrade</span></div>
您正在尝试获取战斗机的名称。所以你可以瞄准 <span class="op-matchup-team-text">Jessica Andrade</span>
的内容或 parent 的属性div
这是 data-op-name="{full_name:Jessica Andrade,short_name:}"
让我们试试第二个:
divs
具有所需的内容:$("div.op-matchup-team.op-matchup-text.op-team-top")
each()
迭代器fighters
中数组。另请参阅下面的代码注释:
const rp = require("request-promise");
const url = "https://www.oddsshark.com/ufc/odds";
const cheerio = require("cheerio")
rp(url)
.then(function (html) {
const $ = cheerio.load(html)
const fighters = [];
$("div.op-matchup-team.op-matchup-text.op-team-top")
.each((index, currentDiv) => {
const fighter = {
name: JSON.parse(currentDiv.attribs["data-op-name"]).full_name,
//There is no direct selector for the rows of the second column based on the first one.
//So you need to select all rows of the second column as you did, and then use the current index
//to get the right row. Put the selected data into your "basket" the fighter object. Done.
openingBetLine: JSON.parse($("div.op-item.op-spread.op-opening")[index].attribs["data-op-moneyline"]).fullgame
// go on the same way with the other rows that you need.
}
fighters.push(fighter)
})
console.log(fighters)
}).catch(function (error) {
//error catch does work, you just need to print it out to see it
console.log(error)
});
会给你:
[{ name: 'Jessica Andrade',
openingBetLine: '-200'},...]
关于JavaScript Node.js WebScraping : How do I find specific elements on webpage table to scrape and push into an array of objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57641803/
我的应用程序有一个在客户端运行的 websocket 客户端,我正在使用 websocket 上传文件。 我有一个 wicket 网页,它有两种上传 USB 文件的方法(自动和输入类型文件)当我的页面
当我们尝试在 sitecore 7.1 应用程序中浏览图像时,出现以下错误,该错误已从 6.2 迁移到 7.1。 Type 'ASP._Page_sitecore_shell_client_Speak
在从 6.2 迁移到 7.1 的 Sitecore 7.1 中打开图像时,出现以下错误: Type 'ASP._Page_sitecore_shell_client_Speak_Layouts_Lay
我得到: Type 'ASP._Page_index_cshtml' does not inherit from 'System.Web.WebPages.WebPage'. 当我浏览到我的index
我在配置 asp.net mvc 应用程序时遇到问题: [HttpException (0x80004005): Type 'ASP._Page_Currency_Index_cshtml' does
我遵循了非常相似的帖子提供的答案,您将在下面列出的逐步步骤中看到。 Razor view Type does not inherit from 'System.Web.WebPages.WebPage
这个问题在这里已经有了答案: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to... web.conf
我正在我的 Android 应用程序上集成 payumoney 支付网关。但是当我尝试通过测试借记卡进行测试交易时。它显示一个错误。当我联系 payumoney 客户服务时,他们说将服务器的 URL
我有一个网页,每 5 秒左右通过从服务器获取数据在 AJAX 中 self 更新。但是,我想只在用户主动查看页面时执行更新。 当用户在另一个选项卡上,在浏览器以外的另一个程序中,或者页面不是用户 PC
Google 是如何制作每天替换 Google Logo 的小动画的? 我知道去年全世界在工作中玩吃 bean 人时损失了将近 500 万小时(但这是值得的 :D)。但是这些互动小游戏还是让我印象深刻
我的本地主机上有一个 HTML 文件,我想要整个页面的屏幕截图。有谁知道一些截取整个页面(本地主机)的软件?我找到了一些插件,但它们不支持本地主机文件。 最佳答案 在 Windows 上按“Prt
我正在使用 PhantomJS 1.8.2 通过 JsTestDriver 运行一些 Jasmine 单元测试。使用 Chrome 测试运行良好,但使用 PhantomJS 时大约有一半的时间,测试结
我的本地主机上有一个 HTML 文件,我想要整个页面的屏幕截图。有谁知道一些截取整个页面(本地主机)的软件?我找到了一些插件,但它们不支持本地主机文件。 最佳答案 在 Windows 上按“Prt
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface;
我需要点击一个链接,它实际上是 html 文件中的一个图像(左上角的 UCR 标志),我应该怎么做? 我有以下代码: url % follow_link("") 标志的html代码是:
为什么会这样? public class MainActivity extends Activity { WebView browser; @Override publ
我的来源: public class MainActivity extends DroidGap { @Override public void onCreate(Bu
我在godaddy购买了一个域名(www.domainname.com)。 我有一个 tomcat 服务器在路径 http://174.xxx.x.xx/WebApp1/webhome 部署了工作应用
我正在尝试完成一些可能相对简单的事情,但我不知道我会怎么调用它(如果有特定的名称),因此我的搜索被证明是无用的。 我想要完成的很简单:我有一个基于 Masonry jquery 插件(类似于 http
是否有任何自动化工具可以在网站上找到损坏的内部链接——特别是针对基于 DNN 框架的网站。 (DotNetNuke)。 我们查看了 Xenu,但看不到登录页面。 任何建议 干杯。 最佳答案 我已经在博
我是一名优秀的程序员,十分优秀!