Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
7 / 7 / 3
Регистрация: 21.03.2018
Сообщений: 204

Обход списка сайтов

09.06.2019, 11:54. Показов 6929. Ответов 25

Студворк — интернет-сервис помощи студентам
Если кому не трудно посмотрите , кто знает подскажите,
имеется файл список сайтов (названия сгенерированы лексическим генератором слов ),
тут часть файла
i.txt


Следующим скриптом пытаюсь перебрать этот список , что бы получить по каждому имени есть сайт или нету и если есть то получить от него <title>, или хотя бы если есть подключение по данному имени вывести хотя бы HEDER

Кликните здесь для просмотра всего текста
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
import requests
from html.parser import HTMLParser
 
class MyHTMLParser(HTMLParser):
 
    def handle_endtag(self, tag):
        if tag == 'title':
            raise StopIteration()
 
    def handle_data(self, data):
        self.title = data
 
for url in open('i.txt').readlines():
   try:
      r = requests.get(url.strip(), stream=True)
      data = next(r.iter_content(1024))
      parser = MyHTMLParser()
      sdata = data.decode(r.encoding)
      try:
          parser.feed(sdata)
          with open('out.txt', 'a', encoding='utf-8') as f:
              print(f'{url.strip()} {parser.title}', file=f)
      except StopIteration:
          with open('out.txt', 'a', encoding='utf-8') as f:
              print(f'{url.strip()} Какая то ошибка', file=f)
   except requests.exceptions.ConnectionError:
       with open('out.txt', 'a', encoding='utf-8') as f:
           print(f'{url.strip()} В соединении отказано', file=f)


скрипт работает , но как то не правильно , после каждого запуска на выходе от 2-3 записей в выходном файле до 40 - 45 примерно так

out.txt
Кликните здесь для просмотра всего текста
http://icw.ru

http://icx.ru Какая то ошибка
http://icy.ru В соединении отказано
http://icz.ru Какая то ошибка
http://ic1.ru Какая то ошибка
http://ic2.ru Какая то ошибка
http://ic3.ru

http://ic4.ru В соединении отказано
http://ic5.ru

http://ic6.ru Какая то ошибка
http://ic7.ru Какая то ошибка
http://ic8.ru В соединении отказано
http://ic9.ru Какая то ошибка
http://ic0.ru Какая то ошибка
http://ida.ru Какая то ошибка
http://idb.ru Какая то ошибка
http://idc.ru Какая то ошибка
http://idd.ru Какая то ошибка
http://ide.ru В соединении отказано
http://idf.ru В соединении отказано
http://idg.ru Какая то ошибка
http://idh.ru В соединении отказано
http://idi.ru Какая то ошибка
http://idj.ru Какая то ошибка
http://idk.ru Какая то ошибка
http://idl.ru Какая то ошибка
http://idm.ru Какая то ошибка
http://idn.ru Какая то ошибка
http://ido.ru Какая то ошибка
http://idp.ru Какая то ошибка
http://idq.ru Какая то ошибка
http://idr.ru В соединении отказано
http://ids.ru Какая то ошибка
http://idt.ru Какая то ошибка
http://idu.ru В соединении отказано
http://idv.ru Какая то ошибка
http://idw.ru Какая то ошибка
http://idx.ru В соединении отказано
http://idy.ru В соединении отказано
http://idz.ru В соединении отказано
http://id1.ru В соединении отказано

тут где пустые строки должны быть как минимум имена сайтов , нету почему то не пишется

Вопрос в следующем что тут не так ?
Помогите кто может
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.06.2019, 11:54
Ответы с готовыми решениями:

Обход списка в обратном порядке
a = len(rez1 - 1) for i in range(a,-1,-1): print (rez1) При запуске кода выдает ошибку. TypeError: unsupported operand type(s)...

Обход элементов списка и их вывод
Всем доброго времени суток, уважаемые форумчане! Разбираюсь с Python'ом, даётся не так просто, как хотелось бы. Решая одну из стандартных...

