spiiin: (Default)
Продолжаю сравнивать Scala и Python на небольших прикладных задачках.
На этот раз переписал старый скрипт для выгрузки всех фотографий из альбома Вконтакта.
Небольшие отличия в задаче - 5 лет назад у VK не было api, поэтому url картинок получался парсингом страницы, сейчас обычным запросом к api.

Старый код на python: 136 строк
Новый код на scala: 36 строк

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22


  var token: String = ""
  implicit def string2xml(v: String) = XML.loadString(v)

  override def main(args: Array[String]): Unit = {
    implicit val threadPool = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(4))
    val cmdName = "../../vkAuthorizeToOutput/vkAuthorize.exe"
    token = (cmdName.!!).replace("\r\n", "")
    val photosAns = getPhotos("OWNER_ID", "ALBUM_ID")
    val photo_1280 = extractBigPhotos(photosAns)
    val fut = photo_1280.zipWithIndex.map {
      case (url, i) => Future { println(i + " " + url); saveToFile(url, f"C:/users/USERS/desktop/test/$i%03d.jpg") }
    }
    Await.result(Future.sequence(fut), 30 seconds)
    println("END")
  }

  def getPhotos(ownerId: String, album_id: String) = executeCommand("photos.get", token, ("owner_id" -> ownerId), ("album_id" -> album_id))
  def extractBigPhotos(xml: String) = (xml \\ "photo").map(v => (v \ "src_xxbig").text)
  def saveToFile(url: String, filename: String) = new URL(url) #> new File(filename) !!
  def executeCommand(cmd: String, accessToken: String, params: (String, String)*) = {
    val fmt = s"https://api.vkontakte.ru/method/$cmd.xml?access_token=$accessToken" + params.map { case (k, v) => k + "=" + v }.mkString("&", "&", "")
    Source.fromURL(fmt).mkString


Implicits-параметры функций как-то сильно настораживают. За счёт него можно парой строк включить/выключить многопоточность - у конструктора класса Future есть неявный параметр ExecutorContext, и если его опустить, то что именно передастся в конструктор будет зависеть от того, какой именно неявный объект будет находится в области видимости:

import ExecutionContext.Implicits.global //так импортируется  объект implicit lazy val global: ExecutionContextExecutor
implicit val threadPool = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(4)) //так создаётся свой пул потоков
Future { println(i + " " + url); saveToFile(url, f"test/$i%03d.jpg") } //эти объявления повлияют на эту строку (в которой нет никакого упоминания ExecutionContext вообще!)
//лучше всё время указывать неявный параметр явно:
Future { println(i + " " + url); saveToFile(url, f"test/$i%03d.jpg") }(threadPool) //теперь видно, что между создаваемым объектов и местом его выполнения есть связь


Скала не перестаёт удивлять своей идиоматичностью - для каждой подзадачи находится несколько вариантов решения, часто однострочных.
Tags:
spiiin: (Default)
Мой товарищ вконтакте устроил опрос:

Результаты опроса довольно интересны для меня, так как автор - представитель активной молодёжи Крыма, постоянно путешествует и активно общается с людьми, соответственно, среди друзей у него много таких же молодых (лет 20-30), активных людей из разных городов, которые, в основном, и участвовали в опросе.

Мне тут понадобилось разобраться с Open API вконтакте, решил в качестве тестовой задачки проанализировать данные этого опроса (с разрешения автора), чтобы оставить в нём мнение только жителей Крыма - разделить тех, кто проголосовал "Я не из Крыма, мне интересны результаты опроса" на 2 группы - выделить среди проголосовавших тех, кто на самом деле не из Крыма ("Воздержался") и сложить с остальными категориями.

Под катом код, ниже результаты.
Read more... )

Результаты (взяты только жители Крыма):

1. Мне стало жить лучше                           - 45 (30,2%) (7 вычеркнуты)
2. Мне стало жить хуже                            - 30 (20,1%)
3. Существенно не изменилась                      - 36 (24,1%) (3 вычеркнуты)
4. Я уехал (-а) на ПМЖ за пределы Крыма           - 33 (22,1%)
5. Я переехал (-а) жить в Крым меньше года назад  - 0  (0,0%)
6. Я из Крыма, мне интересны результаты опроса    - 5  (3,3%)



Меня больше всего огорчает 22,1% (каждый пятый) уехавшей молодёжи. Выборка, конечно, из тех, кто часто путешествует, но среди знакомых it-шников, субъективно, всё ещё хуже.
Jan. 14th, 2011 12:21 am

twi2vk

spiiin: (Default)
Я снова есть в твиттере.
Там как и раньше, всякие ссылки, какие-то цитаты и непонятные чатеги со знакомыми.

Под катом куски скрипта на питоне для репоста твитов вконтакт.
Read more... )
Tags:
spiiin: (Default)
Собрал скрипт для проверки статусов "Онлайн/Оффлайн" друзей вконтакте.


Если кому будет нужен, пишите.
Жалко, что теперь сайт ограничивает кол-во одновременных подключений, быстро не получается все проверить.
Отображение русских символов в консоли – развлечение то еще.
Также нельзя не отметить, что в Питоне очень удобно работать со строками в различных êîäèðîâêàõ ��������� ЙНДХПНБЙЮУ кодировках!
Tags:
spiiin: (Default)
Запись из архива

Скрипт на питоне, который умеет выкачивать все картинки из альбома Вконтакте

Писался когда-то для одного человека, потом неоднократно допиливался под изменения на сайте.
Сейчас умеет - качать картинки из альбомов групп или отдельных людей (крупные версии), не загружает повторно уже скачанные картинки, закачивает несколько картинок одновременно, вырезает рекламные картинки, периодически появляющиеся на баннерах слева.

Для работы нужен Python , аккаунт вконтакте и прямые руки.

Выглядит вот так -


Скрипт валяется  тут

Profile

spiiin: (Default)
spiiin

September 2017

S M T W T F S
     1 2
34 567 89
101112131415 16
17181920212223
24252627282930

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 11:34 am
Powered by Dreamwidth Studios