पदों और ग्राहकों द्वारा हब और कंपनियों की रेटिंग

फिलहाल हब पर करीब 350 हब हैं । साइट की कार्यक्षमता आपको उन्हें नाम और इंडेक्स द्वारा क्रमबद्ध करने की अनुमति देती है। और अन्य मापदंडों के लिए - उदाहरण के लिए , पदों की संख्या - नहीं, लेकिन मैं चाहूंगा।

मैं हब पोस्टों के लेख की रेटिंग से प्रेरित था, और मैंने एक समान बनाने का फैसला किया, लेकिन खुद को हब की रेटिंग बनाने के लिए।

लेख के पहले भाग में मैं आपको हब और कंपनियों की रेटिंग के साथ-साथ उनके एक छोटे से विश्लेषण को प्रस्तुत करूंगा। और दूसरे में - मैं विस्तार से लिखूंगा कि कैसे मैंने जावा में JSoup लाइब्रेरी का उपयोग करते हुए हाबरा के HTML पेजों का उपयोग किया, जो कि मेरे लिए दिलचस्प घटनाएं और समस्याएं थीं। और लेख के अंत में मैं कार्यक्रम का पूर्ण स्रोत कोड तैयार करूंगा।



वेब पेज के रूप में सभी 4 रेटिंग (पूर्ण)

हब रेटिंग

पदों की संख्या से
कोठरी 35 971
मैं पीआर 5 461 हूं
वेब डेवलपमेंट 4 011
सूचना सुरक्षा 3 385
Google 2,770
लोहा २ Iron३३
गैजेट्स। बूम के लिए डिवाइस 2,375
प्रोग्रामिंग 2,293
लिनक्स 2 235
Android 1 965
जावास्क्रिप्ट १ ६ 1
Apple 1,612
हबहरब 1 568
.NET 1,485
PHP 1 465
सिस्टम एडमिनिस्ट्रेशन 1,454
DIY या DIY 1 442
विकास 1 331
परियोजना प्रबंधन 1,261
इंटरफेस 1 257
Microsoft 1 237
खेल विकास 1 218
खुला स्रोत 1 110
स्मार्टफोन और संचारक 1,091
जावा 1,020
आईटी 996 पर डिजाइन
एल्गोरिदम 991
कॉपीराइट 982
सामाजिक नेटवर्क और समुदाय 949
GTD 939
विंडोज 919
आईटी 916 में शैक्षिक प्रक्रिया
पायथन 866
रोबोटिक्स 798
Android 783 के लिए विकास
IOS 777 के लिए विकास
होस्टिंग 749
सी ++ 711
विधान और आईटी व्यवसाय नया 677
मीडिया 664
(...)
तुम्बल
घनघोर
औद्योगिक प्रोग्रामिंग नया
जूलिया नया
माइक्रोसॉफ्ट एक्सेस 2
विकास हैकिंग नई 2
Google चेकआउट
माइस्पेस 0
Xcode नया 0
SCADA नया 0

जब मैंने हब्स को सॉर्ट किया, तो दिलचस्प चीजें दिखाई गईं। उदाहरण के लिए, मुझे नहीं पता था कि शून्य पदों के साथ हब थे। और उनमें से 4 थे! इसके अलावा, उनमें से प्रत्येक के लिए 500 से अधिक लोग सदस्यता लेते हैं।

तीन हब - चुलान , मैं पीआर और वेब विकास - पदों की संख्या और पाठकों की संख्या के मामले में अग्रणी हैं। कोठरी 1 जगह पर है क्योंकि प्रशासन वहां के लेख हटा देता है। इसके बाद सूचना सुरक्षा आती है, जो हब पर बेहद लोकप्रिय है।

दुर्भाग्य से, मुझे अभी भी समझ में नहीं आया कि हबराब्र हब एक ऑफटॉपिक क्यों है। पदों की संख्या से, वह 13 वें स्थान पर होगा , और उसके ग्राहकों के पास > 80K है । यह पता चला है कि एक साइट पर उसी साइट के बारे में लिखना विषय से प्रस्थान है?

यह निराशाजनक था कि जावा हब उतना ऊंचा नहीं है जितना हम चाहेंगे।

रेटिंग कंपनियों

हालाँकि शुरू में मैंने केवल हब के लिए रेटिंग बनाने की योजना बनाई थी, लेख में टिप्पणी में उन्होंने एक अच्छा विचार रखा - कंपनियों के लिए भी ऐसा ही करने के लिए। कोड को ज्यादा बदलना नहीं था।

बहुत सारी कंपनियां हैं - 1343। इसलिए, मैं केवल TOP-30 और अंतिम 10 कंपनियों को पोस्ट करूंगा। यह एक दिलचस्प बिंदु है - किसी कारण के लिए, हैब्रेट सब कुछ (1331) दिखाता है, हालांकि मेरे कार्यक्रम ने उनमें से 1343 की गिनती की - और वास्तव में, यह सही है। यदि आप उन्हें मैन्युअल रूप से गिनते हैं - तो 20 कंपनियों द्वारा पेज 67 की संख्या को गुणा करें और यहां तक ​​कि 3 - यह 1343 निकला।


शुरू करने के लिए, मुझे इस तथ्य से आश्चर्य हुआ कि 2 प्रकार की कंपनी अनुपस्थिति हैं - "कंपनी निष्क्रिय है" और "पृष्ठ नहीं मिला"। हालांकि मैं दोहराता हूं - सभी कंपनियों को सूची से लिया गया था। पहला दृश्य मैंने पदों की संख्या -2 के साथ चिह्नित किया। ऐसी कंपनियों की संख्या बहुत ज्यादा है। और तीन कंपनियों, जिनमें से नाम संख्याओं के हैं, "पृष्ठ नहीं मिला है।" मैंने उन्हें चिह्नित किया -3। ऐसी बातें हैं। शून्य पदों वाली कंपनियों से भी भरा - उदाहरण के लिए, Apple । मुझे आश्चर्य है कि कंपनी के लिए एक खाता क्यों बनाएं और उससे बिल्कुल न लिखें?

दरअसल, अगर हब पर पंजीकृत 1343 लोगों में से हम गैर-मौजूद और बिना पोस्ट वाली कंपनियों को हटाते हैं, तो केवल 321 हैं। ऐसी चीजें होंगी।

डिज़ाइन

बहुत लंबे समय तक मैंने हब्रहाब आपी का पता लगाने की कोशिश की। जैसा कि यह निकला, यह बंद है और अभी भी विकास के अधीन है। हालाँकि, support@habrahabr.ru के साथ पत्राचार में उन्होंने मुझे बताया कि उनके पेजों को पार्स करने के खिलाफ उनके पास कुछ भी नहीं है। वास्तव में, यह ठीक उसी तरह है जैसे एंड्रॉइड काम के लिए हेबरक्लेयर्स (फिलहाल)।

जब यह "खुद के लिए" परियोजनाओं की बात आती है, तो मैं अपने प्यारे जावा को चुनता हूं। उसने मुझे इस बार या तो नीचे नहीं जाने दिया - JSoup लाइब्रेरी ने मुझे कुछ पंक्तियों में HTML पृष्ठ से आवश्यक डेटा प्राप्त करने की अनुमति दी। लेकिन पहले चर्चा करते हैं कि हब कैसे काम करता है।

हब के साथ पृष्ठ habrahabr.ru/hubs/pageN/ पर स्थित हैं, जहां N 1 से एक नंबर है। इसलिए, यदि हम सभी हब की पूरी सूची प्राप्त करना चाहते हैं, तो हमें इन पृष्ठों को डाउनलोड करने और उनका विश्लेषण करने की आवश्यकता है, जब तक कि वे समाप्त न हों। प्रत्येक पृष्ठ पर हब की सूची है। सूची आइटम प्रारूप बहुत सरल है और पार्स करने में आसान है। यह इस तरह दिखता है:
<div class="hub " id="hub_50"> <div class="habraindex">1 280,58</div> <div class="info"> <div class="title"> <a href="http://habrahabr.ru/hub/infosecurity/"> </a> <span class="profiled_hub" title=" "></span> </div> <div class="buttons"> <input type="button" class="mini blue subscribeHub" value="" data-id="50"> <input type="button" class="mini hidden unsubscribeHub" value="" data-id="50" "=""> </div> <div class="clear"></div> <div class="stat"><a href="http://habrahabr.ru/hub/infosecurity/subscribers/" class="members_count">91741 </a>, <a href="http://habrahabr.ru/hub/infosecurity/posts/">3385 </a><a></a></div><a> </a></div><a> </a></div> 


आइए एक विधि लिखें जो हमें साइट पर सभी हब की सूची लौटाए:
 static List<Hub> getAllHubs() { ArrayList<Hub> fullHubsList = new ArrayList<>(); String urlHubsIncomplete = "http://habrahabr.ru/hubs/page"; int pageNum = 1; do { String urlHubs = urlHubsIncomplete + pageNum; try { Document doc = Jsoup.connect(urlHubs).get(); Elements hubs = doc.select(".hub"); if (hubs.size() == 0) { break; } for (Element hubElem : hubs) { Hub hub = new Hub(hubElem); fullHubsList.add(hub); } pageNum++; } catch (Exception e) { e.printStackTrace(); break; } } while (true); return fullHubsList; } 

हम लूप करते हुए अनंत को स्पिन करते हैं, प्रत्येक पुनरावृत्ति के साथ एक नया URL बनाते हैं। फिर, Jsoup.connect (urlHubs) .get () का उपयोग करके हम हब और उनके मापदंडों की एक सूची के साथ सीधे एक HTML दस्तावेज़ प्राप्त करते हैं। जैसा कि आप देख सकते हैं, हब सूचना हब में एक हब वर्ग है, और doc.select ("हब") को कॉल करके , हमें इन तत्वों की एक सूची मिलती है। यदि इसका आकार शून्य है - इसका मतलब है कि हम पिछले पृष्ठ से गुजरे हैं और पहले से ही सभी हब का विश्लेषण कर चुके हैं - फिर हम लूप से बाहर निकलते हैं।

इसके बाद, हम सभी हब तत्वों के माध्यम से जाते हैं और प्रत्येक के लिए एक प्रकार का हब बनाते हैं, जो हमारे org.jsoup.nodes.Element को पास करते हैं। इसमें ऊपर के समान प्रारूप में HTML कोड है। अब सब कुछ अमूर्त करते हैं। इसके लिए, OOP मौजूद है। इससे पहले कि हम केवल ऊपर प्रस्तुत HTML का टुकड़ा है, और जिस वर्ग में इसे crammed करने की आवश्यकता है। आइए हमारी कक्षा के लिए एक रूपरेखा लिखें:
 import org.jsoup.nodes.Element; public class Hub { String title; int posts; boolean profiled; int membersCount; float habraindex; String url; public Hub(Element hubElem) { } } 

आइए एक रचनाकार लिखें। आरंभ करने के लिए, सबसे सरल काम करते हैं - हेडर टैग से डेटा प्राप्त करें। ऐसा करने के लिए, हम पहले फॉर्म के div को निकालते हैं
 <div class="title"> <a href="http://habrahabr.ru/hub/infosecurity/"> </a> <span class="profiled_hub" title=" "></span> </div> 

पारसिम के माध्यम से
 Element titleDiv = hubElem.select(".title").get(0); Element tagA = titleDiv.getElementsByTag("a").get(0); title = tagA.text(); url = tagA.attr("href"); profiled = (hubElem.select(".profiled_hub").size() != 0); 

अगला, हम ग्राहकों और पदों की संख्या को पार्स करना चाहते हैं - वास्तव में पैरामीटर जिसके द्वारा हम सॉर्ट करेंगे। लेकिन तुरंत ही हम पहली समस्या का सामना करते हैं - टैग में स्ट्रिंग "91741 सब्सक्राइबर" शामिल हैं , जिसे हम सिर्फ ले नहीं सकते हैं और इसे पूर्णांक में बदल सकते हैं - इसमें अक्षर शामिल हैं! यहाँ, नियमित अभिव्यक्ति हमारी सहायता के लिए आती है । हम जल्दी से एक चतुर विधि लिखते हैं जो एक स्ट्रिंग प्राप्त करता है और संख्याओं को छोड़कर इसमें से सब कुछ काट देता है, और यहां तक ​​कि परिणाम को इंट में बदल देता है। \ D एक संख्या नहीं है, लेकिन + - "1 या अधिक बार होता है।" यानी इस मामले में हम अक्षरों को शून्य से बदल रहे हैं।
 private int getNumbers(String str) { String numbers = str.replaceAll("\\D+", ""); return Integer.valueOf(numbers); } 

अब हम पहले से ही एक शांत आत्मा के साथ अपने मूल्यों को प्राप्त कर सकते हैं:
 String membersCountFullStr = hubElem.select(".members_count").get(0).text(); membersCount = getNumbers(membersCountFullStr); String statFullStr = hubElem.select(".stat").get(0).getAllElements().get(2).text(); posts = getNumbers(statFullStr); 

सिद्धांत रूप में, यह रुक सकता है, लेकिन हित के लिए मैंने हब के बारे में सभी संभावित जानकारी निकालने का फैसला किया। यहाँ एक बहुत ही रोचक दूसरी समस्या उत्पन्न हुई, जो लेख का मुख्य आकर्षण होगी। कैसे एक Habraindex पार्स करने के लिए?

