Вернуться   Форум об интернет-маркетинге > >
Ответ
 
Опции темы
Старый 20.05.2019, 17:29   #21
Dram
Академик
 
Регистрация: 28.06.2008
Сообщений: 6,779
Репутация: 386284

ТопикСтартер Re: Учусь парсить нужны советы

Итак регулярки начал понимать значительно лучше, перешел к curl
Делаю домашнее задание.
Есть 5 ссылок, нужно пройтись по ним курлом, вытащить title, h1 и текст и записать это в базу.
Вот наваял я код и не погу догнать два момента:
1. Какого лешего в базу пишется Array[1] вместо данных
2. Какого пишется два раза, я в упор не вижу где цикл повторяется. Вот что в базе:



Цитата:
<?php
$db = mysqli_connect('localhost', 'mysql', 'mysql', 'my_project')
or die ('Ошибка соединения с MySQL-сервером');

$links = [
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/1.php',
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/2.php',
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/3.php',
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/4.php',
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/5.php',
];

function getPageByUrl ($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($curl);
if ($result === false) { echo "Ошибка CURL: " . curl_error($curl);
return false;
} else {
return $result;
}
}

$i=0;
foreach ($links as $item){
$i++;
$pars = getPageByUrl ($item);
preg_match_all('~<title>(.*)</title>~m',$pars, $title, PREG_SET_ORDER, 0);
preg_match_all('~<h1>(.*)</h1>~m',$pars, $name, PREG_SET_ORDER, 0);
preg_match_all('~<div\s.*(.*)main(.*)>(.*)</h1>(.*)</div>~msU',$pars, $text, PREG_SET_ORDER, 0);

if ($i>=0 && $i<= count($links)) {
$db->query("INSERT INTO `page` (`id`, `name`, `h1`, `text`) VALUES ($i, '$title[0][1]', '$name[0][1]', '$text[0][4]');")
or die ('Ошибка запроса');

}
}
если вместо $db->query выведу запрос через echo - он выводиться 5 раз. От чего же в базу пишется два раза по 5 ?

Последний раз редактировалось Dram; 20.05.2019 в 18:01..
Dram вне форума   Ответить с цитированием

Реклама
Старый 20.05.2019, 18:13   #22
Samail
Академик
 
Аватар для Samail
 
Регистрация: 10.05.2007
Сообщений: 2,928
Репутация: 306919

По умолчанию Re: Учусь парсить нужны советы

