Скачать с EXPLOSM.net Comics Script [Python] - PullRequest
1 голос
/ 27 декабря 2008

Итак, я написал этот короткий сценарий (правильное слово?) Для загрузки комических изображений с комиксов explosm.net, потому что я совсем недавно узнал об этом и хочу ... положить его на свой iPhone ... 3G.

Работает нормально и все. urllib2 для получения веб-страницы html и urllib для 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 до и после Нового года (после College Apps - YAY! ^ -) ^)

Ответы [ 5 ]

7 голосов
/ 27 декабря 2008

Я бы предложил использовать Scrapy для извлечения страницы и Beautiful Soup для анализа. Это сделает ваш код намного проще.

Хотите ли вы изменить существующий код, который работает на эти альтернативы, зависит от вас. Если нет, то регулярные выражения, вероятно, несколько упростят ваш код. Я не уверен, какое влияние это окажет на производительность.

3 голосов
/ 27 декабря 2008

refactormycode может быть более подходящим веб-сайтом для подобных обсуждений типа «давайте улучшим этот код».

0 голосов
/ 24 ноября 2017

То же самое сделал сегодня, используя 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, но ... не стесняйтесь об этом, я просто не буду:)

0 голосов
/ 28 декабря 2008

urllib2 использует блокировку вызовов, и это является основной причиной производительности. Вы должны использовать неблокирующую библиотеку (например, scrapy) или использовать несколько потоков для поиска. Я никогда не использовал scrapy (поэтому я не могу сказать об этом варианте), но многопоточность в python действительно проста и понятна.

0 голосов
/ 27 декабря 2008

Я предлагаю использовать BeautifulSoup для анализа, это значительно упростит ваш код.

Но поскольку вы уже работали таким образом, возможно, вам не захочется его трогать, пока он не сломается (формат страницы меняется).

...