Collect a lot more data.

This commit is contained in:
2019-01-17 15:02:50 +01:00
parent b60419f3d1
commit 31922bbc3f
5 changed files with 150 additions and 17 deletions

View File

@@ -4,6 +4,13 @@ use unhtml_derive::FromHtml;
use crate::context::Context;
use crate::probe::Probe;
#[derive(Debug, FromHtml)]
#[html(selector = ".CompanyResultListItem")]
struct Company {
#[html(selector = "h3.name > a", attr = "inner")]
name: String,
}
#[derive(Debug, FromHtml)]
#[html(selector = ".PhoneNoHit")]
struct Error {
@@ -30,7 +37,12 @@ impl Probe for Eniro {
body
};
if let Ok(error) = Error::from_html(&body) {
if let Ok(company) = Company::from_html(&body) {
println!("eniro.se:");
println!(" {}", company.name);
Ok(())
} else if let Ok(error) = Error::from_html(&body) {
println!("eniro.se:");
println!(" Antal sökningar på det här numret: {}", error.message);

View File

@@ -1,3 +1,4 @@
use log::debug;
use regex::Regex;
use serde::Deserialize;
@@ -19,7 +20,8 @@ struct Props {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct PageProps {
phone_data: PhoneData,
status_code: Option<u16>,
phone_data: Option<PhoneData>,
}
#[derive(Debug, Deserialize)]
@@ -65,17 +67,28 @@ impl Probe for Hitta {
if let Ok(data) = serde_json::from_str::<Data>(&json) {
println!("hitta.se:");
println!(" {}", data.props.page_props.phone_data.statistics_text);
for comment in &data.props.page_props.phone_data.comments {
if let Some(phone_data) = data.props.page_props.phone_data {
println!(" {}", phone_data.statistics_text);
for comment in &phone_data.comments {
println!(" * {}", comment.comment);
}
} else {
println!(" Vi hittar det mesta, men inte just den här sidan.");
}
Ok(())
} else {
if let Err(error) = serde_json::from_str::<Data>(&json) {
debug!("Hitta: failed to deserialize data: {:#?}", error);
}
Err(())
}
} else {
debug!("Hitta: failed to find __NEXT_DATA__");
Err(())
}
}

View File

@@ -11,6 +11,13 @@ struct Info {
message: String,
}
#[derive(Debug, FromHtml)]
#[html(selector = ".body-content > .row")]
struct Error {
#[html(selector = ".col-md-12", attr = "inner")]
message: String,
}
pub struct KonsumentInfo;
impl Probe for KonsumentInfo {
@@ -34,6 +41,8 @@ impl Probe for KonsumentInfo {
if let Ok(info) = Info::from_html(&body) {
println!(" {}", info.message);
} else if let Ok(error) = Error::from_html(&body) {
println!(" {}", error.message);
} else {
println!(" Failed to find any data");
}

View File

@@ -1,14 +1,39 @@
use unhtml::FromHtml;
use log::debug;
use unhtml::{self, FromHtml, VecFromHtml};
use unhtml_derive::FromHtml;
use crate::context::Context;
use crate::probe::Probe;
#[derive(Debug, FromHtml)]
#[html(selector = "[itemtype='//data-vocabulary.org/Review-aggregate']")]
struct Info {
#[html(selector = "p", attr = "inner")]
message: String,
#[html(selector = "article")]
struct Page {
content: Content,
#[html(selector = "#kommentarer > [itemtype='http://data-vocabulary.org/Review']")]
comments: Vec<Comment>,
}
#[derive(Debug, FromHtml)]
#[html(selector = "#content")]
struct Content {
#[html(selector = "p:nth-child(2)", attr = "inner")]
title: String,
#[html(selector = "p:nth-child(5)", attr = "inner")]
history: String,
}
#[derive(Debug, FromHtml)]
struct Comment {
#[html(selector = "small", attr = "datetime")]
datetime: String,
#[html(selector = "h3", attr = "inner")]
title: String,
#[html(selector = "[itemprop='description']", attr = "inner")]
comment: String,
}
pub struct Telefonforsaljare;
@@ -32,9 +57,21 @@ impl Probe for Telefonforsaljare {
println!("telefonforsaljare.nu:");
if let Ok(info) = Info::from_html(&body) {
println!(" {}", info.message);
if let Ok(page) = Page::from_html(&body) {
println!(" {}", page.content.title);
println!(" {}", page.content.history);
for comment in &page.comments {
println!(
" * {}: {} - {}",
comment.datetime, comment.title, comment.comment
);
}
} else {
if let Err(error) = Page::from_html(&body) {
debug!("telefonforsaljare: failed to parse page: {:#?}", error);
}
println!(" Failed to find any data");
}

View File

@@ -1,6 +1,38 @@
use log::debug;
use unhtml::{self, FromHtml, VecFromHtml};
use unhtml_derive::FromHtml;
use crate::context::Context;
use crate::probe::Probe;
#[derive(Debug, FromHtml)]
#[html(selector = "#content")]
struct Page {
#[html(selector = "#toporganisations > li")]
owners: Vec<Owner>,
#[html(selector = "#calls > ol.table > li")]
calls: Vec<Call>,
}
#[derive(Debug, FromHtml)]
struct Owner {
#[html(selector = "a", attr = "inner")]
title: String,
#[html(selector = "span", attr = "inner")]
calls: String,
}
#[derive(Debug, FromHtml)]
struct Call {
#[html(selector = ".w40", attr = "inner")]
who: String,
#[html(selector = ".w15", attr = "inner")]
date: String,
}
pub struct VemRingde;
impl Probe for VemRingde {
@@ -9,7 +41,7 @@ impl Probe for VemRingde {
}
fn search(&mut self, ctx: &mut Context, number: &str) -> Result<(), ()> {
let _body = if let Some(cache) = ctx.cache_get("vem_ringde", &number) {
let body = if let Some(cache) = ctx.cache_get("vem_ringde", &number) {
String::from_utf8(cache.data).unwrap()
} else {
let body = reqwest::get(&self.uri(number)).unwrap().text().unwrap();
@@ -20,6 +52,36 @@ impl Probe for VemRingde {
body
};
println!("vemringde.se:");
if let Ok(page) = Page::from_html(&body) {
if !page.owners.is_empty() {
println!(" ägare:");
for owner in &page.owners {
println!(" * {} - {}", owner.title, owner.calls);
}
}
if !page.calls.is_empty() {
if !page.owners.is_empty() {
println!();
}
println!(" samtal:");
for call in &page.calls {
println!(" * {}: {}", call.date, call.who);
}
}
} else {
if let Err(error) = Page::from_html(&body) {
debug!("vemringde: failed to parse page: {:#?}", error);
}
println!(" Failed to find any data");
}
Err(())
}
}