2011-06-29 11 views
3

URLをPython経由で読み込んで、そのURL経由で読み込まれたすべての画像のリストを取得する方法はありますか?私は基本的にTamperDataやFiddlerに似た何かをして、与えられたウェブサイトがロードしたすべての画像のリストを取得しようとしています。Python経由で特定のURLから読み込んだ画像を取得する

+0

正確に何が必要なのかわかりません。 imgタグのurlとgrepからhtmlコンテンツを保存します。 これを行い、image/imageURLのリストを返すライブラリをお探しですか? – balki

+0

私が見ている場合、ウェブページはすべてフラッシュで行われます。 TamperDataはページがロードされている間にイメージリクエストを見ることができますが、これらのイメージはページソースに含まれていません。それは理にかなっていますか? –

+1

おそらく、swfファイルからURLを取得できません。できるのは、HTTPトラフィックをキャプチャしてイメージを直接コピーすることだけです。 [pycap](http://pycap.sourceforge.net/)またはwiresharkから "export object"を参照してください。 –

答えて

1

興味深い課題。 Jochen Ritzelによって提案された線に沿って、それを解決する1つの方法があります。

pycapの代わりにpylibpcapを使用します。個人的には、私はpycapが利用可能なドキュメントの量が少ないために動作しないことがわかります。 の場合、pylibpcapの場合は、のlibpcapの例から直接ほとんどのコードを翻訳できます(参考文献については、this tutorialなどを参照してください)。 tcpdumppcapのmanページも素晴らしいリソースです。

Ethernet,IPv4TCP、および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 
関連する問題