2

Web ページのソース コードを検索し、そこから Python を使用してさまざまなファイルをダウンロードしようとしています。このスクリプトは、ソース コードで .jpg ファイルを検索し、期待どおりにすべてダウンロードします。ただし、スクリプトを変更すると (以下に示すように「.jpg」を「.png」に変更)、次のエラーが発生します。

Traceback (most recent call last):
File "img.py", line 19, in <module> urllib.urlretrieve(images[z], "image"+str(z)+".png")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 91, in urlretrieve
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 237, in retrieve
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 205, in open
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 461, in open_file
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 475, in open_local_file
IOError: [Errno 2] No such file or directory: '/images/adapt-icon-search.png?1342791397'

私が使用しているスクリプトは次のとおりです。

import urllib
import urllib2
import re

print "enter url of site (such as 'dribbble.com')"

url = raw_input()
fullurl = "http://"+url

src = urllib2.urlopen(fullurl)
src = src.read()

images = re.findall('src="(.*\.png[^"]*)', src)

z=0
while z < len(images):
    urllib.urlretrieve(images[z], "image"+str(z)+".png")
    print "done"
    z+=1

このスクリプトが .png ファイルに対して機能しない理由についての洞察をいただければ幸いです。よろしくお願いします。

更新: 以下は、検索したいソースのサンプルです。

<span rel="tipsy" title="This shot has rebounds." class="rebound-mark has-rebounds">1</span>
                </a>            
        </div>
    </div>
    <h2>
        <a href="/Dash" class="url" rel="contact" title="Dash"><img alt="Avatar-new" class="photo fn" src="http://dribbble.s3.amazonaws.com/users/107759/avatars/original/avatar-new.png?1339961321" /> Dash</a>
        <a href="/account/pro" class="badge-link">
    <span class="badge badge-pro">Pro</span>
</a>
    </h2>
4

1 に答える 1

6

したがって、発生するエラーは次のとおりです。

IOError:[Errno 2]そのようなファイルまたはディレクトリはありません:'/images/adapt-icon-search.png?1342791397'

何が起こっているのかというと、スクレイピングしているWebページに、URLに含まれているドメイン名を含まないPNG参照がいくつかあるということです。ループ内でそれらをフェッチしようとするとwhile、リモートホスト上の場所のみを指定しているため、失敗します/images/adapt-icon-search.png?1342791397

これらの種類のURLを検出するには、コードを拡張する必要があります(これは完全に合法であり、実際には非常に一般的です)。ここでヒットしている種類の場合は、一致したURLの前にサーバーのホスト名を追加するだけです(例http://dribble.com/)。

おそらく、相対URLも処理する必要があります。これもホスト名を除外しますが、/文字なしで開始します。前のページのパスがある場合は、それらの前にパスを追加する必要があります。したがって、スクレイピングする場合はhttp://dribble.com/foo/bar.html、相対URLの前に。を付ける必要がありますhttp://dribble.com/foo/

おそらくWebスクレイピングプロセスの一部として、非絶対URLの処理を自動化するライブラリが存在する可能性があります。私は直接ウェブスクレイピングについてあまり知らないのではないかと思いますが、おそらく他の誰かがコメントでそれを提案することができます。

于 2012-07-27T20:35:20.803 に答える