Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/39: Рейтинг темы: голосов - 39, средняя оценка - 4.95
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89

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

04.07.2013, 21:39. Показов 7898. Ответов 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 / 3288 / 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 / 3288 / 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 / 3288 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru