1

だから私はこの短いスクリプト (正しい言葉ですか?) を書いて、explosm.net コミックからコミック画像をダウンロードしました.

それはうまく動作します。webpage html を取得するための urllib2 と image.retrieve() のための urllib

これを SO に投稿した理由: このコードを最適化するにはどうすればよいですか? REGEX (正規表現) を使用すると高速になりますか? インターネットの制限ですか?アルゴリズムが悪い…?

速度または一般的なコードの美学の改善は、 「回答」として大歓迎です。

ありがとうございました。

- - - - - - - - - - - - - - - - コード - - - - - - - - - -----------------

import urllib, urllib2

def LinkConvert(string_link):
    for eachLetter in string_link:
        if eachLetter == " ":
            string_link = string_link[:string_link.find(eachLetter)] + "%20" + string_link[string_link.find(eachLetter)+1:]
    return string_link

start = 82
end = 1506

matchingStart = """<img alt="Cyanide and Happiness, a daily webcomic" src="http://www.explosm.net/db/files/Comics/"""
matchingEnd = """></"""
link = "http://www.explosm.net/comics/"

for pageNum in range(start,start+7):
    req = urllib2.Request(link+`pageNum`)
    response = urllib2.urlopen(req)
    page = response.read()

    istart1 = page.find(matchingStart)
    iend1 = page.find(matchingEnd, istart1)
    newString1 = page[istart1 : iend1]

    istart2 = newString1.find("src=")+4
    iend2 = len(newString1)
    final = newString1[istart2 +1 : iend2 -1]

    final = LinkConvert(final)
    try:
        image = urllib.URLopener()
        image.retrieve(final, `pageNum` + ".jpg")
    except:
        print "Uh-oh! " + `pageNum` + " was not downloaded!"

    print `pageNum` + " completed..."

ちなみに、これは Python 2.5 コードであり、3.0 ではありませんが、私は PYthon 3.0 のすべての機能を大いに研究し、新年の前後に (大学のアプリの後 - YAY! ^-^)

4

5 に答える 5

7

ページのフェッチにはScrapyを使用し、解析にはBeautiful Soupを使用することをお勧めします。これにより、コードがはるかに簡単になります。

これらの代替手段に対応する既存のコードを変更するかどうかは、あなた次第です。そうでない場合は、正規表現を使用すると、コードがいくらか簡素化される可能性があります。それがパフォーマンスにどのような影響を与えるかはわかりません。

于 2008-12-27T14:04:48.363 に答える
3

refactormycodeは、これらの「このコードを改善しよう」タイプの議論に適した Web サイトかもしれません。

于 2008-12-27T14:53:42.320 に答える
0

BeautifulSoupを使用して解析を行うことをお勧めします。これにより、コードが大幅に簡素化されます。

しかし、すでにこの方法で動作しているので、壊れるまで (ページ形式が変更されるまで) 触れたくないかもしれません。

于 2008-12-27T13:54:56.417 に答える
0

urllib2 はブロッキング呼び出しを使用しており、これがパフォーマンスの主な理由です。ノンブロッキング ライブラリ (scrapy など) を使用するか、取得に複数のスレッドを使用する必要があります。私は一度もスクレイピーを使用したことがありません (そのため、そのオプションについてはわかりません) が、Python でのスレッド化は非常に簡単で簡単です。

于 2008-12-27T21:56:24.200 に答える