ಒಂದು ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಎಲ್ಲಾ Habr

ಶುಭ ಅಪರಾಹ್ನ. ಬರೆದು 2 ವರ್ಷಗಳೇ ಕಳೆದಿವೆ. ಕೊನೆಯ ಲೇಖನ Habr ಪಾರ್ಸಿಂಗ್ ಬಗ್ಗೆ, ಮತ್ತು ಕೆಲವು ಅಂಕಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.

ನಾನು Habr ನ ನಕಲನ್ನು ಹೊಂದಲು ಬಯಸಿದಾಗ, ಲೇಖಕರ ಎಲ್ಲಾ ವಿಷಯವನ್ನು ಡೇಟಾಬೇಸ್‌ಗೆ ಉಳಿಸುವ ಪಾರ್ಸರ್ ಅನ್ನು ಬರೆಯಲು ನಾನು ನಿರ್ಧರಿಸಿದೆ. ಅದು ಹೇಗೆ ಸಂಭವಿಸಿತು ಮತ್ತು ನಾನು ಯಾವ ದೋಷಗಳನ್ನು ಎದುರಿಸಿದೆ - ನೀವು ಕಟ್ ಅಡಿಯಲ್ಲಿ ಓದಬಹುದು.

TLDR- ಡೇಟಾಬೇಸ್ ಲಿಂಕ್

ಪಾರ್ಸರ್‌ನ ಮೊದಲ ಆವೃತ್ತಿ. ಒಂದು ಎಳೆ, ಹಲವು ಸಮಸ್ಯೆಗಳು

ಮೊದಲಿಗೆ, ನಾನು ಸ್ಕ್ರಿಪ್ಟ್ ಮೂಲಮಾದರಿಯನ್ನು ಮಾಡಲು ನಿರ್ಧರಿಸಿದೆ, ಅದರಲ್ಲಿ ಲೇಖನವನ್ನು ಪಾರ್ಸ್ ಮಾಡಲಾಗುವುದು ಮತ್ತು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ತಕ್ಷಣ ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಇರಿಸಲಾಗುತ್ತದೆ. ಎರಡು ಬಾರಿ ಯೋಚಿಸದೆ, ನಾನು sqlite3 ಅನ್ನು ಬಳಸಿದ್ದೇನೆ, ಏಕೆಂದರೆ. ಇದು ಕಡಿಮೆ ಶ್ರಮದಾಯಕವಾಗಿತ್ತು: ಸ್ಥಳೀಯ ಸರ್ವರ್ ಅನ್ನು ಹೊಂದುವ ಅಗತ್ಯವಿಲ್ಲ, ರಚಿಸಲಾಗಿದೆ-ನೋಡಿದೆ-ಅಳಿಸಲ್ಪಟ್ಟಿದೆ ಮತ್ತು ಅಂತಹ ಸಂಗತಿಗಳು.

one_thread.py

from bs4 import BeautifulSoup
import sqlite3
import requests
from datetime import datetime

def main(min, max):
    conn = sqlite3.connect('habr.db')
    c = conn.cursor()
    c.execute('PRAGMA encoding = "UTF-8"')
    c.execute("CREATE TABLE IF NOT EXISTS habr(id INT, author VARCHAR(255), title VARCHAR(255), content  TEXT, tags TEXT)")

    start_time = datetime.now()
    c.execute("begin")
    for i in range(min, max):
        url = "https://m.habr.com/post/{}".format(i)
        try:
            r = requests.get(url)
        except:
            with open("req_errors.txt") as file:
                file.write(i)
            continue
        if(r.status_code != 200):
            print("{} - {}".format(i, r.status_code))
            continue

        html_doc = r.text
        soup = BeautifulSoup(html_doc, 'html.parser')

        try:
            author = soup.find(class_="tm-user-info__username").get_text()
            content = soup.find(id="post-content-body")
            content = str(content)
            title = soup.find(class_="tm-article-title__text").get_text()
            tags = soup.find(class_="tm-article__tags").get_text()
            tags = tags[5:]
        except:
            author,title,tags = "Error", "Error {}".format(r.status_code), "Error"
            content = "При парсинге этой странице произошла ошибка."

        c.execute('INSERT INTO habr VALUES (?, ?, ?, ?, ?)', (i, author, title, content, tags))
        print(i)
    c.execute("commit")
    print(datetime.now() - start_time)

main(1, 490406)

