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

1

Итак, я написал это короткое script (правильное слово?), чтобы загрузить комиксы из комикса из flashm.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! ^ - ^)

  • 0
    Не много вопросов, так как ничего не сломано. Пожалуйста, разместите это на своей странице блога, а не здесь.
  • 0
    Я удивлен тем, что не существует предварительного инструмента для пакетной загрузки через Интернет.
Теги:
scripting
download
urllib

5 ответов

7
Лучший ответ

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

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

3

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

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

2nd, для каждой страницы отмените 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

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню