Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89

Очень нужны дельные советы: парсить сайт

04.07.2013, 21:39. Показов 7996. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит задача вытащить из сайта все закупки, которые были сделаны за период. Я полный новичок в теме, но уже начитанный новичок Прошу подскажите какой тег нужно в брать в функции def handle_starrtag(self, tag,attrs), чтобы вытащить именно закупки с сайта? - по идеи ссылки? - но как именно те, что требуются...-подсказали обращаться через ключи (keys), но что-то расплывчато все очень. И еще дайте совет как верно подключиться к серверу нужной html-странички, прочел про класс from http.client import HTTPConnection и взял только con = HTTPConnection("http://etp.setonline.ru/app/Search/page") - но думаю это несовсем верно. Объясните кто что сможет.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! /usr/bin/env python3
 
from http.client import HTTPConnection
from html.parser import HTMLParser
 
con = HTTPConnection("http://etp.setonline.ru/app/Search/page")
 
class ZaParser(HTMLParser)
        keys = {
            'Способ закупки:':'',
            'Дата размещения:':'publishDate',
            'Дата и время окончания подачи заявок:':'endDate'
            }    
  def handle_starrtag(self, tag,attrs):
    if tag == 'A':
            print('See')
  p = ZaParser()
        p.feed(ZaParser.read())
        p.close()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2013, 21:39
Ответы с готовыми решениями:

Очень нужны советы
Добрый день. Знакомый занимается канцелярией и имеет несколько магазинов. Он решил еще открыть и сайт. Создание, наполнение и раскрутку...

Диплом, ОЧЕНЬ нужны советы
Здравствуйте. Сразу к делу, я пишу сейчас диплом на тему "Автоматическая система измерения весо-габаритных характеристик груза в...

Дайте дельные советы по выбору ПК лимит 35т
Вобщем хочу заменить почти полностью ПК от старого остается жесткий сегейт баракуда на 750гб,СД РОМ и корпус гигабайт посейдон 310....

25
 Аватар для Neketos
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 7
12.07.2013, 10:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от accept Посмотреть сообщение
если функцию вызвать два раза, то будет два открытых соединения


ты сам-то знаешь ?
ты действительно думаешь, что urlopen() какая-то нерациональная функция ?
а я и не говорил что в той моей реализации возможна отправка нескольких запросов внутри одного соединения. Вот, пожай\луйста, удовлетворяйтесь.

Python
1
2
3
4
5
6
connection = HTTPConnection("etp.setonline.ru")
def getResponseHTML():
    global connection
    connection.request("GET","/app/Search/page")
    response = connection.getresponse().read().decode()
    return response
Если сможете предложить подобную реализацию на урлопен, с удовольствием посмотрю, потому что мне хватило HTPPConnection, я в urlopen не понял как такое можно сделать. По работе приходитс заниматься разработкой сетевых приложений. Причина в том, что портов не так много свободных. И знаете, за то время, что нужно для освобождения порта, (даже после взова close() он не освободится, почитайте доки по системе) можно с легкостью их все занять и работа приложений остановится.

Поэтому я и привык к HTTPConnection. Есть все, что необходимо для http запроса
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.07.2013, 12:01
Цитата Сообщение от Neketos Посмотреть сообщение
Вот, пожай\луйста, удовлетворяйтесь.
не могу, ты всё так же не закрыл соединение, потому что не знаешь, что сокет будет висеть из-за этого

Цитата Сообщение от Neketos Посмотреть сообщение
Если сможете предложить подобную реализацию на урлопен
то, что ты имеешь в виду, я понял; я спрашиваю, какое преимущество это даст в текущем задании ?
даже при скачивании сотни страниц ты не заметишь разницы

да, и раскодируешь ты неправильно, кодировку она не определяет автоматом, её нужно извлекать из ответа
0
 Аватар для Neketos
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 7
12.07.2013, 12:30
я просто на автомате воспользовался HTTPConnection. А соединение пусть висит,пока не закончит работать скрипт или не отправлю новый запрос или не отвалится по времени. На работе приходится отправлять много запросов, весной начало отваливаться по числу открытых портов.Поэтому и пришлось думать чтобы запросы были внутри одного соединения, сокета.

Зарыть можно в любой момент, я писал пример парсера, а не полностью рабочего приложения, соединение можно закрыть в любой момент и любом местеcили открыть новое соединение.

По поводу кодировки да, согласен, придется определять из заголовка, в отличие от автоматическиэто выполняющего urllib. Но был однажды случай при написании парсера для сайта, на котором часть html была в utf-8, а другая часть в cp-1251. Бывает всяко.

К тому же, в ряде фирм политика безопасности такова, что доступно только несколько портов для работы, и распыляться ими бессмысленно. Я говорил не о текущем задании, а в общем, на будущее так сказать
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.07.2013, 12:50
Цитата Сообщение от Neketos Посмотреть сообщение
А соединение пусть висит
либо ты его один раз открываешь, потом делаешь запросы, потом один раз закрываешь
либо ты его открываешь каждый раз, делаешь запрос, закрываешь каждый раз

Цитата Сообщение от Neketos Посмотреть сообщение
На работе приходится отправлять много запросов
если это нужно оптимизировать, то должна быть открывающая часть, отправляющая часть и закрывающая часть (всё в одном классе описывается)

Цитата Сообщение от Neketos Посмотреть сообщение
Зарыть можно в любой момент
не, после работы функции объект теряется и остаётся висеть, пока сокет сам не закроется; а когда он закроется ? правильно, спустя какое-то время, а оно может не успеть наступить, если делается много повторных открытий

