Merge branch 'main' of ssh://git.tjoyspotifylastfm.tech:10022/MERDE.COM/eternos
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
|
.venv
|
||||||
.codegpt
|
.codegpt
|
||||||
|
__pycache__
|
||||||
11
.pre-commit-config.yaml
Normal file
11
.pre-commit-config.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
repos:
|
||||||
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
|
rev: v0.8.0
|
||||||
|
hooks:
|
||||||
|
- id: ruff
|
||||||
|
args: [ --fix ]
|
||||||
|
- id: ruff-format
|
||||||
|
- repo: https://github.com/pycqa/isort
|
||||||
|
rev: 5.12.0
|
||||||
|
hooks:
|
||||||
|
- id: isort
|
||||||
12
config/INSTRUCTIONS.md
Normal file
12
config/INSTRUCTIONS.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# Example for dbconfig.yaml
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
user: "user"
|
||||||
|
password: "password"
|
||||||
|
dbname: "test"
|
||||||
|
sslmode: "disable"
|
||||||
|
hostname: "localhost"
|
||||||
|
```
|
||||||
|
We use Postgres v. 16
|
||||||
|
|
||||||
|
You need to create own yaml file
|
||||||
85
database/database.go
Normal file
85
database/database.go
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/jmoiron/sqlx"
|
||||||
|
_ "github.com/lib/pq"
|
||||||
|
yaml "gopkg.in/yaml.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Conf struct {
|
||||||
|
User string `yaml:"user"`
|
||||||
|
DBname string `yaml:"dbname"`
|
||||||
|
SSLMode string `yaml:"sslmode"`
|
||||||
|
Password string `yaml:"password"`
|
||||||
|
Host string `yaml:"hostname"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadConfig(path string) (*Conf, error) {
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var config Conf
|
||||||
|
err = yaml.Unmarshal(data, &config)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &config, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckError(err error) bool {
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_connection() {
|
||||||
|
config, err := LoadConfig("config/config.yaml")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Failed to load config:", err)
|
||||||
|
}
|
||||||
|
dsn := fmt.Sprintf("user=%s dbname=%s sslmode=%s password=%s host=%s",
|
||||||
|
config.User, config.DBname, config.SSLMode, config.Password, config.Host)
|
||||||
|
|
||||||
|
db, err := sqlx.Connect("postgres", dsn)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
// Test the connection to the database
|
||||||
|
if err := db.Ping(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
} else {
|
||||||
|
log.Println("Successfully Connected")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Insert_Data(query string) bool {
|
||||||
|
config, err := LoadConfig("config/config.yaml")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Failed to load config:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
dsn := fmt.Sprintf("user=%s dbname=%s sslmode=%s password=%s host=%s",
|
||||||
|
config.User, config.DBname, config.SSLMode, config.Password, config.Host)
|
||||||
|
|
||||||
|
db, err := sqlx.Open("postgres", dsn)
|
||||||
|
if !CheckError(err) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
_, e := db.Exec(query)
|
||||||
|
|
||||||
|
return CheckError(e)
|
||||||
|
}
|
||||||
6
go.mod
6
go.mod
@@ -1,3 +1,9 @@
|
|||||||
module market
|
module market
|
||||||
|
|
||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/jmoiron/sqlx v1.4.0
|
||||||
|
github.com/lib/pq v1.10.9
|
||||||
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
|
)
|
||||||
8
go.sum
8
go.sum
@@ -6,5 +6,13 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
|||||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||||
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
||||||
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
||||||
|
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
|
||||||
|
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
|
||||||
|
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
|
||||||
|
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
||||||
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
|||||||
17
parser/currency.py
Normal file
17
parser/currency.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import requests
|
||||||
|
|
||||||
|
url = "https://www.cbr-xml-daily.ru/daily_json.js"
|
||||||
|
|
||||||
|
|
||||||
|
class Currency:
|
||||||
|
def __init__(self, code: str):
|
||||||
|
self.name = code
|
||||||
|
self.status = True
|
||||||
|
response = requests.get(url)
|
||||||
|
response.raise_for_status()
|
||||||
|
try:
|
||||||
|
data = response.json()
|
||||||
|
self.rate = data["Valute"][code]["Value"]
|
||||||
|
self.nominal = data["Valute"][code]["Nominal"]
|
||||||
|
except Exception:
|
||||||
|
self.status = False
|
||||||
6
parser/item.py
Normal file
6
parser/item.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
class Item:
|
||||||
|
def __init__(self, name: str, category: str, price: float, photo_url: str):
|
||||||
|
self.name = name
|
||||||
|
self.category = category
|
||||||
|
self.price = price
|
||||||
|
self.photo_url = photo_url
|
||||||
46
parser/main.py
Normal file
46
parser/main.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
from currency import Currency
|
||||||
|
from item import Item
|
||||||
|
|
||||||
|
items = []
|
||||||
|
|
||||||
|
bank = Currency("JPY")
|
||||||
|
if not bank.status:
|
||||||
|
print("Not correct currency code")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
url = "https://www.fint-shop.com/c/all/bag?top_category"
|
||||||
|
|
||||||
|
response = requests.get(url)
|
||||||
|
response.raise_for_status()
|
||||||
|
|
||||||
|
soup = BeautifulSoup(response.text, "html.parser")
|
||||||
|
|
||||||
|
products = soup.find_all("article", class_="fs-c-productList__list__item")
|
||||||
|
category_name = soup.find_all("li", class_="fs-c-breadcrumb__listItem")[1].get_text(
|
||||||
|
strip=True
|
||||||
|
)
|
||||||
|
print(category_name)
|
||||||
|
for product in products:
|
||||||
|
product_name = product.find("span", class_="fs-c-productName__name").get_text(
|
||||||
|
strip=True
|
||||||
|
)
|
||||||
|
|
||||||
|
price = int(
|
||||||
|
product.find("div", class_="fs-c-productPrice--listed")
|
||||||
|
.find("span", class_="fs-c-price__value")
|
||||||
|
.get_text(strip=True)
|
||||||
|
.replace(",", "")
|
||||||
|
)
|
||||||
|
product_price = round(price * (bank.rate / bank.nominal), 2)
|
||||||
|
|
||||||
|
product_photo = product.find(
|
||||||
|
"img", class_="fs-c-productListItem__image__image fs-c-productImage__image"
|
||||||
|
)["data-layzr"]
|
||||||
|
items.append(Item(product_name, "bags", product_price, product_photo))
|
||||||
|
|
||||||
|
for item in items:
|
||||||
|
print(f"Name = {item.name}, price = {item.price}")
|
||||||
3
parser/requirements.txt
Normal file
3
parser/requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
bs4==0.0.2
|
||||||
|
pre_commit==4.0.1
|
||||||
|
requests==2.32.3
|
||||||
Reference in New Issue
Block a user