1

Тема: Потрібна допомога у створенні парсеру посилань

Почав вивчати пітончик, і віришив створити власний парсер посилань, щоб вивчити основи пітону. Для себе я склав план і взявся за його реалізацію. Отже, для початку я створив на локалці тестову карту вебсайту, яка містить кілька посилань. І ось мій план
1. Регуляркою зібрати посилання і записати у файл.
2. Дописати посилання у файл викидаючи ті що повторюються
3...
4...
Далі логіка парсера мені ндо кінця не зрозуміла ,але це чудова практика і надіюсь, що знавці пітону допоможуть мені розібратись в ньому і вкажуть на мої помилки.
Кажу відразу, я лише почав вивчати Python ,тому сильно не кидайтес ьв мене каміням. У мене получився такий код для 1 параграфу

import re
import urllib.request

html = urllib.request.urlopen('http://localhost/parser/map.php') # Парсимо сторінку

html = str(html.read())  # Якщо не перевести у str видає помилку

url_compile = re.compile('http://[\w\.\/]+')
urls = str(url_compile.findall(html)) # Чому потрібно переводити у str, до список не хоче записатись у файл

file = open('new.txt', 'a')
for line in urls:
    file.write(line) # записуємо результат
print('ok')
file.close()

Отже в результаті парсингу ми отримуємо такий код який записується у зміну html =

b'<!DOCTYPE html>\r\n<html>\r\n<head>\r\n\t<title>Map of site</title>\r\n</head>\r\n<body>\r\n<p><a href="http://localhost/parser/index.php">Home page</a></p>\r\n<p><a href="http://localhost/parser/page2.php">Page 2</a></p>\r\n<p><a href="http://localhost/parser/page3.php">Page 3</a></p>\r\n<p><a href="http://localhost/parser/page4.php">Page 4</a></p>\r\n<p><a href="http://localhost/parser/page5.php">Page 5</a></p>\r\n</body>\r\n</html>'

у файл потрапляє такий код

['http://localhost/parser/index.php', 'http://localhost/parser/page2.php', 'http://localhost/parser/page3.php', 'http://localhost/parser/page4.php', 'http://localhost/parser/page5.php']['http://localhost/parser/index.php', 'http://localhost/parser/page2.php', 'http://localhost/parser/page3.php', 'http://localhost/parser/page4.php', 'http://localhost/parser/page5.php']

Тепер запитання. Чому код йде у такому вигляді ['посилання', 'посилання', 'посилання']
Як його записати у файл в такому вигляді
посилання
посилання

Якщо я запускаю скрипт ще раз, він знову записує такий самий список ['посилання', 'посилання', 'посилання'], як зробити щоб просто дописувалось у файл?
Як зробити перевірку, щоб видалити однакові посилання? Надіюсь, зміг усе детально і зрозуміло вам пояснити

2

Re: Потрібна допомога у створенні парсеру посилань

Кажу відразу, я лише почав вивчати Python ,тому сильно не кидайтес ьв мене каміням. У мене получився такий код для 1 параграфу

Якщо ви лише почали вивчати пайтон, то не кидайтеся одразу на регулярні вирази, котрі вам зовсім не знайомі. А сайт парсити леше за допомогою ліб з підтримкою DOM

3

Re: Потрібна допомога у створенні парсеру посилань

Справа не в тому ,в чому легше, мені головне практика, практика і ще раз практика, а парсинг дасть змогу вивчити різні аспекти та навчитись складати алгоритми.
Регулярні вирази учу паралельно по книзі Ben Forta - Regular Expressions in 10 Minutes (Teach Yourself)
Там доволі проста та зрозуміла книга.
По пітону переглянув вдео від Лінди, а зараз знайшов доволі цікаву книгу
Violent Python - A Cookbook for Hackers, Forensic Analysts, Penetration Testers and Security Engineers Рекомендую її усім любителям пітончика

4

Re: Потрібна допомога у створенні парсеру посилань

urls - це список. Замість перетворювати його на рядок зробіть отак:

urls = url_compile.findall(html)
 
with open('new.txt', 'a') as fp:
    for el in urls:
        fp.write(el+'\n') # записуємо кожен урл окремо

А взагалі, вам же хочеться колекцію, щоб у файлі не було повторів. Можна використати модуль shelve.

І ще момент: в урлах можливі різні знаки - у вас регулярка не все враховує.

5

Re: Потрібна допомога у створенні парсеру посилань

З цим ніби я розібрався. Тепер наступне запитання, як робляться переходи по посиланнях. Тобто, як зробити, щоб скрипт перейшов на іншу сторінку і почав її парсити?