?

Log in

No account? Create an account

DIY - АКАПУЛЬКОПСИС NOW!

Aug. 31st, 2016

06:35 am - DIY

Previous Entry Share Next Entry

Вам приходилось программировать для себя? Я как-то увидел книжку с названием "Borland C++ для себя" (сейчас погуглил, последнее издание вышло в 2013, ничего себе!) и удивился названию. Для меня оно выглядело примерно как "Термодиффузионное легирование стали для себя" или "Раскряжевка и трелевка леса для себя". Не в том смысле, что за восемь рабочих часов у станка программированим сыт настолько, что дома за клавиатуру не тянет. Вовсе нет, я люблю на досуге побаловаться, но это именно баловство для души, типа задачек-головоломок и прочее занимательное ковыряние. Писать же что-нибудь полезное в домашнем хозяйстве мне представлялось странным, поэтому что все программы и так давно написаны. Быстрее и надежнее найти готовое решение, чем ваять самопал на коленке. Однако, когда озадачился скачиванием кучи книжек с гутенберга (за что меня даже забанили там ненадолго) и такой же кучи подкастов с rss, то пришлось засучить рукава.

У каждого уважающего себя подкаста есть rss лента. Например, на главной странице Marathon Talk видны только последние эпизоды, зато в rss доступны сразу все выпуски по прямым ссылкам, качай не хочу! Я был уверен, что легко найду для своего браузера (Firefox) плагин или макрос, чтобы можно было одним кликом скачать все со страницы. Удивительно, но нет. Удивительно, потому что я считаю такая функциональность должна вообще поставляться искаропки, но я потыкался недолго и не нашел нужного. Решил, что быстрее будет набросать на питоне скрипт, чем искать дальше. Конечно, быстрее не получилось, пришлось потратить время на изучение библиотек lxml и requests, чтобы не велосипедить с разбором xml и собственно скачиванием файлов, а обойтись одной строчкой. Но тем не менее.


#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import sys
import os
import requests
from lxml import html
 
rss_url, dir_name, args = '', '', sys.argv
 
if len( args) < 2 :
	print 'usage : ', args[0], ' rss-url [ desnitation folder ]' 
	sys.exit()
 
rss_url = args[1]
 
if len( args ) > 2: 
	dir_name = args[2]
else:
	dir_name = rss_url.split('/')[-1]
 
print 'save media from ', rss_url, ' to directory ', dir_name
if not os.path.exists( dir_name ):
	os.mkdir( dir_name )
os.chdir( dir_name )
 
r = requests.get( rss_url )
page = html.document_fromstring( r.text.encode('utf-8') )
links = page.xpath('//enclosure/@url')
 
for url in links:
	file_name = url.split('/')[-1]
	if os.path.exists( file_name ):
		continue
	print 'saving ', file_name	
	try:
		fr = requests.get( url )
		f = open(file_name, 'w')
		f.write( fr.content )
		f.close()
	except:
		print 'cannot download', file_name
		continue




Оригинал записи на dreamwidth.org.

Comments:

[User Picture]
From:freedom_of_sea
Date:August 31st, 2016 05:28 am (UTC)
(Link)

Зачем хмл регекспом их а то и вовсе поиском по строке

(Reply) (Thread)