Цитата Сообщение от Neketos Посмотреть сообщение
Но был однажды случай при написании парсера для сайта, на котором часть html была в utf-8, а другая часть в cp-1251.
в заголовках ответа есть кодировка; если там нет, то в странице; если там нет, то ситуация должна осознанно обрабатываться

Цитата Сообщение от Neketos Посмотреть сообщение
в отличие от автоматическиэто выполняющего urllib
это где ?

Цитата Сообщение от Neketos Посмотреть сообщение
К тому же, в ряде фирм политика безопасности такова, что доступно только несколько портов для работы, и распыляться ими бессмысленно.
оптимизация нужна только в плане того, что открытие сокета - это системный вызов, требующий времени (даже не памяти)
0
 Аватар для Neketos
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 7
12.07.2013, 13:22
Или я вас не понимаюили вы меня((

я же сказал, почему я привык использовать HTTPConnection. Когда заканчиваются свободные порты, вываливаются exception, работа останавливается пока не освободится порт. А что касается реализации, думаете я не понимаю о чем пишу? вот вам тривиальный пример

Python
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
#! /usr/bin/env python3
 
from http.client import HTTPConnection
from pprint import pprint
import time
 
class test(object):
    conn = HTTPConnection
    SERVER = "yandex.ru"
    def __init__(self):
        self.conn = HTTPConnection(self.SERVER)
 
    def closeconn(self):
        self.conn.close()
 
    def response(self,request):
        resp = ""
        j = 0
        while (resp == "" and j < 3):
             try:
                j+=1
                self.conn.request("GET",request)
                response = self.conn.getresponse()
                resp = response.read().decode("utf-8")
             except Exception as error:
                pprint(error)
                self.conn.close()
                time.sleep(5)
                self.conn = HTTPConnection(self.SERVER)
                continue
        return resp
 
t = test()
for i in range(0,3):
    print(t.response("/"))
t.closeconn()
Bash
1
2
netstat | grep yand
tcp        0      0 nikita.l:50309 yandex.ru:http          TIME_WAIT
все в переделах одного сокета, порта, порт очень скоро высвободится и можно будет снова использовать его если потребуется. даже вызвав close() порт какое-то время будет занят и ожидать, особенность системы. В /proc убунты можно подправить это время.

в отличие от трех возможных.

В случае ошибки просто открываю новое соединение и не парюсь.

Или реализация оч плоха?
1
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
13.07.2013, 07:52
Цитата Сообщение от Neketos Посмотреть сообщение
TIME_WAIT
если не закрыть соединение, может остаться ESTABLISHED

Python
1
2
3
4
5
6
7
8
9
10
import http.client
 
def f():
    conn = http.client.HTTPConnection('www.yandex.ru', 80)
    conn.connect()
    conn.request('GET', '/')
    input()
    conn.close()
 
f()
до .close() соединение установлено (ESTABLISHED), после .close() оно переходит в TIME_WAIT либо закрывается сразу
если .close() нет, оно может остаться ESTABLISHED даже после вызова функции
закрытие сокета выполняется сборщиком мусора, походу, потому что в C сокет остаётся висеть, если его не закрыть (на сборщик мусора полагаться нельзя)

Добавлено через 22 минуты
Цитата Сообщение от Neketos Посмотреть сообщение
Или реализация оч плоха?
с точки зрения алгоритма, нужно сделать один запрос-ответ, а потом запускать его и отлавливать в нём ошибки в отдельном методе (вспомогательные методы начинаются с подчёркиваний)

с точки зрения питона, много ошибок
почитай http://www.python.org/dev/peps/pep-0008/

Цитата Сообщение от Neketos Посмотреть сообщение
Python
1
class test(object):
в третьем питоне это записывается проще
Python
1
class Test:
с точки зрения интерфейсов, писать надо сверху вниз, начиная с функции
Цитата Сообщение от Neketos Посмотреть сообщение
Python
1
2
3
4
t = test()
for i in range(0,3):
    print(t.response("/"))
t.closeconn()
вот содержимое функции, с которого надо начинать до написания класса
тогда бы ты увидел, что при создании класса в него подаются сервер и порт, правильно бы запустил его (может, нужно ручное соединение), вызвал бы метод, который отвечает за всю передачу, подал бы в него последовательность запросов, проверил, как он работает

а так получился класс - ни рыба, ни мясо
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.07.2013, 07:52

Оцените сборки, дельные советы - плюсик к в карму
Есть две сборки, над которыми размышляю. Различие в цене минимальное. Любые советы, подводные камни, может что-то избыточно или наоборот,...

Очень нужны ваши советы по программе-справочнике!
Доброго времени суток. Необходимо сделать проект - программу справочник. Выглядеть она должна примерно так: Слева будет список всех...

Сборка ПК (ДНС, 80-120к), очень нужны советы
Всем добрейшего времени суток. В связи с тем, что последний раз я обновлял комп 10 лет назад, то вынужден просить помощи у более...

Очень нужны советы по решение, Кривошип, вращение
Здравствуйте. Подскажите мне, мне нужно решить эту задачу, я а даже не знаю с чего начать. Дайте пожалуйста советы по решению как...

Нужны советы по HTML сайтику ( очень простой - без css js flash).
Друзья, нам на учебе задали сделать свои простенький HTML сайт ( без css, js ,flash). Тупо HTL страницы. Как бы главная и еще 5 разделов....


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru