2008-12-27 31 views
1

因此,我寫了這個簡短的腳本(正確的單詞?)從explosm.net漫畫下載漫畫圖像,因爲我有點最近發現了它,我想......把它放在我的iPhone上...... 3G。從EXPLOSM.net下載漫畫腳本[Python]

它工作正常,所有。 urllib2用於獲取網頁html和urllib for image.retrieve()

爲什麼我在SO上發佈了這個內容:如何優化此代碼? REGEX(正則表達式)會使其更快嗎?它是互聯網限制嗎?差的算法...?

在速度的任何改進或一般的代碼美學將不勝感激「回答」。

謝謝。

-------------------------------- CODE ----------- -----------------------

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!^ - ^)

+0

沒什麼問題,因爲沒有什麼壞的。請發佈這個到你自己的博客頁面,而不是在這裏。 – 2008-12-27 13:49:05

回答

7

我會建議使用Scrapy作爲你的頁面抓取和Beautiful Soup的解析。這會讓你的代碼簡單得多。

無論你想改變你現有的代碼,這些替代品是由你決定的。如果沒有,那麼正則表達式可能會簡化你的代碼。我不確定它會對性能產生什麼影響。

0

我建議使用BeautifulSoup做解析,它會simplifly你的代碼了很多。

但是既然你已經以這種方式工作,也許你不會想要觸摸它,直到它中斷(頁面格式更改)。

3

refactormycode可能是這些「讓我們改進此代碼」類型的討論的更合適的網站。

0

urllib2使用阻塞呼叫,這是性能的主要原因。 您應該使用非阻塞庫(如scrapy)或使用多個線程進行檢索。我從來沒有使用scrapy(所以我不能說出這個選項),但在python中的線程非常簡單直接。

0

今天用Bash做了同樣的事情。它非常基本,但工作得很好。

我首先創建兩個目錄,在這裏我把文件:

mkdir -p html/archived 
mkdir png 

然後,兩個步驟的工作。首先,瀏覽所有網頁:

START=15 
END=4783 
for ((i=START;i<=END;i++)); do 
    echo $i 
    wget http://explosm.net/comics/$i/ -O html/$i.html 
done 

#Remove 404 
find html -name '*.html' -size 0 -print0 | xargs -0 rm 

2,每一頁,報廢htmlm和檢索圖片:

#!/bin/bash 
for filename in ./html/*.html; do 
    i=`echo $filename | cut -d '"' -f 4 | cut -d '/' -f3 | cut -d '.' -f1` 
    echo "$filename => $i" 
    wget -c "$(grep '<meta property="og:image" content=' ${filename} | cut -d '"' -f 4)" -O ./png/${i}.png 
    mv $filename ./html/archived/ 
done 

結果是在這裏: Cyanide_and_happiness__up_to_2017-11-24.zip

請注意,我沒有」噸關心潛在的失敗,但計數4606文件,它似乎大多好。

我也把所有東西都保存爲png。他們可能是JPG格式,我注意到185個0尺寸的文件,但是......隨時關注它,我只是不會:)