Веб-скрейпінг як забава

Веб-скрейпінг - дивовижна штука. Можна збирати інформацію із відкритих джерел щодо чого завгодно. І улюблена моя ціль - веб-сайти, котрі містять однорідні дані із користувацькими оцінками. Наприклад, сайт з оцінками кінофільмів, або коміксів, або комп'ютерних ігор. В базі даних обов'язкові такі стовпчики: рейтинг, кількість голосів, ID на сайті-джерелі.

Власне, є у мене такі бази даних з комп'ютерними іграми (їх тут 6307), кінофільмами (їх 99998), телесеріалами (їх 43083 штуки), випусками коміксів (ще званих послідовним мистецтвом, 139848 штук). Все це у мене (крім коміксів) є з мітками за жанрами і тематиками. База даних із книжками поки в розробці, один всім відомий сайт піддаватись веб-скрейпінгу не хоче. Під катом трошки топів, а потім алгоритм обчислення.

Ви любите кіно? Я - помірно. Пошук кіно відповідно до власних смаків є неабиякою проблемою, особливо коли хочеться скуштувати класики, а не йти в кінотеатр на конвеєрні фільми.

Кіно

Розподіл за жанрами. Згори - суми ваг добрих фільмів, знизу - поганих.
Суми ваг кінофільмів за роками. Бачимо занепади протягом 40-х (Друга світова війна), 60-х, вибухи протягом 70-х та 90-х.

За версією мого алгоритму, десять найкращих фільмів всіх часів у порядку виходу:

  1. Хрещений батько (1972, кримінальна драма)
  2. Втеча з Шоушенку (1994, кримінальна драма)
  3. Кримінальне чтиво (1994, кримінальна драма)
  4. Форрест Гамп (1994, романтична драма)
  5. Бійцівський клуб (1999, драма)
  6. Матриця (1999, науково-фантастичний бойовик)
  7. Володар перснiв: Хранителi персня (2001, пригодницька казкова драма)
  8. Володар перснiв: Повернення короля (2003, пригодницька казкова драма)
  9. Темний лицар (2008, кримінальний трилер-бойовик)
  10. Початок (2010, містичний науково-фантастичний трилер-бойовик)

І, для сміху, десять найгірших:

  1. Бетмен і Робін (1997, казково-фантастичний бойовик)
  2. Поле бою - Земля (2000, пригодницький науково-фантастичний бойовик)
  3. Жінка-Кішка (2003, казковий кримінально-романтичний трилер)
  4. Дуже епічне кіно (2007, пригодницька комедія)
  5. Нереальний блокбастер (2008, комедія)
  6. Зустріч із спартанцями (2008, комедія)
  7. Сутінки (2008, казкова романтична драма)
  8. Сутiнки 2. Сага: Новий мiсяць (2009, пригодницька казкова романтична драма)
  9. Сутiнки. Сага: Затемнення (2010, пригодницька казкова романтична драма)
  10. П'ятдесят вiдтiнкiв сiрого (2015, романтична драма)

Комікси

Комікси за роками. Вибух лайна у 2012 році.


