Получение загруженных изображений с заданного URL через Python - PullRequest
3 голосов
/ 29 июня 2011

Есть ли способ загрузить URL-адрес через Python, а затем получить список всех изображений, которые были загружены через этот URL-адрес? По сути, я хочу сделать что-то похожее на TamperData или Fiddler и получить список всех изображений, загруженных данным веб-сайтом.

1 Ответ

1 голос
/ 26 июля 2011

Интересное задание. Вот один из способов ее решения по линии, предложенной Йохеном Рицелем.

Используется pylibpcap вместо pycap . Лично я считаю, что с pycap трудно работать из-за небольшого количества доступной документации. Для pylibpcap вы можете перевести большую часть кода непосредственно из libpcap примеров (см., Например, это руководство для хорошего введения). Справочные страницы для tcpdump и pcap также являются отличными ресурсами.

Возможно, вы захотите взглянуть на стандарты для Ethernet , IPv4 , TCP и HTTP .

Примечание 1: Приведенный ниже код распечатывает только HTTP GET запросы. Фильтрация изображений и загрузка их с помощью модуля urllib не должны создавать проблем.

Примечание 2. Этот код работает в Linux, но не уверен, какие имена устройств вам нужно использовать в Windows / MacOS. Вам также понадобятся права суперпользователя.

#!/usr/bin/env python

import pcap
import struct

def parse_packet(data):
    """
    Parse Ethernet/IP/TCP packet.
    """
    # See the Ethernet, IP, and TCP standards for details.

    data = data[14:] # Strip Ethernet header

    header_length = 4 * (ord(data[0]) & 0x0f) # in bytes
    data = data[header_length:]  # Strip IP header

    dest_port = struct.unpack('!H', data[2:4])[0]
    if not dest_port == 80: # This is an outgoing package
        return

    header_length = 4 * ((ord(data[12]) & 0xf0) >> 4) # in bytes
    data = data[header_length:] # Strip TCP header

    return data


def parse_get(data):
    """
    Parse a HTTP GET request, returning the request URI.
    """
    if data is None or not data.startswith('GET'):
        return

    fields = data.split('\n')
    uri = fields[0].split()[1]

    for field in fields[1:]:
        if field.lower().startswith('host:'):
            return field[5:].strip() + uri


def packet_handler(length, data, timestamp):
    uri = parse_get(parse_packet(data))
    if not uri is None:
        print uri


# Set up pcap sniffer
INTERFACE = 'wlan0'
FILTER = 'tcp port 80'
p = pcap.pcapObject()
p.open_live(INTERFACE, 1600, 0, 100)
p.setfilter(FILTER, 0, 0)

try:
    while True:
        p.dispatch(1, packet_handler)
except KeyboardInterrupt:
    pass
...