Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107

[РЕЦЕПТ] Как написать парсер

03.06.2017, 15:38. Показов 2972. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Установить ОС Linux, mitmproxy, зайти на сайт, прочитать в mimproxy, какие данные были отправлены (адрес страницы, куки, другие параметры), какие получены (заголовки, содержимое), попытаться создать скрипт, воспроизводящий минимум запросов, передающий минимум данных, но получающий достаточную информацию.

Готовый набор функций, которые я часто использую
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
define("THISDIR", __DIR__);
// сетевой запрос с авторедиректом
function curl_exec_follow(&$ch, $redirects = 5) {
        global $last_curl_url;
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
        curl_setopt($ch, CURLOPT_TIMEOUT, 50);
        do {
            $data = curl_exec($ch); 
            $curl_errno = curl_errno($ch);
            if ($curl_errno > 0) {
                file_put_contents(THISDIR.'curl_error.txt','cURL Error ('.$curl_errno.'): '.curl_error($ch)." on curl ".var_export($last_curl_url,1)."\n",8);
                curl_close($ch);
                exit;
            }
            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if ($code != 301 && $code != 302)
                break;
            $header_start = strpos($data, "\r\n")+2;
            $headers = substr($data, $header_start, strpos($data, "\r\n\r\n", $header_start)+2-$header_start);
            if (!preg_match("!\r\n(?:Location|URI): *(.*?) *\r\n!", $headers, $matches))
                break;
            curl_setopt($ch, CURLOPT_URL, $matches[1]);
            $last_curl_url[] = array($matches[1]);
        } while (--$redirects);
        if (!$redirects) {
                file_put_contents(THISDIR.'curl_error.txt','Too many redirects. When following redirects, libcurl hit the maximum amount.'."\n",8);
                curl_close($ch);
                exit;                           
        }
        echo $data;
        $ah = strpos($data, "\r\n\r\n")+4;
        if ($ah<200 AND substr($data,0,21)=='HTTP/1.1 100 Continue')
        $ah = strpos($data, "\r\n\r\n", $ah)+4;
        return substr($data, $ah);
}
// прямой запрос без шапки и редиректа
function pget($url="",$add=array()) {
    //var_dump($url);
    $tmpfname = THISDIR.'cookie_parser_item.txt';
    if (!($curl = curl_init())) return NULL;
    curl_setopt($curl, CURLOPT_URL, $url);      
    curl_setopt($curl, CURLOPT_COOKIEJAR, $tmpfname);
    curl_setopt($curl, CURLOPT_COOKIEFILE, $tmpfname);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:27.0) Gecko/20100101 Firefox/27.0");
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);      
    if (isset($add['xml'])) {
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-Requested-With: XMLHttpRequest'));
    };
    if (isset($add['json'])) {
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
    };
    if (isset($add['post'])) {
        curl_setopt($curl,CURLOPT_POST, TRUE);
        curl_setopt($curl,CURLOPT_POSTFIELDS, $add['post']);
    };
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FORBID_REUSE, false);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 100);
    $data = curl_exec($curl); 
    $curl_errno = curl_errno($curl);
    if ($curl_errno > 0) {
        file_put_contents(THISDIR.'curl_error.txt','cURL Error ('.$curl_errno.'): '.curl_error($curl)."\n",8);
        curl_close($curl);
        exit;
    }
    curl_close($curl);
    return $data;
}
// сетевой запрос - основная функция
$last_curl_url = '';
function nget($url="",$add=array()) {
    //var_dump($url);
    $tmpfname = THISDIR.'cookie_parser_item.txt';
    if (!($curl = curl_init())) return NULL;
    curl_setopt($curl, CURLOPT_URL, $url);      
    curl_setopt($curl, CURLOPT_COOKIEJAR, $tmpfname);
    curl_setopt($curl, CURLOPT_COOKIEFILE, $tmpfname);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:27.0) Gecko/20100101 Firefox/27.0");
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);      
    if (isset($add['xml'])) {
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-Requested-With: XMLHttpRequest'));
    };
    if (isset($add['json'])) {
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
    };
    if (isset($add['post'])) {
        curl_setopt($curl,CURLOPT_POST, TRUE);
        curl_setopt($curl,CURLOPT_POSTFIELDS, $add['post']);
    };
    $out = curl_exec_follow($curl); 
    curl_close($curl);
    return $out;    
}
// сетевой запрос скачивающий файл
function fget($url="",$filename="") {
    if (empty($filename)) return;
    $tmpfname = THISDIR.'cookie_parser_item.txt';
    if (!($curl = curl_init())) return;
    global $last_curl_url;
    $last_curl_url = array($url);
    if (FALSE===($out = fopen($filename,"wb"))) {
        file_put_contents(THISDIR.'log_parser_item.txt',"file not open ".$filename."\n",FILE_APPEND);
        return;
    }
    curl_setopt($curl, CURLOPT_URL, $url);      
    curl_setopt($curl, CURLOPT_FILE, $out);     
    curl_setopt($curl, CURLOPT_COOKIEJAR, $tmpfname);
    curl_setopt($curl, CURLOPT_COOKIEFILE, $tmpfname);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:27.0) Gecko/20100101 Firefox/27.0");
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);      
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
    curl_setopt($curl, CURLOPT_FORBID_REUSE, false);
    curl_exec($curl);   
    curl_close($curl);
    fclose($out);
    return 1;   
}
// сетевой запрос скачивающий файл
function wget($url="",$filename="") {
    @system('wget -O '.$filename.' '.$url,$retval);
    return ($retval===0);
}
-0.50
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2017, 15:38
Ответы с готовыми решениями:

