1

所以我写了这个简短的脚本(正确的词?)从explosm.net漫画下载漫画图像,因为我最近发现了它,我想......把它放在我的iPhone......3G上。

它工作正常。用于获取网页 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 的所有功能进行了深入研究和使用(在大学应用程序之后 - 耶!^-^)

4

5 回答 5

7

我建议使用Scrapy进行页面获取,使用Beautiful Soup进行解析。这将使您的代码更简单。

是否要更改适用于这些替代方案的现有代码取决于您。如果不是,那么正则表达式可能会稍微简化您的代码。我不确定它会对性能产生什么影响。

于 2008-12-27T14:04:48.363 回答
3

refactormycode可能是更适合这些“让我们改进此代码”类型的讨论的网站。

于 2008-12-27T14:53:42.320 回答
0

我建议使用BeautifulSoup进行解析,它会大大简化您的代码。

但既然你已经让它以这种方式工作,也许你不想碰它,直到它坏掉(页面格式改变)。

于 2008-12-27T13:54:56.417 回答
0

urllib2 使用阻塞调用,这是性能的主要原因。您应该使用非阻塞库(如 scrapy)或使用多个线程进行检索。我从来没有使用过scrapy(所以我不知道那个选项),但是python中的线程非常简单直接。

于 2008-12-27T21:56:24.200 回答
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 大小的文件,但是......随意关心它,我不会:)

于 2017-11-24T14:27:42.263 回答