शुरू करने के लिए, आपको अल्पविराम को एक अवधि के साथ बदलना चाहिए और अतिरिक्त रिक्त स्थान को हटा देना चाहिए। लेकिन इतना ही काफी नहीं है! यदि आप कोड को कॉपी करते हैं और कोड - डबल.वल्यूऑफ़ ("- 1.11") में पेस्ट करते हैं, तो पार्सर अभी भी एक त्रुटि देता है। और यदि आप मैन्युअल रूप से एक ही नंबर दर्ज करते हैं - सब कुछ ठीक है। और नेत्रहीन मेरे विचार में वे बिल्कुल समान दिखते हैं!

यह पता चला है कि हब्बर डिजाइनरों ने केवल माइनस के बजाय डैश का उपयोग किया है - एक अलग वर्ण कोड के साथ, और निश्चित रूप से, यह अपने पार्सर को नहीं खाता है। ध्यान दें। समस्या का सार इस प्रकार है :
 System.out.println((int)'-');//45 System.out.println((int)'–');//8211 

एक बार, मेरे लेख ट्रिकी जावा टास्क में, मैंने एक कैच की जांच की , जब एल को छोटे से अलग नहीं किया जा सकता है 1. वास्तव में, अब मैं एक समान समस्या में भाग गया।

इसलिए, Habraindex को पुनर्प्राप्त करने के लिए कोड थोड़ा अधिक जटिल होगा:
 String rawHabraIndex = hubElem.select(".habraindex").get(0).text();//1 265,92 char minus = 45;//'-' char dash = 8211;//'–' String niceHabraIndex = rawHabraIndex.replaceAll(" ", "").replace(",", ".").replace(dash,minus);//1266.72 habraindex = Float.valueOf(niceHabraIndex); 

अगला, हब के लिए एक नेस्टेड स्थिर वर्ग के रूप में एक पोस्ट तुलनित्र लिखें
 public static class ComparePosts implements Comparator<Hub> { @Override public int compare(Hub o1, Hub o2) { return o2.posts - o1.posts; } } 

और इसके द्वारा मुख्य रूप से कहीं छाँटें
 List<Hub> hubs = getAllHubs(); Collections.sort(hubs, new Hub.ComparePosts()); 

सब कुछ, कार्य पूरा हो गया है! ग्राहकों की संख्या के साथ समान है। इसके बाद, मैंने कोड लिखा जो कंसोल में दो सूचियों को इस तरह प्रदर्शित करता है कि उन्हें तुरंत लेख में डाला जा सके - और मैंने इसे पहले किया था।

सभी हब को प्राप्त करने में लगभग 10 सेकंड का समय लगता है। सोर्स कोड यहां से डाउनलोड किया जा सकता है । हम इस तरह से निर्माण करते हैं और चलाते हैं, Jsoup को स्थापित करने और अपने साथ पथ को बदलने की भूल नहीं करते हैं:
 javac -cp .;"C:\prog\lib\jsoup-1.7.3.jar" com/kciray/habrahubs/Main.java java -cp .;"C:\prog\lib\jsoup-1.7.3.jar" com.kciray.habrahubs.Main 

इसके अलावा, मैं कंपनियों पर आंकड़े एकत्र करने के लिए समान वर्गों को फिर से तैयार करता हूं। वहां, ऐसा प्रतीत होता है, सब कुछ समान है - हालांकि, कंपनी के ब्लॉग पर पदों की संख्या का पता लगाने के लिए, मुझे व्यक्तिगत रूप से प्रत्येक के लिए एक पृष्ठ लोड करना पड़ा - और इसमें लगभग 5 मिनट का समय लगा। मैंने चीजों को गति देने के लिए एक मल्टीथ्रेडेड डाउनलोड किया। पाया कि एक ही समय में 5-7 से अधिक पृष्ठों को लोड करने की अनुमति नहीं देता है। दरअसल, ArrayList <CompanyBlog> को क्रमबद्ध किया और इसे लिखा। यह 100 किलोबाइट फ़ाइल दूसरे स्रोत के साथ है - आप इसके साथ काम कर सकते हैं।

यदि आप पूर्ण रेटिंग और अधिक कॉम्पैक्ट रूप में रुचि रखते हैं - मैंने इसे वेब पेज के रूप में पोस्ट किया है।

Source: https://habr.com/ru/post/In211775/


All Articles