From 3099949f6c1e8ccc95470f62e26d286b8196e434 Mon Sep 17 00:00:00 2001 From: Anton Laktionov Date: Wed, 10 Jun 2026 19:40:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 90 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 75 insertions(+), 15 deletions(-) diff --git a/main.py b/main.py index dbf5e54..92d45de 100644 --- a/main.py +++ b/main.py @@ -1,19 +1,79 @@ import requests from bs4 import BeautifulSoup import re +import sqlite3 +from datetime import datetime + +class Spyder: + def __init__(self): + self.db_name = 'database.db' + self.conn = sqlite3.connect(self.db_name) + self.cursor = self.conn.cursor() + def init_db(self): + query = '''CREATE TABLE links( + id INTEGER PRIMARY KEY AUTOINCREMENT, + link TEXT NOT NULL, + last_scan INTEGER DEFAULT 0, + title TEXT DEFAULT '' + )''' + self.cursor.execute(query) + def scan(self,url): + if url.endswith('.pdf'): + return + headers = { + 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36' + } + try: + response = requests.get( + url, + headers=headers, + timeout=5 + ) + except: + self.update_url(url,'Scan error') + return + html = response.text + soup = BeautifulSoup(html,'html.parser') + result = soup.find_all("a", href=True) + title = soup.title.text + self.update_url(url,title) + for el in result: + if el['href'].endswith('.pdf'): + continue + if not el['href'].startswith('http'): + match = re.findall(r'https?://[A-Za-z0-9.-]+',url) + link = f"{match[0]}{el['href']}" + else: + link = el['href'] + query = f'SELECT id FROM links WHERE link = ?' + self.cursor.execute(query,(link,)) + if self.cursor.fetchone(): + continue + query = f'INSERT INTO links(link) VALUES(?)' + self.cursor.execute(query,(link,)) + self.conn.commit() + def update_url(self,url,title): + query = "SELECT id FROM links WHERE link = ?" + self.cursor.execute(query,(url,)) + link_id = self.cursor.fetchone() + if link_id: + query = "UPDATE links SET title=?, last_scan=? WHERE id=?" + self.cursor.execute(query,(title,datetime.now().timestamp(),link_id[0])) + self.conn.commit() + def get_url(self): + query = "SELECT link FROM links ORDER BY last_scan LIMIT 1" + self.cursor.execute(query) + return self.cursor.fetchone() + def close(self): + self.conn.close() + +if __name__ == '__main__': + spyder = Spyder() + #spyder.init_db() + #spyder.scan('https://habr.com/ru/news/1046177/') + for _ in range(5): + url = spyder.get_url() + print(url[0]) + spyder.scan(url[0]) + spyder.close() -headers = { - 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36' - } -response = requests.get( - 'https://online.top-academy.ru/education/ochno', - headers=headers - ) -html = response.text -soup = BeautifulSoup(html,'html.parser') -result = soup.find_all("a", class_='styles_container__Yf7Qk') -for el in result: - name = el.find("span") - name = re.search(r'([^<>]+)',str(name)) - if name: - print(name.group(1))