Обход блокировки сайтов
Почему прокси не помогают обойти блокировки сайтов. Перепробовал много проксей, разные публичные DNS - все бестолку. Провайдер упорно...

25
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
12.06.2019, 09:12
Студворк — интернет-сервис помощи студентам
Ты хоть логи подробнее писал бы, чтобы точно знать на каком сайте скрипт упал. Моё наиболее вероятное предположение, что на одном из сайтов опечатка:
HTML5
1
<meta charset="urf-8">
Добавлено через 3 минуты
И вообще давно пора запилить многопоточность: запустить сотню воркеров и пусть они пытаются установить соединения (которые чаще всего отваливаются по таймауту). И если на http-запрос всё-таки ответили, то как минимум писать код ответа в лог, например для http://gat.ru/ это 403.
1
7 / 7 / 3
Регистрация: 21.03.2018
Сообщений: 204
12.06.2019, 09:58  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Ты хоть логи подробнее писал бы, чтобы точно знать на каком сайте скрипт упал.
да я полностью согласен , подскажите как прикрутить логирование , я сейчас просто глазами руками смотрю и через браузер открываю сайты на которых произошел затык,

Добавлено через 13 минут
Рыжий Лис, тут еще такой момент , этих сайтов не существует , вернее когда я беру название сайта из входного списка то не известно вообще есть ли такой сайт, и мне не важно ошибка там или чего , главное получить <title> или пройти дальше, ну а если кроме пустоты будет еще че нибудь , то вообще шикарно.

Добавлено через 2 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
И вообще давно пора запилить многопоточность:
это что то новенькое , а когда в Python сделали поддержку многопоточности ?

Добавлено через 2 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
запустить сотню воркеров и пусть они пытаются установить соединения (которые чаще всего отваливаются по таймауту).
вот тогда меня точно блокирует и провайдер и каждый более менее стоящий сайт
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
12.06.2019, 11:07
Цитата Сообщение от project2pro Посмотреть сообщение
подскажите как прикрутить логирование
Для принтов навтыкать. Или так:

https://docs.python.org/3/libr... asicConfig
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import logging
 
log = logging.getLogger(__name__)
 
def main():
    log.debug('сайт1')
    try:
        log.info('для сайта сайт1 получен тайтл=заголовок')
        raise NotImplementedError('oops')
    except:
        log.exception('fail')
 
if __name__ == '__main__':
    logging.basicConfig(filename='log.log', level=logging.DEBUG)
    main()
Содержимое лога:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
DEBUG:__main__:сайт1
INFO:__main__:для сайта сайт1 получен тайтл=заголовок
DEBUG:__main__:сайт1
INFO:__main__:для сайта сайт1 получен тайтл=заголовок
ERROR:__main__:fail
Traceback (most recent call last):
  File "1.py", line 12, in main
    raise NotImplementedError('oops')
NotImplementedError: oops


Цитата Сообщение от project2pro Посмотреть сообщение
когда в Python сделали поддержку многопоточности ?
Всегда была? Пример с очередью и воркерами: https://docs.python.org/3/libr... Queue.join

Цитата Сообщение от project2pro Посмотреть сообщение
вот тогда меня точно блокирует и провайдер и каждый более менее стоящий сайт
Вам уже объясняли: нет, не заблокирует. Провайдер без разницы, что вы делаете много запросов, а один запрос к сайту эт мелочь.
1
7 / 7 / 3
Регистрация: 21.03.2018
Сообщений: 204
12.06.2019, 12:21  [ТС]
Рыжий Лис, ок понял , спасибо за терпение , логирование сейчас прикручу , многопоточностью займусь уже наверное завтра, просто я не давно читал что это не многопоточность а псевдомногопоточность, то есть все равно все выполняется в одном потоке python ,
ну это ладно разбираться буду завтра
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.06.2019, 14:45
Цитата Сообщение от project2pro Посмотреть сообщение
росто я не давно читал что это не многопоточность а псевдомногопоточность, то есть все равно все выполняется в одном потоке python
Неверно.
Если запущено несколько потоков, каждая задача выполняется в своем потоке, поскольку потоки нативные, то есть самой ОС. Однако в Python и Ruby есть такая штука как GIL - глобальная блокировка и она не дает Python коду из разных потоков выполняется параллельно на разных ядрах процессора.
Принцип работы прост. Потоки удерживают GIL, пока выполняются. Однако они освобождают его при блокировании для операций ввода-вывода. Каждый раз, когда поток вынужден ждать, другие, готовые к выполнению, потоки используют свой шанс запуститься.
Для запросов на сайт блокировка GIL не делает погоды, поскольку основные временные затраты - это ожидание ответа от сервера (то есть IO-bound задача), а не его получение. И поскольку GIL 'освобождается', когда поток ожидает, другой поток получает возможность сделать запрос и уйти также в ожидание и т.д. для всех остальных. В итоге все потоки\задачи ожидают одновременно (в отличие от синхронного однопоточного кода, когда каждая задача будет ожидать пока полностью не выполнится предыдущая) и экономия времени\прирост производительности получается не хуже, чем если запустить многопроцессный код на разных ядрах.
Разумеется для вычислительных CPU-bound задач GIL все меняет и не дает возможности потокам ускорить выполнение.
Поэтому для таких задач используют уже исключительно многопроцессность.
А для IO-задач есть еще асинхронная модель выполнения (основанная на кооперативной многозадачности), которая в Python существует начиная с 3.4.
1
7 / 7 / 3
Регистрация: 21.03.2018
Сообщений: 204
13.06.2019, 02:08  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
есть такая штука как GIL - глобальная блокировка
вот точно я про это как раз и читал ...
спасибо еще раз за разъяснения сейчас занимаюсь изучаю этот вопрос,
ну а пока в одном потоке нашел вот такую штуку
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from bs4 import BeautifulSoup
import requests
 
 
def save(site, title):
    with open('out/outMySpider.txt', 'a', encoding='utf-8') as f:
        print(f'{site} |---> {title}', file=f)
 
 
title = ''
for site in open('db/l.txt').readlines():
    url = 'http://' + site.strip() + '.ru'
    try:
       res = requests.get(url, timeout=5)
       content = BeautifulSoup(res.content, "html.parser")
       title = content.find_all('title')
       save(url, title)
    except:
       save(url, 'ошибка')
Добавлено через 10 минут
только вот иногда , видать на каких то строках спотыкается и на консоль выплевывает вот такое
/usr/bin/python3.7 /home/vova/PycharmProjects/ОбрСпискаСайтов/myspider.py
Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
Добавлено через 3 часа 3 минуты
Всем большущее спасибо за участие все подсказки учел и работаю над этим , если кому интересно открываю новую тему как продолжение этой , а то это уже не удобно читать и теряется первоначальная цель-вопрос
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.06.2019, 02:08

Обход блокировки сайтов
Как обойти блокировку сайтов на работе? Соединение по кабелю через прокси сервер и при первом переходе спрашивает имя пользователя и...

Обход блокировки сайтов
как не странно все хотят заблокировать сайты... (судя по поиску) у меня же наоборот. у нас в НПР какая то черная политика идет, как я...

Обход выбора из списка
Здравствуйте товарищи, в чём заключается вопрос. Созданы документ и справочник, документ заполняется данными из экселя в табличную часть,...

Обход списка с двух концов
Еcть список '(1 2 3 4 5 6 7 8 9 10) Обходя список с начала и с конца, найти число 5 в нем.

Реализовать обход списка фруктов
Помогите с обходом списка. Обьясняю есть список допустим банан апельсин папайя магазин id=2 манго магазин id=1 яблоко ...


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

Или воспользуйтесь поиском по форуму:
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