无论如何通过Python加载URL然后检索通过该URL加载的所有图像的列表?我基本上想要做类似于TamperData或Fiddler的事情,并检索给定网站加载的所有图像的列表。
答案 0 :(得分:1)
有趣的任务。这是解决它的一种方法,沿着Jochen Ritzel建议的路线。
它使用pylibpcap代替pycap。就个人而言,由于可用的文档很少,我发现 pycap 难以使用。对于 pylibpcap ,您可以直接从 libpcap 示例翻译大多数代码(请参阅示例this tutorial以获得详细介绍)。 tcpdump和pcap的手册页也是很好的资源。
您可能需要查看Ethernet,IPv4,TCP和HTTP的标准。
注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