通过Python从给定的URL获取加载的图像

时间:2011-06-29 14:51:39

标签: python image url fiddler

无论如何通过Python加载URL然后检索通过该URL加载的所有图像的列表?我基本上想要做类似于TamperData或Fiddler的事情,并检索给定网站加载的所有图像的列表。

1 个答案:

答案 0 :(得分:1)

有趣的任务。这是解决它的一种方法,沿着Jochen Ritzel建议的路线。

它使用pylibpcap代替pycap。就个人而言,由于可用的文档很少,我发现 pycap 难以使用。对于 pylibpcap ,您可以直接从 libpcap 示例翻译大多数代码(请参阅示例this tutorial以获得详细介绍)。 tcpdumppcap的手册页也是很好的资源。

您可能需要查看EthernetIPv4TCPHTTP的标准。

注1:以下代码仅打印出HTTP GET 请求。过滤掉图像并使用urllib module下载它们应该没有问题。

注2:此代码适用于Linux,不确定您需要在Windows / MacOS上使用哪些设备名称。您还需要root权限。

#!/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