Скачать с EXPLOSM.net Comics Script [Python]

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

Работает нормально и все. urllib2 для получения html веб-страницы и urllib для image.retrieve ()

Почему я разместил это на 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 и поиграл с ними до или сразу после Нового года (после College Apps - УРА! ^ - ^)

Не особый вопрос, так как ничего не сломано. Пожалуйста, разместите это на своей странице блога, а не здесь.

S.Lott 27.12.2008 16:49

Я удивлен, что до сих пор не существовало инструмента для пакетной загрузки веб-комиксов.

biozinc 28.12.2008 01:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
2 356
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

Ответ принят как подходящий

Я бы предложил использовать Scrapy для загрузки вашей страницы и Красивый суп для анализа. Это значительно упростит ваш код.

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

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

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

Сделал то же самое сегодня, используя 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

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

Другие вопросы по теме