7 / 7 / 3
Регистрация: 21.03.2018
Сообщений: 204

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

09.06.2019, 11:54. Показов 6944. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru