Նոր տարվա օլիվյեն ուտելուց հետո ինձ չկարողացար բան անել, և ես որոշեցի, որ պետք է էլի ամեն ինչ ներբեռնել իմ համակարգչին Հաբրահաբրից (և հարակից հարթքերից) ու ուսումնասիրել։
Ստացվեց մի քանի հետաքրքիր պատմություն։ Առաջինը այդպիսի հոդվածների ձևաչափի և թեմատիկայի զարգացումն է կայքի գոյության 12 տարիների ընթացքում։ Օրինակ, որոշ թեմաների դինամիկան բավականին ցուցադրիչ է։ Շարունակությունը՝ կատակ։

Պարսինգի գործընթացը
Հասկացելու համար, թե ինչպես զարգացել է Հաբրը, պետք էր անցնել բոլոր նրա հոդվածները և առանձնացնել դրանց մետաօրյա məlumatները (օրինակ, ամսաթվերը)։ Ծանոթագիր տրվել է հեշտ, քանի որ բոլոր հոդվածների հղումները ունեն "habrahabr.ru/post/337722/" տեսքը, իսկ թվերը ճիշտ դասավորված են։ Գիտելով, որ վերջին հրապարակումն ունի թիվ մի քիչ պակաս 350 հազարից, ես պարզապես անցա բոլոր հնարավոր փաստաթղթերի id-ներով ցիկլով (Python-ի կոդ):
import numpy as np
from multiprocessing import Pool
with Pool(100) as p:
docs = p.map(download_document, np.arange(350000))Ֆունկցիա download_document փորձում է ներբեռնել համապատասխան id ունեցող էջը և փորձում է HTML կառուցվածքից պիտակային տեղեկատվություն առանձնացնել։
import requests
from bs4 import BeautifulSoup
def download_document(pid):
""" Ներբեռնում և մշակումը Հաբր փաստաթղթի և դրա մեկնաբանությունների """
# փաստաթղթի ներբեռնում
r = requests.get('https://habrahabr.ru/post/' + str(pid) + '/')
# փաստաթղթի պարսինգ
soup = BeautifulSoup(r.text, 'html5lib') # html.parser-ի փոխարեն
doc = {}
doc['id'] = pid
if not soup.find("span", {"class": "post__title-text"}):
# դա տեղի է ունենում, եթե հոդվածը不存在 կամ հեռացվել է
doc['status'] = 'title_not_found'
else:
doc['status'] = 'ok'
doc['title'] = soup.find("span", {"class": "post__title-text"}).text
doc['text'] = soup.find("div", {"class": "post__text"}).text
doc['time'] = soup.find("span", {"class": "post__time"}).text
# ստեղծել այլ դաշտեր՝ կենտրոններ, թեգեր, դիտումներ, մեկնաբանություններ, ձայներ և այլն
# ...
# արդյունքի պահպանումը ազատ ֆայլում
fname = r'files/' + str(pid) + '.pkl'
with open(fname, 'wb') as f:
pickle.dump(doc, f)Պարսինգի ընթացքում բացեցի մի քանի նոր կետեր։
Առաջինը, ասում են, որ պրոցեսորներում ավելի շատ պրոցեսներ ստեղծելը անօգուտ է։ Բայց իմ դեպքում պարզվեց, որ սահմանափակող ռեսուրսը ոչ պրոցեսորն է, այլ ցանցը, և 100 պրոցեսները ավելի արագ են աշխատում, քան 4 կամ, ասենք, 20։
Երկրորդ, որոշ հրապարակներում հանդիպում էին հատուկ նշանների համակցություններ՝ օրինակ, փոխաբերական խոսքեր, ինչպիսիք են "%&#@"։ Պարզվեց, որ html.parser, որին ես սկզբում օգտագործում էի, արձագանքում է համակցությանը &# սուր զգայունությամբ, համարելով նրան HTML-ի ևֆության սկիզբ։ Ես արդեն պատրաստվում էի արցունքաբեր մոգություն կատարել, բայց ֆորումում տեղեկացրեցին, որ պարզապես կարելի է փոխել պարասերը։
Երրորդ՝ հաջողվեց ինձ հանել բոլոր հրապարակումները, բացառությամբ երեքի։ 65927, 162075 և 275987 համարներով փաստաթղթերը անմիջապես ջնջեց իմ հակավիրուսային ծրագիրը։ Այդ հոդվածները վերաբերում են JavaScript շղթային, որը բ yükնում է վտանգավոր PDF, SMS-հետախուզիչ, որն աշխատում է որպես բրաուզերի plugin-ների հավաքածու, և CrashSafari.com կայք, որը iPhone-ները ստիպում է վերագործարկել։ Մեկ հոդված հակավիրուսն հետո հայտնաբերում է համակարգը սկանելու ընթացքում՝ 338586 պոստը մասին, որտեղ Զոոմագազին կայքի սքրիպտները օգտագործում են օգտվողի պրոցեսորը կրիպտոարժույթերի հանքի համար։ Այդպես կարող ենք համ считать հակավիրուսի աշխատանքը լիովին համարժեք։
«Կենդանի» հոդվածներ միայն կեսն էին հնարավոր առավելագույնից՝ 166307 հատ։ Մնացածի համար Հաբրը առաջարկում է «էջը հին է, ջնջվել է կամ գոյություն չուներ» տարբերակները։ Ցավոք, ամեն ինչ պատահում է։
Հոդվածների հետ դուրս եկավ տեխնիկական աշխատանք․ օրինակ՝ հրապարակումների ամսաթվերը պետք է փոխվեին «21 դեկտեմբերի 2006-ի 10:47» ձևաչափից ստանդարտի։ datetime, իսկ «12,8k» դիտումները պետք է դառնային 12800։ Այս փուլում հայտնվեցին ևս մի քանի դժվարություններ։ Հեղինակավորից ամենաուրախն էր ձայների և տվյալների տեսակների հաշվի հետ կապված․ որոշ հին պոստերում տեղի է ունեցել ինթերի լցադրում, և դրանք ստացել են 65535 ձայն։

Պատասխանատու հոդվածների տեքստերը (անկախ լուսանկարներից) զբաղեցրել են 1.5 ԳԲ, մեկնաբանությունները՝ մետաինֆորմացիայով՝ ևս 3, և մոտ մեկ հարյուր մեգաբայթ՝ հոդվածների մետաինֆորմացիան։ Այնպես որ, նման բան կարող էր ամբողջությամբ պահվել օպերատիվ հիշողության մեջ, ինչը հաճելի անսպասելիություն էր ինձ համար։
Ես սկսեցի հոդվածների վերլուծությունը ոչ թե հոդվածների տեքստերից, այլ մետաինֆորմացիայից՝ ամսաթվեր, պիտակներ, հաբեր, դիտումներ և «երևույթներ»։ Որոշվեց, որ դա նույնպես կարող է շատ բան պատմել։
Հաբրահաբրի զարգացման միտումները
Հոդվածները հրապարակվում են կայքում 2006 թվականից, առավել ինտենսիվ՝ 2008-2016 թվականներին։

Ինչքան ակտիվորեն են այս հոդվածները ընթերցում տարբեր ժամանակներում, գնահատել այնքան հեշտ չէ։ 2012 թվականի և ավելի երիտասարդ տեքստերը ավելի ակտիվորեն մեկնաբանվում և վարկանիշավորվում են, սակայն ավելի նոր տեքստերը ավելի շատ դիտումներ և ավելացումներ ունեն նշումների մեջ։ Այդ մետрики միայն մեկ անգամ էին նույն կերպ ընկել (մեկ անգամ ընդամենը իջել են երկու անգամ), 2015 թվականին։ Հնարավոր է, տնտեսական և քաղաքական ճգնաժամի պայմաններում ընթերցողների ուշադրությունը անցել է IT բլոգներից ավելի ցավալի հարցերի։

Քանի որ ես վերցրել եմ նաև մեկնաբանությունները, ստացված մեկնաբանությունների քանակը հասել է 6 միլիոնի, սակայն դրանցից 240 հազարն արգելված էին (փաստորեն, «UFO-ն եկել է և տարածել այս գրառումը այստեղ» արարով)։ Մեկնաբանությունների օգտակար հատկությունն այն է, որ նրանց համար նշված է ժամանակը։ Մեկնաբանությունների ժամանակը ուսումնասիրելով, կարելի է մոտավորապես հասկանալ, երբ ընդհանուր հոդվածները ընթերցվում են։
Հայտնվեց, որ հոդվածների մեծ մասը գրում և մեկնաբանվում է մի Somewhere 10-ից 20 ժամ, այսինքն՝ típico մոսկվայական աշխատանքային օրը: Սա կարող է նշանավորել, որ Habra ընթերցում են մասնագիտական նպատակներով, և որ սա լավ եղանակ է «ծանրաբեռնվածությունից» խուսափելու համար: Բացի այդ, այս ժամանակահատվածի բաշխումը կայուն է եղել Habra-ի հիմնադրման սկզբից մինչ այսօր:

Այդուհանդերձ, մեկնաբանության ժամանակի հիմնական օգուտը ժամանակի դասնընդմեջությունն է, այլ ոչ թե օրերի ժամամիջոցը: Ես հաշվեցա, թե ինչպես է բաշխվում հոդվածի հրապարակումից մինչև դրա մեկնաբանությունը վերցված ժամանակը: Ֆոնիքի գծացանկում երևում է, որ ներկայիս միջին մեկնաբանությունը (կանաչ գիծ) ցուցադրվում է մոտեցում 20 ժամից, այսինքն՝ հրապարակումից հետո առաջին օրը gemiddeld թեթև ավելին է, քան բոլոր մեկնաբանությունները: Իսկ երկու օրերի ընթացքում խտանում է 75% բոլոր մեկնաբանություններից: Այս դեպքում նախկինում հոդվածները ընթերցվում էին ավելի արագ՝ օրինակ, 2010-ին մեկնաբանությունների կեսը ստացվում էր արդեն առաջին 6 ժամվա ընթացքում:

Ինձ համար զարմանալի էր, որ մեկնաբանությունները մեծացել են՝ միջին ժանրի մեջ ամեն մեկնաբանության համար գրեթե կրկնակի ավելությամբ:

Կง่ายեցրած հետադարձ կապը մեկնաբանություններից մեկն է: Habra-ում կարելի է քվեներ ավելացնել, ալցուք լինելով այլ ռեսուրսների հետ, կարելի է միավորման և բացասական կարծիքներ ավելացնել: Սակայն վերջին հնարավորությունից ընթերցողները օգտվում են հազվադեպ՝ ներկայիս բացասական կարծիքների բաժինը ընդհանուր քվեների մոտ 15% է: Նախկինում ավելի շատ էին, սակայն ժամանակի հետ ընթերցողները բարելավում են:

Ժամանակի ընթացքում փոխվել են նաև տեքստերը: Օրինակ, հատկանշական է, որ տեքստի típicos երկարությունն անընդհատ աճում է կայքի բացվելուց ի վեր, չնայած ճգնաժամերին: Տասնամյակի ընթացքում տեքստերը almost 10 անգամ երկարել են:

Տեքստերի սթիլը (առաջին մոտեցմամբ) նույնպես փոխվել է: Habra-ի առաջին տարիների ընթացքում, օրինակ, աճել է կոդի և թվերի տոկոսը տեքստերում:

Համաբար կայքի ընդհանուր դինամիկան պարզելու համար ես որոշեցի չափել, թե ինչպես է փոխվել տարբեր թեմաների ժողովրդականությունը: Temas-ն կարելի է ավտոմատ կերպով առանձնացնել տեքստերից, սակայն սկզբում կարելի է չծառայել, այլ օգտագործել ավարտական տեգերը, որոնք հետագայում յուրաքանչյուր հոդվածի հեղինակը տեղադրել է: Երևույթները կարող են դուրս գալ գծացանկում քառակուսիներով: "Google" թեման սկզբում ղեկավարում էր (մասնավորապես SEO-օպտիմիզացման հետ կապված), սակայն տարիների ընթացքում կորցնում էր ուժը: Javascript-ը եղել է հայտնի թեման և աստիճանաբար շարունակվում է, իսկ մեքենայական ուսուցումն սկսել է արագորեն ձեռք բերել ժողովրդականություն միայն վերջին տարիներին: Linux-ը մնում է նույնքան թարմ ողջ տասնամյակում:

Բնականաբար, ինձ հետաքրքրում էր, թե cuáles թեմաներ են հրավիրում ավելի շատ ընթերցողի ակտիվություն: Ես հաշվեցա միջին դիտումների, քվեների և մեկնաբանությունների թիվը յուրաքանչյուր թեմայում: Вот что получилось:
- Ամենաուսումնասիրվող թեմաներ․ arduino, веб-дизайн, веб-разработка, дайджեստ, ссылки, css, html, html5, nginx, алгоритмы.
- Ամենատարածված "լայքեր" թեմաները՝ ՎԿ, ծիծաղ, jquery, opera, c, html, վեբ-առողջացում, html5, css, վեբ-դիզայն։
- Ամենադիտված թեմաները՝ opera, skype, ֆրիլանս, ՎԿ, ubuntu, աշխատանք, nokia, nginx, arduino, firefox։
Ի դեպ, քանի որ համեմատում եմ թեմաները, կարելի է կազմել նրանց վարկանիշը հաճախության հիման վրա (և համեմատել արդյունքները ).
- Քանի որ Հաբրը գոյություն ունի բազմաթիվ տարիների ընթացքում, ամենատարածված տեգերը (նշվելն ըստ նվազման) դարձել են google, android, javascript, microsoft, linux, php, apple, java, python, ծրագրավորում, ստարտափներ, զարգացում, ios, ստարտափ, սոցիալական ցանցեր։
- 2017 թվականին ամենատարածվածները եղել են javascript, python, java, android, զարգացում, linux, c++, ծրագրավորում, php, c#, ios, մեքենայական ուսուցում, տեղեկատվական անվտանգություն, microsoft, react։
Այս վարկանիշները համեմատելիս կարելի է ուշադրություն դարձնել, օրինակ, Պիտոնի հաղթարշավին և php-ի աշխարհից վերացմանը, կամ "ստարտափ խաղաղության" վերևում, և մեքենայական ուսուցման բարձունքին։
Չի կարելի ասել, որ բոլոր տեգերը Հաբրում ունեն ակնհայտ թեմատիկ կծիկ։ Օրինակ, ահա տասնյակ տեգեր, որոնք հանդիպել են միայն մեկ անգամ, սակայն շատ հետաքրքիր են ինձ համար։ Ահա՝ "տպավորություն առաջացնող գաղափար", "բեռնում դիսկի պատկերի միջոցով", "Այովայի մարզ", "դրամատուրգիա", "սուպերալեիա", "ձգողիչ շարժիչ", "ինչ անել շաբաթ օրը", "Ես ունեմ մակաբույծ մսաղացում", "մանրամասնություններն իրականում ինչպես միշտ", "մատակունակ թեգեր գյովը ունեի"։ Այսպիսի հոդվածների թեմատիկան որոշելու համար պարզապես տեգերը բավարար չեն, անհրաժեշտ է իրականացնել թեմատիկական մոդելավորում հոդվածների տեքստերի միջոցով։
Հոդվածների բովանդակության ավելի մանրամասն վերլուծությունն ունենալու է հաջորդ գրառման մեջ։ Առաջին հերթին ես նպատակ ունեմ կառուցել մոդել, որը կներառի հոդվածի հայցումների քանակը դրա բովանդակության հիման վրա։ Երկրորդ հերթին, ցանկանում եմ սովորեցնել նեյրոցանցը ստեղծել տեքստեր Հաբրի հեղինակների նման ոճում։ Հետևեք մեզ 🙂
P.S. Ահա և ներկառուցված .
Ընտանիք: habr.com