Написать программу, в которой можно было бы составлять новый рецепт, выбирая при этом ингредиенты из БД
Помогите с написанием программы! Есть таблица Ингредиент:1 код ингредиента,название,срок годности,ед.изерения.Таблица Ассортимент:...

Как написать парсер?
Есть текстовые документ settings.ini с содержанием: Как с помощью bat написать скрипт, который будет парсить значение свойств...

Как написать парсер для текста?
Ребят дан текстовый файл(например лог.txt,всего тысяча строк), внутри такая структура: номер события,код узла,номер отклонения, дата...

23
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
29.07.2017, 14:47  [ТС]
Студворк — интернет-сервис помощи студентам
Для получения списка сетевых запросов в linux удобно использовать mitmproxy, в windows - http analyzer
0
29.07.2017, 14:54

Не по теме:

Пф, в обоих операционках работает прекрасный сниффер wireshank.

А зачем создана эта тема? Самопиар?

0
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
30.07.2017, 11:46  [ТС]
запускал wireshark, к сожалению просмотр запросов в нём затруднён

тема создана, чтобы не постить один и тот же код в разных темах, что приводит к уменьшению объёма бд
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
30.07.2017, 11:51
Цитата Сообщение от plohoyav Посмотреть сообщение
запускал wireshark, к сожалению просмотр запросов в нём затруднён
Вверху в поле фильтра вводишь "http" и жмёшь Enter
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.07.2017, 11:51
Помогаю со студенческими работами здесь

Как написать парсер фотографий с сайта
Всем привет.нужн парсер фотографий с 1 сайта.Поможет кто ?

Как написать парсер математических функций?
Доброго времени суток. Хотелось бы узнать, как мне придти к тому, чтобы написать парсер математических выражений? Хочу написать оконное...

Как написать парсер Яндекс-карт?
Как вообще возможно написать парсер яндекс.карт на python? или может другие языки нужно использовать?

Как написать парсер к сайту рулетке?
Опыта в программировании 0,поэтому прошу помощи подсказать,чему нужно научиться чтобы парсить этот сайт,а именно брать информацию о...

Как написать парсер записей из группы VK?
Допустим есть группа, нужно получить всю текстовую информацию и адреса картинок из каждой записи и записать это куда нибудь в TStringList...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru