Я извлек то, что мне нужно, из определенного c веб-сайта, но дело в том, что веб-сайт постоянно меняет свое местоположение контента, включая div. а также у них есть всплывающие окна, поэтому при поиске этого конкретного div, если появляется всплывающее добавление, то div не найден. Пример: я использовал
$client = new Client([
'base_uri' => 'https://theexample.com/',
]);
, а затем:
$res = $client->request('get', 'category/lifestyle/horoscopes/' . $horoscope);
, но они продолжают изменять «категорию / стиль жизни / гороскопы /» в этой части. поэтому всякий раз, когда они меняются, я тоже должен изменить свой код. Есть ли способ получить гороскопы, даже если они установили его «категория / гороскоп» или «категория / что-то еще / гороскоп» ?? и способ избежать всплывающих окон.
вот дескриптор команды, который выполняется каждый день:
public function insertData($today)
{
$data = [];
$count = 0;
$todayFormat = date('Y') . '-' . strtoupper(date('F')) . '-' . date('j');
$client = new Client([
'base_uri' => 'https://theexample.com/',
]);
$data['date'] = $today;
$horoscopes = $this->getAllHoroscopes();
foreach ($horoscopes as $horoscope) {
try {
$res = $client->request('get', 'category/horoscopes/' . $horoscope);
} catch (RequestException $e) {
echo Psr7\str($e->getRequest());
if ($e->hasResponse()) {
echo Psr7\str($e->getResponse());
}
}
$body = $res->getBody();
$stringbody = (string) $body;
$dom = HtmlDomParser::str_get_html($stringbody);
$horoscopeDiv = $dom->find('.horoscopes', 0);
$horoscopeDataDiv = $horoscopeDiv->find('.sign_detail', 0);
$todayDateAll = $horoscopeDataDiv->children(1)->plaintext;
$tempDate = explode(' ', $todayDateAll);
$horoscopeEng = strtolower($tempDate[0]);
if (ucwords($tempDate[2]) == (date('F')) && date('j') == $tempDate[3]) {
$mainData = $horoscopeDataDiv->children(2)->plaintext;
if ($mainData) {
$data[$horoscope] = html_entity_decode($mainData);
}else{
$data[$horoscope] = "No data available for $data[$horoscope]";
}
}
}
$data = str_replace("’", "'", $data);
$data = str_replace("“", '"', $data);
$data = str_replace("”", '"', $data);
/*$data = str_replace(
array("’’", '"'),
array("’", "'"),
$data
);*/
EnglishHoroscope::create($data);
$new_data['table_name'] = "english_horoscopes";
$new_data['job_run_at'] = Carbon::now();
$new_data['status'] = "data inserted for today";
CronLogs::create($new_data);
echo " succcessfully inserted englishhoroscope data";
}
public function getAllHoroscopes() {
$horoscopes = ['aries', 'taurus', 'gemini', 'cancer', 'leo', 'virgo', 'libra', 'scorpio', 'sagittarius', 'capricorn', 'aquarius', 'pisces'];
return $horoscopes;
}
}