Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python: Сети
Войти
Регистрация
Восстановить пароль
 
mmm_corp
Эксперт Pascal/Delphi
101 / 89 / 32
Регистрация: 30.05.2015
Сообщений: 576
1

Windows, AsyncHTTP, странное поведение

22.07.2019, 08:43. Просмотров 258. Ответов 0

задача: прочекать список сайтов на предмет что они живые
казалось бы... что тут сложного, упустим что здесь список короткий для наглядности (на самом деле он громадный), пошустрив в гугле нашол что нужно, и на async/await, ладно думаю, надо юзать, модно, молодёжно

код:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python3
# areq.py
 
"""Asynchronously get links embedded in multiple pages' HMTL."""
# https://habr.com/ru/post/314606/
 
import os
# os.environ['PYTHONASYNCIODEBUG'] = '1'
 
import asyncio
import concurrent
import logging
import re
import sys
from typing import IO
import urllib.error
import urllib.parse
 
import aiofiles
import aiohttp
from aiohttp import ClientSession
 
logging.basicConfig(
    format="%(asctime)s %(levelname)s:%(name)s: %(message)s",
    level=logging.DEBUG,
    datefmt="%H:%M:%S",
    stream=sys.stderr,
)
logger = logging.getLogger("areq")
logging.getLogger("chardet.charsetprober").disabled = True
 
HREF_RE = re.compile(r'href="(.*?)"')
 
 
async def fetch_html(url: str, session: ClientSession, **kwargs) -> str:
    """GET request wrapper to fetch page HTML.
 
    kwargs are passed to `session.request()`.
    """
 
    resp = await session.request(method="GET", url=url, timeout=30, **kwargs)
    resp.raise_for_status()
    logger.info("Got response [%s] for URL: %s", resp.status, url)
    html = await resp.text()
    return html
 
 
async def parse(url: str, session: ClientSession, **kwargs) -> set:
    """Find HREFs in the HTML of `url`."""
    found = set()
    try:
        html = await fetch_html(url='http://' + url, session=session, **kwargs)
    except (
            concurrent.futures._base.TimeoutError,
            aiohttp.ClientError,
            aiohttp.http_exceptions.HttpProcessingError,
    ) as e:
        # logger.error(
        #     "aiohttp exception for %s [%s]: %s",
        #     url,
        #     getattr(e, "status", None),
        #     getattr(e, "message", None),
        # )
        return found
    except Exception as e:
        logger.exception(
            "Non-aiohttp exception occured:  %s", getattr(e, "__dict__", {})
        )
        return found
    else:
        # pass
        for link in HREF_RE.findall(html):
            try:
                abslink = urllib.parse.urljoin(url, link)
            except (urllib.error.URLError, ValueError):
                logger.exception("Error parsing URL: %s", link)
                pass
            else:
                found.add(abslink)
        # logger.info("Found %d links for %s", len(found), url)
        return found
 
 
async def write_one(file: IO, url: str, **kwargs) -> None:
    """Write the found HREFs from `url` to `file`."""
    res = await parse(url=url, **kwargs)
    if not res:
        return None
    async with aiofiles.open(file, "a") as f:
        for p in res:
            await f.write(f"{url}\t{p}\n")
        # logger.info("Wrote results for source URL: %s", url)
 
 
async def bulk_crawl_and_write(file: IO, urls: list, **kwargs) -> None:
    """Crawl & write concurrently to `file` for multiple `urls`."""
    async with ClientSession() as session:
        tasks = []
        for url in urls:
            tasks.append(
                write_one(file=file, url=url, session=session, **kwargs)
            )
        await asyncio.gather(*tasks)
 
 
# async def run():
#     try:
#         await asyncio.wait_for(bulk_crawl_and_write(file=outpath, urls=urls), timeout=5)
#     except asyncio.TimeoutError:
#         pass
#         # p.kill()
#         # await p.communicate()
#
 
