เชถเซเชญ เชฌเชชเซเชฐ. เช เชฒเชเชพเชฏเชพเชจเซ 2 เชตเชฐเซเชท เชฅเช เชเชฏเชพ เชเซ.
เชเซเชฏเชพเชฐเซ เชนเซเช 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 เชคเชฐเชซเชฅเซ เชเชพเชฎเชเชฒเชพเช เชชเซเชฐเชคเชฟเชฌเชเชง
เชเซเชฏเชพเชฐเซ เชฎเซเช python เชฎเชพเช เชฎเชฒเซเชเชฟเชฅเซเชฐเซเชกเซเชเชเชจเชพ เชตเชฟเชทเชฏ เชชเชฐ เชเชจเซเชเชฐเชจเซเชเชจเซ เชคเชชเชพเชธ เชเชฐเซ, เชคเซเชฏเชพเชฐเซ เชฎเซเช multiprocessing.dummy เชธเชพเชฅเซเชจเซ เชธเซเชฅเซ เชธเชฐเชณ เชตเชฟเชเชฒเซเชช เชชเชธเชเชฆ เชเชฐเซเชฏเซ, เชฎเซเช เชเซเชฏเซเช เชเซ เชฎเชฒเซเชเชฟเชฅเซเชฐเซเชกเซเชเช เชธเชพเชฅเซ เชธเชฎเชธเซเชฏเชพเช เชฆเซเชเชพเชฏ เชเซ.
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)
เชคเซเชฐเซเชเซเช เชธเชเชธเซเชเชฐเชฃ. เช เชเชคเชฟเชฎ
เชฌเซเชเชพ เชธเชเชธเซเชเชฐเชฃเชจเซ เชกเชฟเชฌเช เชเชฐเชคเซ เชตเชเชคเซ, เชฎเซเช เชถเซเชงเซเชฏเซเช เชเซ Habr, เช เชเชพเชจเช, เชเช API เชเซ เชเซ เชธเชพเชเชเชจเซเช เชฎเซเชฌเชพเชเชฒ เชธเชเชธเซเชเชฐเชฃ เชเชเซเชธเซเชธ เชเชฐเซ เชเซ. เชคเซ เชฎเซเชฌเชพเชเชฒ เชธเชเชธเซเชเชฐเชฃ เชเชฐเชคเชพเช เชตเชงเซ เชเชกเชชเชฅเซ เชฒเซเชก เชฅเชพเชฏ เชเซ, เชเชพเชฐเชฃ เชเซ เชคเซ เชฎเชพเชคเซเชฐ json เชเซ, เชเซเชจเซ เชชเชฆเชเซเชเซเชฆเชจ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชฃ เชจเชฅเซ. เช เชเชคเซ, เชฎเซเช เชฎเชพเชฐเซ เชธเซเชเซเชฐเชฟเชชเซเช เชซเชฐเซเชฅเซ เชฒเชเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช.
เชคเซเชฅเซ, เชฎเชณเซ เชเชตเซ
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
เชฎเซเช เชฆเชฐเซเช เชฒเซเชเชจเซ เชธเชเชชเซเชฐเซเชฃ json เชกเชฎเซเชช เชเชฐเซเชฏเซ เชจเชฅเซ, เชชเชฐเชเชคเซ เชฎเชจเซ เชเชฐเซเชฐเซ เชซเซเชฒเซเชกเซเชธ เช เชธเชพเชเชตเซเชฏเชพ เชเซ:
- id
- เชเซ_เชเซเชฏเซเชเซเชฐเซเชฏเชฒ
- เชธเชฎเชฏ_เชชเซเชฐเชเชพเชถเชฟเชค
- เชถเซเชฐเซเชทเช
- เชธเชพเชฎเชเซเชฐเซ
- เชเชฟเชชเซเชชเชฃเซเช_เชเชฃเชคเชฐเซ
- lang เช เชญเชพเชทเชพ เชเซ เชเซเชฎเชพเช เชฒเซเช เชฒเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เช เชคเซเชฏเชพเชฐ เชธเซเชงเซ, เชคเซเชฎเชพเช เชซเชเซเชค en เช เชจเซ ru เชเซ.
- เชเซ เชเซเชธ_เชธเซเชเซเชฐเชฟเชเช - เชชเซเชธเซเชเชฎเชพเชเชฅเซ เชฌเชงเชพ เชเซ เชเซเชธ
- เชตเชพเชเชเชจ_เชเชฃเชคเชฐเซ
- เชฒเซเชเช
- เชธเซเชเซเชฐ - เชฒเซเช เชฐเซเชเชฟเชเช.
เชเชฎ, 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 เชเชฎเชฌเซ.
- เชเซเชฒ, 37804 เชฒเซเชเซ Habrรฉ เชจเชพ เชฒเซเชเชเซ เชเซ. เชนเซเช เชคเชฎเชจเซ เชฏเชพเชฆ เชเชฐเชพเชตเซเช เชเซเช เชเซ เช เชเชเชเชกเชพ เชซเชเซเชค เชฒเชพเชเชต เชชเซเชธเซเชเชจเชพ เชเซ.
- เชนเซเชฌเซเชฐเซ เชชเชฐ เชธเซเชฅเซ เชตเชงเซ เชเชคเซเชชเชพเชฆเช เชฒเซเชเช -
เช เชฒเซเชเชฐ - 8774 เชฒเซเชเซ. เชเซเชเชจเชพ เชฐเซเชเซเชก เชฒเซเช - 1448 เชตเชคเซเชคเชพเชธเซเชฅเซ เชตเชงเซ เชตเชพเชเชเซเชฒเชพ เชฒเซเช โ 1660841 เชเซเชตเชพเชเชธเซเชฅเซ เชตเชงเซ เชเชฐเซเชเชพเชฏเซเชฒ เชฒเซเช - 2444 เชเชฟเชชเซเชชเชฃเซเช
เชธเชพเชฐเซเช, เชเซเชเชจเชพ เชธเซเชตเชฐเซเชชเชฎเชพเชเชเซเชเชจเชพ 15 เชฒเซเชเชเซ
เชฐเซเชเชฟเชเช เชฆเซเชตเชพเชฐเชพ เชเซเชเชจเชพ 15
เชเซเชเชจเชพ 15 เชตเชพเชเชเซ
เชเซเชเชจเชพ 15 เชเชฐเซเชเชพ
เชธเซเชฐเซเชธ: www.habr.com