Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

Извлечение домена из ссылки и поиск ссылок по имени домена

#python #парсер #url #urllib


Задача стоит такая:


Сверка ссылок по домену(*) из TXT №2 с TXT №1
Сохранение уникальны ссылок в отдельный TXT №3
Добавление уникальных ссылок в TXT №1


При сверке по  доменам - идет сверка только доменов сайта без: http:// и без https://
, так же при сверке по домену не учитывается все что после доменной зоны (.com , .ru
, и т.п.)

Я разделил программу на подзадачи и написал код на python 3.8:
Подзадачи: 

Исходные данные:

1.txt

http://site.com/
https://sit1e.com/vwdsvdfw/vwdefei/userpanel?cid=2
https://site.com/index.php?id=1
http://sit2e.com/
http://site.com/vwifow/fwviiwf?

2.txt

http://site.com/
https://sit1e213.com/vwdsvdfw/vwdefei/userpanel?cid=2
https://site.com/index.php?id=1
http://sit222e.com/
http://site.com/vwifow/fwviiwf?


1) Достать домены:

import re

f1 = open('1.txt')
f2 = open('2.txt')

filevar1 = f1.read()
filevar2 = f2.read()

domains1 = re.findall(r'\/\/([\w\-]+)', filevar1) 
domains2 = re.findall(r'\/\/([\w\-]+)', filevar2)

#Вывод доменов с новой строки 

with open('domains1.txt','w') as out:
    for domen in domains1:
        print(domen,file=out)
with open('domains2.txt','w') as out:
    for domen in domains2:
        print(domen,file=out)

f1.close()
f2.close()

input('Нажмите Enter, чтобы выйти из программы')


Результат работы участка кода:

domains1.txt

site
sit1e
site
sit2e
site

domains2.txt

site
sit1e213
site
sit222e
site


2) Сравнить домены:

import re

def diff():
    with open('result1.txt') as text_one, \
            open('result2.txt') as text_two:
        return set(text_one) ^ set(text_two)
if __name__ == '__main__':
    with open('output.txt', 'w') as result:
        for i in diff():
            result.write(i)

input('Нажмите Enter, чтобы выйти')


Выходные данные:

output.txt

sit1e
sit2e
sit1e213
sit222e


3) Найти исходные строки по выделенным доменам в исходных файлах и записать их в
отдельный файл.
с этим возникают проблемы. Не знаю какую регулярную функцию использовать.

PS: пока искал ответ на свой вопрос, то заметил, что моя программа не учитывает субдомены,
вроде для этого уже существует специальная функция в python: urlparse, но я не могу
понять как ее использовать.

Можно ли как-то сократить код программы, чтобы не писать 3-й блок программы?
Можно-ли реализовать эту задачу проще?
    


Ответы

Ответ 1



Для чтения доменов из файлов со ссылками можно использовать следующую функцию: from urllib.parse import urlparse def get_domains(filename): with open(filename) as f: return ['.'.join(urlparse(line.strip()).netloc.split('.')[:-1]) for line in f] Проверка: dom1 = get_domains(r'C:\temp\1.txt') dom2 = get_domains(r'C:\temp\2.txt') print(dom1) # ['site', 'sit1e', 'site', 'sit2e', 'site'] print(dom2) # ['site', 'sit1e213', 'site', 'sit222e', 'site'] Работа со списками доменов как со множествами - объединение, пересечение, симметрическая разность: In [31]: set(dom1) | set(dom2) Out[31]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e', 'site'} In [32]: set(dom1) & set(dom2) Out[32]: {'site'} In [33]: set(dom1) ^ set(dom2) Out[33]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e'} Поиск ссылок по списку доменов: import re def search_domains(filename, doms): with open(filename) as f: text = f.read() pat = r'(https?://[^./\r\n]*?\b(?:{})\b[^\r\n]*)'.format('|'.join(doms)) return re.findall(pat, text) Проверка: In [47]: doms = set(dom1) ^ set(dom2) In [48]: doms Out[48]: {'sit1e', 'sit1e213', 'sit222e', 'sit2e'} In [49]: search_domains(r'C:\temp\1.txt', doms) Out[49]: ['https://sit1e.com/vwdsvdfw/vwdefei/userpanel?cid=2', 'http://sit2e.com/'] In [50]: search_domains(r'C:\temp\2.txt', doms) Out[50]: ['https://sit1e213.com/vwdsvdfw/vwdefei/userpanel?cid=2', 'http://sit222e.com/'] PS с записью результатов в файл я думаю вы справитесь сами.

Комментариев нет:

Отправить комментарий