Десять найкращих коміксів:

  1. Batman: The Killing Joke (1988) OGN SC (1988, "Бетмен: Вбивчий жарт" 1988 року у м'якій обкладинці)
  2. V for Vendetta (1988-1989) TPB (1990, "V означає вендетта" 1989-1990 років у м'якій обкладинці)
  3. Watchmen (1986-1987) TPB (1995, "Хранителі" 1986-1987 років у м'якій обкладинці)
  4. Kingdom Come (1996) TPB (1997, "Друге пришестя" 1996 року у м'якій обкладинці)
  5. The Walking Dead (2003-...) TPB vol. 01 (2004, "І мертві підуть" із 2003 року до сьогодні, перша збірка у м'якій обкладинці)
  6. Watchmen (1986-1987) Absolute Edition (2005, "Хранителі" 1986-1987 років, абсолютне видання)
  7. All Star Superman (2006-2008) #1 (2006, "Славетний Супермен" 2006-2008 років, випуск №1)
  8. All Star Superman (2006-2008) #6 (2007, "Славетний Супермен" 2006-2008 років, випуск №6)
  9. All Star Superman (2006) HC vol. 01 (2007, "Славетний Супермен" 2006-2008 років, перша збірка у твердій обкладинці)
  10. Batman and Robin (2009-2011) #1 (2009, "Бетмен та Робін" 2009-2011 років, випуск №1)

Десять найгірших видань коміксів:

  1. Teen Titans (2003-2011) #27 (2005, "Юні титани" 2003-2011 років, випуск №27)
  2. Teen Titans (2003-2011) #28 (2005, "Юні титани" 2003-2011 років, випуск №28)
  3. Civil War: The Return (2007) #1 (2007, "Громадянська війна: повернення" 2007 року, єдиний випуск)
  4. The Amazing Spider-Man (1963-2014) #544 (2007, "Дивовижний Людина-павук" 1963-2014 років, випуск №544)
  5. The Amazing Spider-Man (1963-2014) #544 (2007, "Дивовижний Людина-павук" 1963-2014 років, випуск №544 з обкладинкою від Дьюрдевича)
  6. The Sensational Spider-Man (2006-2007) #41 (2007, "Блискучий Людина-павук" 2006-2007 років, випуск №41)
  7. The Amazing Spider-Man (1963-2014) #545 (2008, "Дивовижний Людина-павук" 1963-2014 років, випуск №545)
  8. The Amazing Spider-Man (1963-2014) #545 (2008, "Дивовижний Людина-павук" 1963-2014 років, випуск №545 з обкладинкою від Дьюрдевича)
  9. The Amazing Spider-Man (1963-2014) #638 (2010, "Дивовижний Людина-павук" 1963-2014 років, випуск №638)
  10. Green Arrow (2011-...) #1 (2011, "Зелений стріла" з 2011 року дотепер, випуск №1)

Відеоігри


Комп'ютерні ігри за роками. Від 2009 року продукується все більше шлаку.

Десять найращих комп'ютерних ігор:
  1. S.T.A.L.K.E.R.: Тінь Чорнобиля (2007, шутер від першої особи, пригоди, альтернативна історія, наукова фантастика, жахи)
  2. Grand Theft Auto IV (2008, шутер від третьої особи, пригоди, перегони, кримінал)
  3. Fallout 3 (2008, шутер від першої особи, пригоди, постапокаліпсис, наукова фантастика)
  4. S.T.A.L.K.E.R.: Поклик Прип'яті (2009, шутер від першої особи, альтернативна історія, наукова фантастика, жахи, армія)
  5. Dragon Age: Origins (2009, рольова гра, казкове середньовіччя)
  6. Mass Effect 2 (2010, шутер від третьої особи, рольова гра, пригоди, наукова фантастика)
  7. Dragon Age: Origins - Awakening (2010, рольова гра, комедія, казкове середньовіччя)
  8. The Elder Scrolls V: Skyrim (2011, слешер від першої особи, рольова гра, пригоди, казкове середньовіччя)
  9. Grand Theft Auto V (2013, шутер від третьої особи, пригоди, перегони, кримінал)
  10. The Witcher 3: Wild Hunt (2015, рольова гра, пригоди, казкове середньовіччя)
Десять найгірших комп'ютерних ігор:
  1. Call of Duty: Modern Warfare 3 (2011, шутер від першої особи, шпигунство, армія)
  2. Warface (2012, багатокористувацька, шутер від першої особи, наукова фантастика, армія)
  3. Need for Speed: Most Wanted (2012, перегони, кримінал)
  4. Aliens: Colonial Marines (2013, шутер від першої особи, наукова фантастика, жахи)
  5. World of Warplanes (2013, онлайн, симулятор, Друга світова війна)
  6. Call of Duty: Ghosts (2013, шутер від першої особи, армія)
  7. Rambo: The Video Game (2014, шутер від першої особи, шпигунство, армія)
  8. Sacred 3 (2014, рольова гра, пригоди, казкове середньовіччя)
  9. Call of Duty: Advanced Warfare (2014, шутер від першої особи, наукова фантастика, армія)
  10. Call of Duty: Black Ops 3 (2015, шутер від першої особи, наукова фантастика, армія)

Ранжування

Для ранжування якості творів використовую особливу формулу. Проста оцінка від 1 до 10 для цієї мети не підходить, тому що якщо якийсь чеський кінофільм на основі 500 голосів отримує середню оцінку 9,3, а голівудський визнаний шедевр на основі 500000 оцінок - 8,3, то чеська перлина буде в ранжуванні за "оцінкою" вище за популярні фільми, що не є природньо.
  1. Перш за все, виконати нормалізацію "оцінки" - приведення до діапазону [0; 1]. Якщо оцінки в діапазоні від 1 до 10, то поділити кожну на 10. Це дає розуміння "оцінки" як частки задоволеності глядачів фільмом: 1,0 - повна задоволеність, 0,1 - прямуюча до нуля. 
  2. Обчислити медіану всіх оцінок. SELECT AVG(`rating`) FROM (SELECT `rating` FROM `%tablename` ORDER BY `rating` LIMIT 2 - (SELECT COUNT() FROM `%tablename%`) % 2 OFFSET (SELECT (COUNT() - 1) / 2 FROM `%tablename%`)). Наприклад, медіана оцінок кінофільмів рівна 6,3.
  3. Відняти від кожної "оцінки" медіану оцінок. Таким чином оцінки, менші за медіанну оцінку, дадуть від'ємне значення.
  4. Помножити отриману в №3 різницю на кількість голосів користувачів. Таким чином, добрі твори, будучи широко відомими, отримують дуже високий результат, а погані твори, будучи широко відомими - жахливо низький (від'ємний).
Одним запитом пункти 1-4 мають наступний вигляд:
UPDATE `%tablename%` SET `weight` = `voters_num` * (`rating` - (SELECT AVG(`rating`) FROM (SELECT `rating` FROM `%tablename%` ORDER BY `rating` LIMIT 2 - (SELECT COUNT() FROM `%tablename%`) % 2 OFFSET (SELECT (COUNT() - 1) / 2 FROM `%tablename%`)))) / 10
Нема в улюбленому SQLite вбудованої функції для обчислення медіани, що поробиш :(

Технології Web-scraping

Python3. Бібліотеки: requests, lxml, cssselect. Хоча доводилось парсити HTML звичайними рядковими функціями, а іноді навіть виконувати в контексті сторінки браузера JavaScript і зберігати зібрані дані в JSON (останній метод - для сайтів, заснованих на AJAX).

Коментарі

Популярні дописи з цього блогу

Людина і Вогонь Свободи

моя богиня Энтропия