Я написал скребок в php, используя простой HTML Dom.
Проблема в том, что он возвращает результаты, но выдает ошибку
Может кто-нибудь указать мне в правильном направлении, как это исправить, пожалуйста
Ошибка:
Примечание. Попытка получить свойство необъекта в C: \ xampp \ htdocs \ scraper \ au_div_puller.php в строке 60
Большое спасибо
Строка 60
$ Ex_Date = $ tr-> find (‘td’, 0) -> обычный текст; // Находим первый TD (начинается с 0)
<?php
//REQUIRED FILES
require ('connect_mysql.php');
require('simple_html_dom.php');
//SET VARIABLES OF WEBSITE TO CRAWL
$url = ('http://www.shares.com/ANZ'); //WEBSITE TO SCRAPE WITH MYSQL INJECTED FROM ABOVE
echo ($url . "<br>");
//SET USER AGENT TO BE GOOGLEBOT
$opts = array ('http'=>array( 'method'=>"GET", 'header' => 'User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', ));
$context = stream_context_create($opts);
//$html = new simple_html_dom();
$response = file_get_html($url, false, $context);
$html = str_get_html($response);
//CHECK IT IS NOT A 404 PAGE IF SO SKIP
if (!empty($html)) {
//CHECK IT IS NOT BLANK PAGE OR EMPTY PAGE IF SO SKIP
$count = count($html->find('table'));
if($count > 0){
//START TABLE PROCESSING
$table = $html->find('table', 0); // ID LOCK IE TABLE 0 (first table) Get the first table ??
foreach($table ->find('tr') as $tr) { // Foreach row in the table!
$Ex_Date = $tr->find('td', 0)->plaintext; // Find the first TD (starts with 0)
if($Ex_Date == "" || $Ex_Date == " ") continue; // Don't allow empty records
$Amount = $tr->find('td', 1)->plaintext; // Find the second TD (which will be 1)
$Franked = $tr->find('td', 2)->plaintext; // Find the third TD (which will be 2)
$Franking_Credit = $tr->find('td', 3)->plaintext; // Find the fourth TD (which will be 3)
$Books_Close = $tr->find('td', 4)->plaintext; // Find the fifth TD (which will be 4)
$Date_Payable = $tr->find('td', 5)->plaintext; // Find the sixth TD (which will be 5)//MYSQL DATA FORMATTING
//ESCAPE STRINGS AND DATE FORMATTING
//Now validate the data with mysqli_real_escape_string(). This function will escape characters that cause problems, like single quotes.
//Note there needs to be an open connection to the MySQL server for this work, otherwise you'll have blank strings returned.
// convert 04-Dec-1997 to yyyy-mm-dd formate
// for other versions of date format see: https://stackoverflow.com/questions/16139696/convert-date-to-mysql-date-format-php
$Ex_Date_c = mysqli_real_escape_string($conn, $Ex_Date);
$Ex_Date_c = date('Y-m-d', strtotime($Ex_Date_c)); //fix date format
$Amount_c = mysqli_real_escape_string($conn, $Amount);
$Franked_c = mysqli_real_escape_string($conn, $Franked);
$Franking_Credit_c = mysqli_real_escape_string($conn, $Franking_Credit);
$Books_Close_c = mysqli_real_escape_string($conn, $Books_Close);
$Books_Close_c = date('Y-m-d', strtotime($Books_Close_c));//fix date format
$Date_Payable_c = mysqli_real_escape_string($conn, $Date_Payable);
$Date_Payable_c = date('Y-m-d', strtotime($Date_Payable_c));//fix date format//MYSQL INSERT TIME AND TESTING
//MYSQL INSERT QUERY
$sql = "INSERT INTO $insertintotable (stockcode, exchange, exdate, amount, franked, frankingcredit, booksclose, datepayable, updatedatetime)
VALUES ('$stockcode', 'ASX', '$Ex_Date_c', '$Amount_c', '$Franked_c', '$Franking_Credit_c', '$Books_Close_c', '$Date_Payable_c', '$updatedatetime')";
//MYSQL RESULT TEST
//echo ($sql . "<br>"); // Show the Mysql query
if ($conn->query($sql) === TRUE) {
// echo "New record created successfully <br>"; //TESTING --- Uncomment this code after verifying that the echo statements produce valid INSERT queries.
}
else {echo "Error: " . $sql . "<br>" . $conn->error;}
}
}
}
}
// CLOSE AND CLEAR SESSION
$html->clear();
unset($html);
}
$conn->close();
?>
Это готовое заявление, которое я мог бы использовать, которое я скопировал с сайта обучения
// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
Поскольку вы не можете гарантировать, что find('td', 0)
найти значение, вы должны гарантировать, что вы не пытаетесь попросить недвижимость plaintext
если тд не найден.
$table = $html->find('table', 0); // ID LOCK IE TABLE 0 (first table) Get the first table ??
foreach($table ->find('tr') as $tr) { // Foreach row in the table!
if($td = $tr->find('td', 0)) {
$Ex_Date = $td->plaintext; // Find the first TD (starts with 0)
// ... and so on for each variable
Конечно, это не так сексуально, как связывать их вместе, но цепочка работает, только если вы знать что первый метод ($td
в моем примере) всегда будет возвращать объект, имеющий метод / свойство, которое вы вызываете.
На заметку, вы также должны посмотреть на использование подготовленных утверждений (values(?,?,?,?,?,?,?,?)
) вместо того, чтобы вставлять значения в ваш $sql
переменная.
Других решений пока нет …