if __name__ == "__main__":
    import pathlib
    import sys
 
    assert sys.version_info >= (3, 7), "Script requires Python 3.7+."
    here = pathlib.Path(__file__).parent
 
    # with open(here.joinpath("urls.txt")) as infile:
    with open(here.joinpath(r"all_data.txt")) as infile:
        urls = list(map(str.strip, infile))
        # urls = set(map(str.strip, infile))
 
    outpath = here.joinpath("foundurls.txt")
    # with open(outpath, "w") as outfile:
    #     outfile.write("source_url\tparsed_url\n")
 
    asyncio.run(bulk_crawl_and_write(file=outpath, urls=urls))
    # asyncio.wait_for(bulk_crawl_and_write(file=outpath, urls=urls), timeout=5)
    # run()
    logger.info('The end...')
сам файл all_data.txt
Кликните здесь для просмотра всего текста
google.com
0000.aero
011101110111011101110111.aero
0degrees.aero
1-sim.aero
10g.aero
11eleven.aero
172.aero
1800iflybwi.aero
1h.aero
1i.aero
1j.aero
1k.aero
1l.aero
1m.aero
1n.aero
1p.aero
1q.aero
1r.aero
1s.aero
1st.aero
1time.aero
1v.aero
1y.aero
1z.aero
206.aero
2a.aero
2b.aero
2c.aero
2d.aero
2e.aero
2f.aero
2g.aero
2h.aero
2j.aero
2k.aero
2ka-tech.aero
2l.aero
2m.aero
2n.aero
2p.aero
2q.aero
2r.aero
2u.aero
2v.aero
2w.aero
ns01.2x0gjygo.aero
2y.aero
2z.aero
319cj.aero
360.aero
ukr.net
365parts.aero
3a.aero
3b.aero
3c.aero
3d.aero
3db.aero
3e.aero


ну и requirements.txt для полноты картины
Кликните здесь для просмотра всего текста
tqdm
colorama
workerpool

# loginform

selenium
# optparse
easyargs

requests==2.22.0
beautifulsoup4==4.7.1

# xlrd == 1.2.0
# pandas==0.24.2


# psycopg2

gevent

asyncio
aiohttp
aiofiles


код работает всьо ок, но странно что под windows он крайне непотяно тупит то при запуске, то перед завершением, то невыдает результатов, при том используя docker
Кликните здесь для просмотра всего текста
FROM python:3.7-slim

ARG ssh_prv_key
ARG ssh_pub_key

RUN apt-get update && \
apt-get install -y \
git \
openssh-server
# libmysqlclient-dev

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
chmod 0700 /root/.ssh && \
ssh-keyscan github.com > /root/.ssh/known_hosts

# Add the keys and set permissions
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \
echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub && \
chmod 600 /root/.ssh/id_rsa && \
chmod 600 /root/.ssh/id_rsa.pub


WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
#COPY test.py all_data.txt

CMD [ "python", "./test.py" ]



результат стабилен как надо
серв конечно будет на никсах, но мне совершенно не ясно а что не так с аснхронщиной под виндой, может что с кодом не так???
Python 3.7.3

вот все файлы в одном архиве для удобства: https://dropmefiles.com/BOhKR
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2019, 08:43
Ответы с готовыми решениями:

Странное поведение IDE
Совсем новичок в питоне, да и в целом в программировании. Ситуация такая: вчера игрался с отправкой...

Странное поведение при работе с массивами
Здравствуйте! Есть код - from tkinter import Tk, Canvas arr = *10]*10 print(arr) def...

Странное поведение Windows XP
Начиная с некоторого времени, Windows XP вдруг стал себя вести более, чем странно. Например, при...

Странное поведение под Windows
Добрый день, всем кто знает, и всем кто пытается узнать. Проблема мелкая, но противная. Мучаюсь...

Странное поведение Сна Windows 7
Странное поведение Сна. Сон срабатывает если выставить значение на 1 минуту. Если это значение 2,3...

0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2019, 08:43

Странное поведение listBox.SelectedValue. К полученному значению добавляется system.windows.controls.listboxitem
Почему после listBox7.SelectedValue.ToString() к возвращаемому значению приписывается...

Странное поведение
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого...

Странное поведение
Собственно, сабж: http://www.cyberforum.ru/attachment.php?attachmentid=272592&stc=1&d=1369472568 ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru