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

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

09.06.2019, 11:54. Показов 7108. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru