Поисковый робот на Python

Поисковый робот на Python

Данная программа будет полезна тем, что научит вас создавать простейших поисковых роботов на Python. Они могут применяться с разными целями - создание собственных поисковых систем, поиск по диапазону IP определённых сайтов, либо обнаружение веб-мордочек каких-то сервисов в подсети крупных организаций. Сперва, приведу полностью весь код программы, а далее объясню каждую её часть.

import socket
import sys
import re
import urllib.request

def undotIPv4 (dotted):
    return sum (int (octet) << ( (3 - i) << 3) for i, octet in enumerate (dotted.split ('.') ) )

def dotIPv4 (addr):
    return '.'.join (str (addr >> off & 0xff) for off in (24, 16, 8, 0) )

def rangeIPv4 (start, stop):
    for addr in range (undotIPv4 (start), undotIPv4 (stop) ):
        yield dotIPv4 (addr)

print ("Поиск веб сайтов и веб мордочек в заданном диапазоне IP")
print ("У найденных ресурсов будет показан тег title")
print ("--------------------------------")
a = input("Введите начальный адрес IP диапазона: ")
b = input("Введите конечный адрес IP диапазона: ")
print ("--------------------------------")

for x in rangeIPv4 (a, b):
    s = socket.socket()
    s.settimeout(1)
    try:
        s.connect((x, 80))
    except socket.error:
        pass
    else:
        s.close
        try:
            doc = urllib.request.urlopen("http://"+x).read().decode('utf-8',errors='ignore')
            match = re.search( "<title>(.*)</title>", doc )
            if not(match is None):
                print (x + ": " + match.group())
                print ("----------")
        except Exception:
            pass

print ("--------------------------------")
print ("Процесс завершен")
Сперва мы импортируем нужные нам модули
import socket
import sys
import re
import urllib.request
Обратите внимание на модуль re - он нужен для использования в программе регулярных выражений. Прежде чем робот начнёт обходить диапазон IP адресов, необходимо этот диапазон преобразовать в список IP адресов, чтобы можно было по очереди проверять каждый из них. Я нашел готовый кусочек кода, состоящий из нескольких функций, которые в совокупности делают нужное нам дело - преобразовывают диапазон IP в список IP адресов. Я не буду разбираться как работают эти функции, просто пояснил для чего они нужны.
def undotIPv4 (dotted):
    return sum (int (octet) << ( (3 - i) << 3) for i, octet in enumerate (dotted.split ('.') ) )

def dotIPv4 (addr):
    return '.'.join (str (addr >> off & 0xff) for off in (24, 16, 8, 0) )

def rangeIPv4 (start, stop):
    for addr in range (undotIPv4 (start), undotIPv4 (stop) ):
        yield dotIPv4 (addr)
Теперь, когда у нас есть функции преобразования диапазона IP в список IP адресов, нужно собственно получить от пользователя начальный и конечный IP диапазона. Для этого пишем поясняющие надписи и ожидаем ввод.
print ("Поиск веб сайтов и веб мордочек в заданном диапазоне IP")
print ("У найденных ресурсов будет показан тег title")
print ("--------------------------------")
a = input("Введите начальный адрес IP диапазона: ")
b = input("Введите конечный адрес IP диапазона: ")
print ("--------------------------------")
Введённый диапазон IP преобразуем в список с помощью нашей функции которую мы объявили выше. Сделаем это непосредственно в условии цикла, чтобы сразу начать перебор IP из списка. Внутри цикла программа пробует с помощью сокета приконнектиться к 80 порту каждого IP адреса. Открытый 80 порт свидетельствует о том, что на данном IP вероятно есть сайт. Если порт 80 открыт, в переменную doc мы скачиваем полностью весь HTML код главной страницы сайта в кодировке UTF-8. Далее сразу же с помощью регулярного выражения парсим из HTML кода в переменную match заголовок сайта который находится в теге title, и выводим его на экран.
for x in rangeIPv4 (a, b):
    s = socket.socket()
    s.settimeout(1)
    try:
        s.connect((x, 80))
    except socket.error:
        pass
    else:
        s.close
        try:
            doc = urllib.request.urlopen("http://"+x).read().decode('utf-8',errors='ignore')
            match = re.search( "<title>(.*)</title>", doc )
            if not(match is None):
                print (x + ": " + match.group())
                print ("----------")
        except Exception:
            pass
Таким образом, узнав адрес какого то сайта крупной организации, и предположив, что сайт хостится на их сервере, мы можем просканировать подсеть, введя в программу диапазон схожих IP адресов. Это позволит нам найти другие сайты данной компании, и веб мордочки её сервисов, иногда роутеров, и другие любопытные вещи. В качестве примера я пробил IP сайта epam-group.ru через сервис https://2ip.ru/lookup/. Определяем IP Взяв полученный IP 174.128.60.201 я просканировал диапазон от 174.128.60.100 до 174.128.60.255 и нашел несколько веб сервисов висящих в данном диапазоне. Во время работы программа никак не сообщает о текущем прогрессе, поэтому не нужно думать что она зависла. Она работает без лишних сообщений. Нужно просто дождаться сообщения о завершении работы и прочесть какие сайты найдены. Поисковый робот на Python

Поисковый робот на Python Лого Pythono.ru Поисковый робот на Python