ಎಲ್ಲವೂ ಕ್ಲಾಸಿಕ್ ಆಗಿದೆ - ನಾವು ಬ್ಯೂಟಿಫುಲ್ ಸೂಪ್ ಅನ್ನು ಬಳಸುತ್ತೇವೆ, ವಿನಂತಿಗಳು ಮತ್ತು ತ್ವರಿತ ಮೂಲಮಾದರಿಯು ಸಿದ್ಧವಾಗಿದೆ. ಅದು ಕೇವಲ…

  • ಪುಟ ಡೌನ್‌ಲೋಡ್ ಒಂದು ಥ್ರೆಡ್‌ನಲ್ಲಿದೆ

  • ನೀವು ಸ್ಕ್ರಿಪ್ಟ್ನ ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆಯನ್ನು ಅಡ್ಡಿಪಡಿಸಿದರೆ, ನಂತರ ಸಂಪೂರ್ಣ ಡೇಟಾಬೇಸ್ ಎಲ್ಲಿಯೂ ಹೋಗುವುದಿಲ್ಲ. ಎಲ್ಲಾ ನಂತರ, ಎಲ್ಲಾ ಪಾರ್ಸಿಂಗ್ ನಂತರ ಮಾತ್ರ ಬದ್ಧತೆಯನ್ನು ನಡೆಸಲಾಗುತ್ತದೆ.
    ಸಹಜವಾಗಿ, ಪ್ರತಿ ಅಳವಡಿಕೆಯ ನಂತರ ನೀವು ಡೇಟಾಬೇಸ್‌ಗೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಬಹುದು, ಆದರೆ ನಂತರ ಸ್ಕ್ರಿಪ್ಟ್ ಎಕ್ಸಿಕ್ಯೂಶನ್ ಸಮಯವು ಗಮನಾರ್ಹವಾಗಿ ಹೆಚ್ಚಾಗುತ್ತದೆ.

  • ಮೊದಲ 100 ಲೇಖನಗಳನ್ನು ಪಾರ್ಸಿಂಗ್ ಮಾಡಲು ನನಗೆ 000 ಗಂಟೆಗಳು ಬೇಕಾಯಿತು.

ಮುಂದೆ ನಾನು ಬಳಕೆದಾರರ ಲೇಖನವನ್ನು ಕಂಡುಕೊಂಡಿದ್ದೇನೆ ಸಂಯೋಜಿಸಲಾಗಿದೆ, ನಾನು ಓದಿದ್ದೇನೆ ಮತ್ತು ಈ ಪ್ರಕ್ರಿಯೆಯನ್ನು ವೇಗಗೊಳಿಸಲು ಕೆಲವು ಲೈಫ್ ಹ್ಯಾಕ್‌ಗಳನ್ನು ಕಂಡುಕೊಂಡಿದ್ದೇನೆ:

  • ಮಲ್ಟಿಥ್ರೆಡಿಂಗ್ ಅನ್ನು ಬಳಸುವುದು ಕೆಲವೊಮ್ಮೆ ಡೌನ್‌ಲೋಡ್ ವೇಗವನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ.
  • ನೀವು ಹ್ಯಾಬರ್‌ನ ಪೂರ್ಣ ಆವೃತ್ತಿಯನ್ನು ಪಡೆಯುವುದಿಲ್ಲ, ಆದರೆ ಅದರ ಮೊಬೈಲ್ ಆವೃತ್ತಿಯನ್ನು ಪಡೆಯಬಹುದು.
    ಉದಾಹರಣೆಗೆ, ಡೆಸ್ಕ್‌ಟಾಪ್ ಆವೃತ್ತಿಯಲ್ಲಿ ಸಂಯೋಜಿತ ಲೇಖನವು 378 KB ತೂಗುತ್ತಿದ್ದರೆ, ಮೊಬೈಲ್ ಆವೃತ್ತಿಯಲ್ಲಿ ಅದು ಈಗಾಗಲೇ 126 KB ಆಗಿದೆ.

ಎರಡನೇ ಆವೃತ್ತಿ. ಅನೇಕ ಎಳೆಗಳು, Habr ನಿಂದ ತಾತ್ಕಾಲಿಕ ನಿಷೇಧ

ಪೈಥಾನ್‌ನಲ್ಲಿ ಮಲ್ಟಿಥ್ರೆಡಿಂಗ್ ವಿಷಯದ ಕುರಿತು ನಾನು ಇಂಟರ್ನೆಟ್ ಅನ್ನು ಹುಡುಕಿದಾಗ, ಮಲ್ಟಿಪ್ರೊಸೆಸಿಂಗ್.ಡಮ್ಮಿಯೊಂದಿಗೆ ನಾನು ಸರಳವಾದ ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿಕೊಂಡಿದ್ದೇನೆ, ಮಲ್ಟಿಥ್ರೆಡಿಂಗ್ ಜೊತೆಗೆ ಸಮಸ್ಯೆಗಳು ಕಾಣಿಸಿಕೊಂಡವು ಎಂದು ನಾನು ಗಮನಿಸಿದೆ.

SQLite3 ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಥ್ರೆಡ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಬಯಸುವುದಿಲ್ಲ.
ನಿವಾರಿಸಲಾಗಿದೆ check_same_thread=False, ಆದರೆ ಈ ದೋಷವು ಒಂದೇ ಅಲ್ಲ, ಡೇಟಾಬೇಸ್ಗೆ ಸೇರಿಸಲು ಪ್ರಯತ್ನಿಸುವಾಗ, ಕೆಲವೊಮ್ಮೆ ನಾನು ಪರಿಹರಿಸಲು ಸಾಧ್ಯವಾಗದ ದೋಷಗಳು ಸಂಭವಿಸುತ್ತವೆ.

ಆದ್ದರಿಂದ, ನಾನು ನೇರವಾಗಿ ಡೇಟಾಬೇಸ್‌ಗೆ ಲೇಖನಗಳ ತ್ವರಿತ ಅಳವಡಿಕೆಯನ್ನು ತ್ಯಜಿಸಲು ನಿರ್ಧರಿಸುತ್ತೇನೆ ಮತ್ತು ಸಂಯೋಜಿತ ಪರಿಹಾರವನ್ನು ನೆನಪಿನಲ್ಲಿಟ್ಟುಕೊಂಡು, ಫೈಲ್‌ಗಳನ್ನು ಬಳಸಲು ನಾನು ನಿರ್ಧರಿಸುತ್ತೇನೆ, ಏಕೆಂದರೆ ಫೈಲ್‌ಗೆ ಬಹು-ಥ್ರೆಡ್ ಬರವಣಿಗೆಯಲ್ಲಿ ಯಾವುದೇ ಸಮಸ್ಯೆಗಳಿಲ್ಲ.

ಮೂರಕ್ಕಿಂತ ಹೆಚ್ಚು ಥ್ರೆಡ್‌ಗಳನ್ನು ಬಳಸುವುದಕ್ಕಾಗಿ Habr ನಿಷೇಧಿಸಲು ಪ್ರಾರಂಭಿಸುತ್ತದೆ.
ಹಬರ್‌ಗೆ ಹೋಗಲು ವಿಶೇಷವಾಗಿ ಉತ್ಸಾಹಭರಿತ ಪ್ರಯತ್ನಗಳು ಒಂದೆರಡು ಗಂಟೆಗಳ ಕಾಲ ಐಪಿ ನಿಷೇಧದೊಂದಿಗೆ ಕೊನೆಗೊಳ್ಳಬಹುದು. ಆದ್ದರಿಂದ ನೀವು ಕೇವಲ 3 ಎಳೆಗಳನ್ನು ಮಾತ್ರ ಬಳಸಬೇಕಾಗುತ್ತದೆ, ಆದರೆ ಇದು ಈಗಾಗಲೇ ಉತ್ತಮವಾಗಿದೆ, ಏಕೆಂದರೆ 100 ಕ್ಕೂ ಹೆಚ್ಚು ಲೇಖನಗಳನ್ನು ಪುನರಾವರ್ತಿಸುವ ಸಮಯವನ್ನು 26 ರಿಂದ 12 ಸೆಕೆಂಡುಗಳವರೆಗೆ ಕಡಿಮೆ ಮಾಡಲಾಗಿದೆ.

ಈ ಆವೃತ್ತಿಯು ಅಸ್ಥಿರವಾಗಿದೆ ಮತ್ತು ನಿಯತಕಾಲಿಕವಾಗಿ ಡೌನ್‌ಲೋಡ್ ಮಾಡುವುದು ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ ಲೇಖನಗಳ ಮೇಲೆ ಬೀಳುತ್ತದೆ ಎಂಬುದು ಗಮನಿಸಬೇಕಾದ ಸಂಗತಿ.

async_v1.py

from bs4 import BeautifulSoup
import requests
import os, sys
import json
from multiprocessing.dummy import Pool as ThreadPool
from datetime import datetime
import logging

def worker(i):
    currentFile = "files\{}.json".format(i)

    if os.path.isfile(currentFile):
        logging.info("{} - File exists".format(i))
        return 1

    url = "https://m.habr.com/post/{}".format(i)

    try: r = requests.get(url)
    except:
        with open("req_errors.txt") as file:
            file.write(i)
        return 2

    # Запись заблокированных запросов на сервер
    if (r.status_code == 503):
        with open("Error503.txt", "a") as write_file:
            write_file.write(str(i) + "n")
            logging.warning('{} / 503 Error'.format(i))

    # Если поста не существует или он был скрыт
    if (r.status_code != 200):
        logging.info("{} / {} Code".format(i, r.status_code))
        return r.status_code

    html_doc = r.text
    soup = BeautifulSoup(html_doc, 'html5lib')

    try:
        author = soup.find(class_="tm-user-info__username").get_text()

        timestamp = soup.find(class_='tm-user-meta__date')
        timestamp = timestamp['title']

        content = soup.find(id="post-content-body")
        content = str(content)
        title = soup.find(class_="tm-article-title__text").get_text()
        tags = soup.find(class_="tm-article__tags").get_text()
        tags = tags[5:]

        # Метка, что пост является переводом или туториалом.
        tm_tag = soup.find(class_="tm-tags tm-tags_post").get_text()

        rating = soup.find(class_="tm-votes-score").get_text()
    except:
        author = title = tags = timestamp = tm_tag = rating = "Error" 
        content = "При парсинге этой странице произошла ошибка."
        logging.warning("Error parsing - {}".format(i))
        with open("Errors.txt", "a") as write_file:
            write_file.write(str(i) + "n")

    # Записываем статью в json
    try:
        article = [i, timestamp, author, title, content, tm_tag, rating, tags]
        with open(currentFile, "w") as write_file:
            json.dump(article, write_file)
    except:
        print(i)
        raise

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("Необходимы параметры min и max. Использование: async_v1.py 1 100")
        sys.exit(1)
    min = int(sys.argv[1])
    max = int(sys.argv[2])

    # Если потоков >3
    # то хабр банит ipшник на время
    pool = ThreadPool(3)

    # Отсчет времени, запуск потоков
    start_time = datetime.now()
    results = pool.map(worker, range(min, max))

    # После закрытия всех потоков печатаем время
    pool.close()
    pool.join()
    print(datetime.now() - start_time)

ಮೂರನೇ ಆವೃತ್ತಿ. ಅಂತಿಮ

ಎರಡನೇ ಆವೃತ್ತಿಯನ್ನು ಡೀಬಗ್ ಮಾಡುವಾಗ, ಸೈಟ್‌ನ ಮೊಬೈಲ್ ಆವೃತ್ತಿಯು ಪ್ರವೇಶಿಸುವ API ಅನ್ನು ಹಬರ್ ಇದ್ದಕ್ಕಿದ್ದಂತೆ ಹೊಂದಿದೆ ಎಂದು ನಾನು ಕಂಡುಹಿಡಿದಿದ್ದೇನೆ. ಇದು ಮೊಬೈಲ್ ಆವೃತ್ತಿಗಿಂತ ವೇಗವಾಗಿ ಲೋಡ್ ಆಗುತ್ತದೆ, ಏಕೆಂದರೆ ಇದು ಕೇವಲ json ಆಗಿರುವುದರಿಂದ ಪಾರ್ಸ್ ಮಾಡುವ ಅಗತ್ಯವಿಲ್ಲ. ಕೊನೆಯಲ್ಲಿ, ನನ್ನ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಮತ್ತೆ ಬರೆಯಲು ನಾನು ನಿರ್ಧರಿಸಿದೆ.

ಆದ್ದರಿಂದ, ಕಂಡುಕೊಂಡ ನಂತರ ಈ ಲಿಂಕ್ API, ನೀವು ಅದನ್ನು ಪಾರ್ಸ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಬಹುದು.

async_v2.py

import requests
import os, sys
import json
from multiprocessing.dummy import Pool as ThreadPool
from datetime import datetime
import logging

def worker(i):
    currentFile = "files\{}.json".format(i)

    if os.path.isfile(currentFile):
        logging.info("{} - File exists".format(i))
        return 1

    url = "https://m.habr.com/kek/v1/articles/{}/?fl=ru%2Cen&hl=ru".format(i)

    try:
        r = requests.get(url)
        if r.status_code == 503:
            logging.critical("503 Error")
            return 503
    except:
        with open("req_errors.txt") as file:
            file.write(i)
        return 2

    data = json.loads(r.text)

    if data['success']:
        article = data['data']['article']

        id = article['id']
        is_tutorial = article['is_tutorial']
        time_published = article['time_published']
        comments_count = article['comments_count']
        lang = article['lang']
        tags_string = article['tags_string']
        title = article['title']
        content = article['text_html']
        reading_count = article['reading_count']
        author = article['author']['login']
        score = article['voting']['score']

        data = (id, is_tutorial, time_published, title, content, comments_count, lang, tags_string, reading_count, author, score)
        with open(currentFile, "w") as write_file:
            json.dump(data, write_file)

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("Необходимы параметры min и max. Использование: asyc.py 1 100")
        sys.exit(1)
    min = int(sys.argv[1])
    max = int(sys.argv[2])

    # Если потоков >3
    # то хабр банит ipшник на время
    pool = ThreadPool(3)

    # Отсчет времени, запуск потоков
    start_time = datetime.now()
    results = pool.map(worker, range(min, max))

    # После закрытия всех потоков печатаем время
    pool.close()
    pool.join()
    print(datetime.now() - start_time)

ಇದು ಲೇಖನಕ್ಕೆ ಮತ್ತು ಅದನ್ನು ಬರೆದ ಲೇಖಕರಿಗೆ ಸಂಬಂಧಿಸಿದ ಕ್ಷೇತ್ರಗಳನ್ನು ಒಳಗೊಂಡಿದೆ.

API.png

ಒಂದು ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಎಲ್ಲಾ Habr

ನಾನು ಪ್ರತಿ ಲೇಖನದ ಪೂರ್ಣ json ಅನ್ನು ಡಂಪ್ ಮಾಡಲಿಲ್ಲ, ಆದರೆ ನನಗೆ ಅಗತ್ಯವಿರುವ ಕ್ಷೇತ್ರಗಳನ್ನು ಮಾತ್ರ ಉಳಿಸಿದೆ:

  • id
  • ಇದು_ಟ್ಯುಟೋರಿಯಲ್
  • ಸಮಯ_ಪ್ರಕಟಿಸಲಾಗಿದೆ
  • ಶೀರ್ಷಿಕೆ
  • ವಿಷಯ
  • ಕಾಮೆಂಟ್‌ಗಳು_ಎಣಿಕೆ
  • ಲ್ಯಾಂಗ್ ಎಂಬುದು ಲೇಖನವನ್ನು ಬರೆಯುವ ಭಾಷೆಯಾಗಿದೆ. ಇಲ್ಲಿಯವರೆಗೆ, ಇದು ಎನ್ ಮತ್ತು ರು ಮಾತ್ರ.
  • tags_string - ಪೋಸ್ಟ್‌ನಿಂದ ಎಲ್ಲಾ ಟ್ಯಾಗ್‌ಗಳು
  • ಓದುವ_ಎಣಿಕೆ
  • ಲೇಖಕ
  • ಸ್ಕೋರ್ - ಲೇಖನ ರೇಟಿಂಗ್.

ಹೀಗಾಗಿ, API ಅನ್ನು ಬಳಸಿಕೊಂಡು, ನಾನು ಸ್ಕ್ರಿಪ್ಟ್ ಎಕ್ಸಿಕ್ಯೂಶನ್ ಸಮಯವನ್ನು 8 url ಗೆ 100 ಸೆಕೆಂಡುಗಳಿಗೆ ಕಡಿಮೆ ಮಾಡಿದ್ದೇನೆ.

ನಮಗೆ ಅಗತ್ಯವಿರುವ ಡೇಟಾವನ್ನು ನಾವು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ನಂತರ, ನಾವು ಅದನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಬೇಕು ಮತ್ತು ಅದನ್ನು ಡೇಟಾಬೇಸ್‌ಗೆ ನಮೂದಿಸಬೇಕು. ಇದರೊಂದಿಗೆ ನನಗೆ ಯಾವುದೇ ಸಮಸ್ಯೆಗಳಿಲ್ಲ:

parser.py

import json
import sqlite3
import logging
from datetime import datetime

def parser(min, max):
    conn = sqlite3.connect('habr.db')
    c = conn.cursor()
    c.execute('PRAGMA encoding = "UTF-8"')
    c.execute('PRAGMA synchronous = 0') # Отключаем подтверждение записи, так скорость увеличивается в разы.
    c.execute("CREATE TABLE IF NOT EXISTS articles(id INTEGER, time_published TEXT, author TEXT, title TEXT, content TEXT, 
    lang TEXT, comments_count INTEGER, reading_count INTEGER, score INTEGER, is_tutorial INTEGER, tags_string TEXT)")
    try:
        for i in range(min, max):
            try:
                filename = "files\{}.json".format(i)
                f = open(filename)
                data = json.load(f)

                (id, is_tutorial, time_published, title, content, comments_count, lang,
                 tags_string, reading_count, author, score) = data

                # Ради лучшей читаемости базы можно пренебречь читаемостью кода. Или нет?
                # Если вам так кажется, можно просто заменить кортеж аргументом data. Решать вам.

                c.execute('INSERT INTO articles VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', (id, time_published, author,
                                                                                        title, content, lang,
                                                                                        comments_count, reading_count,
                                                                                        score, is_tutorial,
                                                                                        tags_string))
                f.close()

            except IOError:
                logging.info('FileNotExists')
                continue

    finally:
        conn.commit()

start_time = datetime.now()
parser(490000, 490918)
print(datetime.now() - start_time)

Статистика

ಸರಿ, ಸಾಂಪ್ರದಾಯಿಕವಾಗಿ, ಅಂತಿಮವಾಗಿ, ನೀವು ಡೇಟಾದಿಂದ ಕೆಲವು ಅಂಕಿಅಂಶಗಳನ್ನು ಹೊರತೆಗೆಯಬಹುದು:

  • ನಿರೀಕ್ಷಿತ 490 ಡೌನ್‌ಲೋಡ್‌ಗಳಲ್ಲಿ, ಕೇವಲ 406 ಲೇಖನಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ. ಹ್ಯಾಬ್ರೆಯಲ್ಲಿನ ಅರ್ಧಕ್ಕಿಂತ ಹೆಚ್ಚು (228) ಲೇಖನಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ ಎಂದು ಅದು ತಿರುಗುತ್ತದೆ.
  • ಸುಮಾರು ಅರ್ಧ ಮಿಲಿಯನ್ ಲೇಖನಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಸಂಪೂರ್ಣ ಡೇಟಾಬೇಸ್ 2.95 GB ತೂಗುತ್ತದೆ. ಸಂಕುಚಿತ ರೂಪದಲ್ಲಿ - 495 MB.
  • ಒಟ್ಟಾರೆಯಾಗಿ, 37804 ಜನರು ಹಬ್ರೆ ಲೇಖಕರು. ಈ ಅಂಕಿಅಂಶಗಳು ಲೈವ್ ಪೋಸ್ಟ್‌ಗಳಿಂದ ಮಾತ್ರ ಎಂದು ನಾನು ನಿಮಗೆ ನೆನಪಿಸುತ್ತೇನೆ.
  • ಹಬ್ರೆಯಲ್ಲಿ ಹೆಚ್ಚು ಉತ್ಪಾದಕ ಲೇಖಕ - ಅಲಿಜಾರ್ - 8774 ಲೇಖನಗಳು.
  • ಉನ್ನತ ಶ್ರೇಣಿಯ ಲೇಖನ - 1448 ಪ್ಲಸಸ್
  • ಹೆಚ್ಚು ಓದಿದ ಲೇಖನ – 1660841 ವೀಕ್ಷಣೆಗಳು
  • ಹೆಚ್ಚು ಚರ್ಚಿಸಿದ ಲೇಖನ - 2444 ಕಾಮೆಂಟ್‌ಗಳು

ಸರಿ, ಟಾಪ್ಸ್ ರೂಪದಲ್ಲಿಟಾಪ್ 15 ಲೇಖಕರುಒಂದು ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಎಲ್ಲಾ Habr
ರೇಟಿಂಗ್ ಮೂಲಕ ಟಾಪ್ 15ಒಂದು ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಎಲ್ಲಾ Habr
ಟಾಪ್ 15 ಓದಿದೆಒಂದು ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಎಲ್ಲಾ Habr
ಟಾಪ್ 15 ಚರ್ಚಿಸಲಾಗಿದೆಒಂದು ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಎಲ್ಲಾ Habr

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