Цитата:
Сообщение от Dram Посмотреть сообщение
я в упор не вижу где цикл повторяется.
Так там 2 цикла вообще.
Код:
foreach ($links as $item){
Код:
for ($i>1;$i<=count($links);$i++){
Зачем второй и почему preg_match_all, а не preg_match в данном случае. И раз уж preg_match_all то почему во втором цикле ты ориентируешься на количество ссылок, а не на количество совпадений.
Samail вне форума   Ответить с цитированием
Сказали спасибо:
Старый 20.05.2019, 18:15   #23
Dram
Академик
 
Регистрация: 28.06.2008
Сообщений: 6,779
Репутация: 386284

ТопикСтартер Re: Учусь парсить нужны советы

Потому что я знаю что в каждой ссылке по 1 совпадению. ФОР переписал на ИФ - ничего не изменилось

и повторюсь - если вместо $db->query выведу запрос через echo - он выводиться 5 раз. От чего же в базу пишется два раза по 5 ?

---------- Добавлено 20.05.2019 в 18:43 ----------

Проблему с тем что в базу пишет два раза по 5 решил - нужно было добавить первичный ключ на поле ID
Осталось понять почему вместо данных пишется Array

Последний раз редактировалось Dram; 20.05.2019 в 18:44..
Dram вне форума   Ответить с цитированием
Старый 20.05.2019, 19:27   #24
Samail
Академик
 
Аватар для Samail
 
Регистрация: 10.05.2007
Сообщений: 2,928
Репутация: 306919

По умолчанию Re: Учусь парсить нужны советы

Цитата:
Сообщение от Dram Посмотреть сообщение
Проблему с тем что в базу пишет два раза по 5 решил - нужно было добавить первичный ключ на поле ID
Теперь просто второй раз не пишет с тем-же ID а количество запросов от этого не поменялось
Цитата:
Сообщение от Dram Посмотреть сообщение
Осталось понять почему вместо данных пишется Array
Так попробуй
$db->query("INSERT INTO `page` (`id`, `name`, `h1`, `text`) VALUES ($i, '{$title[0][1]}', '{$name[0][1]}', '{$text[0][4]}');")

только то, что раньше в БД добавил стирать не забывай
Samail вне форума   Ответить с цитированием
Старый 20.05.2019, 19:31   #25
Dram
Академик
 
Регистрация: 28.06.2008
Сообщений: 6,779
Репутация: 386284

ТопикСтартер Re: Учусь парсить нужны советы

АХАХА решил вопрос!!!!!!!!!!! ЭТО ПИ***Ц
4 часа млять потратил - а дело в кавычках!!!!!!!
вот так нужно переменную записывать в запрос '".$text[0][2]."'
двойные кавычки внутри одинарных
Dram вне форума   Ответить с цитированием
Старый 20.05.2019, 21:04   #26
Sitealert
Слесарь-сайтосборщик
 
Регистрация: 30.09.2016
Адрес: Замкадье
Сообщений: 4,406
Репутация: 311063

По умолчанию Re: Учусь парсить нужны советы

Цитата:
Сообщение от Dram Посмотреть сообщение
двойные кавычки внутри одинарных
одинарные внутри двойных.
__________________
Отпилю лишнее, прикручу нужное, выправлю кривое.
Вытравлю вредителей.
Sitealert вне форума   Ответить с цитированием
Сказали спасибо:
Старый 20.05.2019, 21:06   #27
Dram
Академик
 
Регистрация: 28.06.2008
Сообщений: 6,779
Репутация: 386284

ТопикСтартер Re: Учусь парсить нужны советы

Samail, спс - решение с фигурными скобками лучше, меньше путаницы с кавычками!
Dram вне форума   Ответить с цитированием
Старый Вчера, 00:21   #28
edogs
Писать: search@ник_тут.ru
 
Аватар для edogs
 
Регистрация: 16.12.2005
Адрес: St.Petersburg, Russia
Сообщений: 7,786
Репутация: 92274
Отправить сообщение для edogs с помощью Skype™

По умолчанию Re: Учусь парсить нужны советы

Dram,
Остановитесь на минутку.
Погуглите sql иньекции и зачем нужно экранирование.
Не забывайте устанавливать кодировку после соединения с базой и выясните зачем это надо.
Используйте или https://www.php.net/manual/ru/mysqli...ape-string.php экранирование или плейсхолдеры https://www.php.net/manual/ru/mysqli.prepare.php , второе более модно.
__________________
Разработка проектов связанных с криптовалютой. Разумные цены. Хорошее качество. Адекватный подход.
Ищем админа на сервер, в личку: цену установки vdsmanager на hetzner и расстановку ИП.
edogs вне форума   Ответить с цитированием
Сказали спасибо:
Старый Вчера, 15:32   #29
VladimiR93
Абитуриент
 
Регистрация: 21.05.2019
Сообщений: 3
Репутация: 10

По умолчанию Re: Учусь парсить нужны советы

Цитата:
Сообщение от Dram Посмотреть сообщение
Итак регулярки начал понимать значительно лучше, перешел к curl
Делаю домашнее задание.
Есть 5 ссылок, нужно пройтись по ним курлом, вытащить title, h1 и текст и записать это в базу.
Вот наваял я код и не погу догнать два момента:
1. Какого лешего в базу пишется Array[1] вместо данных
2. Какого пишется два раза, я в упор не вижу где цикл повторяется. Вот что в базе:




если вместо $db->query выведу запрос через echo - он выводиться 5 раз. От чего же в базу пишется два раза по 5 ?
Кодить на столько тяжело на сколько выглядит?
VladimiR93 вне форума   Ответить с цитированием
Старый Вчера, 17:05   #30
Dram
Академик
 
Регистрация: 28.06.2008
Сообщений: 6,779
Репутация: 386284

ТопикСтартер Re: Учусь парсить нужны советы

Продолжаю изучать phpQuery и запнулся вот о что... нужно найти все ссылки с нужным классом.
Как искать по отдельности или класс или ссылку, я знаю, а как все вместе?
пробую так, но явно где-то ошибка
Цитата:
$pq = phpQuery::newDocument($pars);
$elem = $pq->find('a')->find('.www')->html();
var_dump($elem);


---------- Добавлено 21.05.2019 в 17:15 ----------

Ларчик просто открывался )) $elem = $pq->find('a.www')->html();

---------- Добавлено 21.05.2019 в 17:28 ----------

Еще непонятка: так все нормально
Цитата:
$pq = phpQuery::newDocument($pars);
$elem = $pq->find('.pag a');
$text = $elem->html();
foreach ($elem as $item) {
$pqLink = pq($item);
echo $pqLink .'<br>';
}
Так ошибка цикла - почему? Warning: Invalid argument supplied for foreach()
Цитата:
$pq = phpQuery::newDocument($pars);
$elem = $pq->find('.pag a')->html();
foreach ($elem as $item) {
$pqLink = pq($item);
echo $pqLink .'<br>';
}
Dram вне форума   Ответить с цитированием
Ответ



Опции темы

Быстрый переход


Регистрация Справка Календарь Поддержка Все разделы прочитаны