» »

Skripta za Bolho.

Skripta za Bolho.

111111111111 ::

Ima kdo kakšno rešitev, da bi spremljla bolho za male oglase in iskala določene besede v novih oglasih?

Npr. da me opozori ko pride nov oglas, ki vsebuje besedo LEGO.

Hvala že v naprej.

Cr00k ::

111111111111 je izjavil:

Ima kdo kakšno rešitev, da bi spremljla bolho za male oglase in iskala določene besede v novih oglasih?

Npr. da me opozori ko pride nov oglas, ki vsebuje besedo LEGO.

Hvala že v naprej.


Mogoče lahko uporabiš Google Alert? Sicer pa res kakšnega custom crawlerja naštimat.

AnotherMe ::

In kako bi se lotil izdelat takega crawlerja?

Js recimo kupujem avto, sem izbirčen kakega bi imel, mudi se mi pa ne - in bi mi pasalo imet neko skriptico, ki bi recimo vsako uro pogledala, če je kaj primernega na avtonetu in mi poslala email...

pixelzgaming ::

v pythonu si lahko v par vrsticah napišeš skripto ki ti na xy minut preveri če je prišlo kaj novega. Načinov kako se to naredi je miljon. poglej si kak BeautifulSoup tutorial, notification si lahko pošlješ v obliki maila recimo.
Komp: 2600X | 16GB DDR4 | 500GB NVMe | 10 + 10 + 6 + 4 TB HDD | GTX 1060 6GB
Telefon: S23 Ultra
Avto: Megane MK4 GTLine

kow ::

AnotherMe je izjavil:

In kako bi se lotil izdelat takega crawlerja?

Js recimo kupujem avto, sem izbirčen kakega bi imel, mudi se mi pa ne - in bi mi pasalo imet neko skriptico, ki bi recimo vsako uro pogledala, če je kaj primernega na avtonetu in mi poslala email...


Uporabljam distill.io.

BladE_ ::

Je bilo v tej temi že govora o tem. Pisal sem tudi avtorju skripte za kaj več ampak ni bilo odgovra in sem pozabil na to...

Mogoče pa je tale distill.io(@kow, hvala!) boljša rešitev... Uporablja še kdo?
Akcija - Reakcija

HotBurek ::

Za tiste, ki imate interes za lasten razvoj, učenje...

En sample v Python-u, za avto.net, iz katerega se da naprej gradit. Al pa kot motivacijo, da narediš čisto nov bot.

#!/usr/bin/python3.7

# import
import time;
import datetime;
import traceback;
import requests.packages.urllib3;

# avoid InsecureRequestWarning
requests.packages.urllib3.disable_warnings();

# define
headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0"};
timeout = 4;

# avto.net url
url = "https://www.avto.net/Ads/results_100.asp?oglasrubrika=1&prodajalec=2";

# current ads
currentads = [];

# class car ad
class carad:
    id = "";
    date = "";
    time = "";
    desc = "";
    price = "";

# functions
def getdate():

    dtstart = datetime.datetime.now();
    day = dtstart.day;

    if len(str(day)) == 1:
        day = "0" + str(day);
    month = str(dtstart.month);
    if len(str(month)) == 1:
        month = "0" + str(month);
    _date = str(dtstart.year) + "-" + str(month) + "-" + str(day);

    return _date;


def gettime():

    dtstart = datetime.datetime.now();
    second = dtstart.second;

    if second < 10:
        second = "0" + str(second);
    minute = dtstart.minute;
    if minute < 10:
        minute = "0" + str(minute);
    hour = dtstart.hour;
    if hour < 10:
        hour = "0" + str(hour);
    _time = str(hour) + "-" + str(minute) + "-" + str(second);

    return _time;

# main entry
if __name__ == "__main__":

    print("[" + getdate() + " " + gettime() + "] " + "Start");

    while (True):

        try:

            request = requests.get(url, headers=headers, allow_redirects=True, verify=False, timeout=timeout);
            request.encoding = "windows-1250";

            if request.status_code == 200:

                response = request.text;

                while (response.find("../Ads/details.asp?id=") > -1):

                    response = response[response.find("../Ads/details.asp?id=") + len("../Ads/details.asp?id="):];

                    addId = "";
                    description = "";
                    price = "";

                    if response.find("\"") < 9:

                        addId = response[:response.find("\"")];

                    response = response[response.find("\""):];

                    if response.find("alt=\"") > 0:

                        description = response[response.find("alt=\"") + len("alt=\""):];

                        if description.find("\"") > 0:

                            description = description[:description.find("\"")];

                    if response.find("ResultsAdPriceRegular\">") > 0:

                        price = response[response.find("ResultsAdPriceRegular\">") + len("ResultsAdPriceRegular\">"):];

                        if price.find("<") > 0:

                            price = price[:price.find("<")];

                    if len(addId) == 8:

                        isNew = True;

                        for item in currentads:
                            if item.id == addId:
                                isNew = False;
                                break;

                        if isNew:
                            cad = carad();
                            cad.id = str(addId);
                            cad.date = getdate();
                            cad.time = gettime();
                            cad.desc = description;
                            cad.price = price;

                            currentads.extend([cad]);

                            print("[" + getdate() + " " + gettime() + "] https://www.avto.net/Ads/details.asp?id=" + str(addId) + " | " + price + " | " + description);

            else:
                print("[" + getdate() + " " + gettime() + "] " + "Response code: " + str(request.status_code));

            print("[" + getdate() + " " + gettime() + "] " + "Sleeping for 40 seconds .", end =" ");
            time.sleep(5);
            print("35 .", end =" ");
            time.sleep(5);
            print("30 .", end =" ");
            time.sleep(5);
            print("25 .", end =" ");
            time.sleep(5);
            print("20 .", end =" ");
            time.sleep(5);
            print("15 .", end =" ");
            time.sleep(5);
            print("10 .", end =" ");
            time.sleep(5);
            print("5 .");
            time.sleep(5);

        except KeyboardInterrupt:

            print("[" + getdate() + " " + gettime() + "] " + "Stop");
            break;
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()

extr3m3 ::

@HotBurek - hvala!
o_O

c3p0 ::

Pa upaš, da te ne bannajo, oz. delaš requeste ne preveč pogosto.

xardas ::

BeautifulSoup, lxml, Portia, VisualPing...nekaj ti bo že ustrezalo ;)

Zgodovina sprememb…

  • spremenilo: xardas ()

111111111111 ::

Google Alert dela super, ampak za vse oglase. Filtri besed mi nočejo delat. :D

111111111111 ::

Google alert na bolhi pobira samo oglase za prodajo domačih živali. :D Kupi kdo zajkljo?

Moram poskusiti katerega od drugih.

i33a ::

Kako bi se pa lotili zasnove baze za nek tak bot?
Bi hranili vse oglase za določen filter? Ali le datum zadnje objave? Ter potem na podlagi datuma objave pošiljali nova obvestila?

RockyS ::

Jaz imam skripto (python) za nepremičnine.net in bolha.com , če kdo rabi lahko delim.

Če pa mislite, da bi lahko skupaj izboljšali skripto, pa lahko dam git repo kot public?

@i33a jaz shranjujem v txt file prejšnega ki ga je našel, tako da imam kasneje za primerjavo (skripta se zažene vsakih 30min med 6:00 in 22:00)

111111111111 ::

Mene bi precej zanimala, github mi ne pomaga, ker sem v pythonu bolj švoh. Nazadnje programiral leta 2010. :) Mater leti čas.

extr3m3 ::

111111111111 je izjavil:

Mene bi precej zanimala, github mi ne pomaga, ker sem v pythonu bolj švoh. Nazadnje programiral leta 2010. :) Mater leti čas.

+1
o_O

-ninja-91- ::

+1

BigBoss ::

Jaz sem na zadnje programiral (bolj resno, bash skripte in autoit ne štejejo) nekje 20 let nazaj.
Bi pa tisto za nepremicnine potreboval ...

tnx, če jo deliš.

Zgodovina sprememb…

  • spremenil: BigBoss ()

vilonja ::

@RockyS

Tudi jaz se priporocam za skripto. Lp

Spura ::

111111111111 je izjavil:

Ima kdo kakšno rešitev, da bi spremljla bolho za male oglase in iskala določene besede v novih oglasih?

Npr. da me opozori ko pride nov oglas, ki vsebuje besedo LEGO.

Hvala že v naprej.

Kako naj te opozori.

111111111111 ::

Pošlje mail.

RockyS ::

Primer filtrov (greš na bolha.com , na klikaš filtre vse kar je za www.bolha.com skopiraš v bolha_apartments_params)
cron pa si pač vsak sam nastavi
parse.py
# -*- coding: utf-8 -*-
import bs4, requests, smtplib, config

# Download page
bolha_host = 'http://www.bolha.com' #no backslash
bolha_apartments_params = '/nepremicnine/stanovanja/?reType=4-sobno%7C%7C5+in+večsobno%7C%7C4.5-sobno&viewType=30&location=Podravska%2FMaribor%2FCenter%2F%7C%7CPodravska%2FMaribor%2FKoroška+vrata%2F%7C%7CPodravska%2FMaribor%2FOstalo%2F%7C%7CPodravska%2FMaribor%2FTabor%2F%7C%7CPodravska%2FMaribor%2FKamnica%2F%7C%7CPodravska%2FMaribor%2FKošaki%2F%7C%7CPodravska%2FMaribor%2FStudenci%2F%7C%7CPodravska%2FMaribor%2FTezno%2F&adTypeH=00_Prodam%2F&sort=0'

# we will store only new ones so they will be sent in email
new_real_estates = []


def send_email():
    if len(new_real_estates) > 0:
        email_subject = "Subject: Novi oglasi"
        email_body = 'Oglej si na \n' + "\n".join(new_real_estates)

    else:
        email_subject = "Subject: Ni novih oglasov"
        email_body = 'Ni novih oglasov'

    conn = smtplib.SMTP(config.email_smtp, config.email_smtp_port)  # smtp address and port
    conn.ehlo()  # call this to start the connection
    conn.starttls()  # starts tls encryption. When we send our password it will be encrypted.
    conn.login(config.email_username, config.email_password)
    header = 'To:' + config.email_to + '\n' + 'From: ' + config.email_from + '\n' + email_subject + ' \n'
    msg = header + '\n ' + email_body + ' \n\n'

    if config.send_email_when_no_results == 1:
        conn.sendmail(config.email_from, config.email_to, msg.encode('utf-8'))
    conn.quit()


def get_bolha_apartments_ads():
    get_bolha_apartments_page = requests.get(bolha_host + bolha_apartments_params)
    get_bolha_apartments_page.raise_for_status()  # if error it will stop the program
    # Parse text for real estates
    bolha_apartments_page = bs4.BeautifulSoup(get_bolha_apartments_page.text, 'html.parser')

    for apartments in bolha_apartments_page.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['ad'],
                                                     limit=2)[1:]:
        for link in apartments.find_all('h3'):
            href = link.find('a')['href']

            file_apartments = open('bolhaapartments.txt', 'a+')
            file_apartments .seek(0)
            text = file_apartments .readline().rstrip()

            if text != href:
                file_apartments .truncate(0)
                file_apartments .write(href)
                tt = bolha_host + href
                new_real_estates.append(tt)
            file_houses.close()


get_bolha_apartments_ads()
send_email()


config.py
email_from = 'xxx@xxx.xxx'
email_to = 'xxx@xxx.xxx'
email_smtp = 'mail.xxx.xxx'
email_smtp_port = 587
email_username = ''
email_password = ''
send_email_when_no_results = 1

Zgodovina sprememb…

  • spremenil: RockyS ()

Spura ::

Jst sm tut naredu skripto, sicer v Clojure, ki je hostana na githubu.

Lahko si zdownloadas kar pakiran Jar in pozenes z javo:

java -jar bolha.jar
plus opcije.

Jar je tukaj: https://github.com/RokLenarcic/bolha/re...

Lahko pa pozenes s clj komando:

Instalacija za clj https://www.clojure.org/guides/getting_...

Potem pozenes z

clj -Sdeps '{:deps {bolha {:git/url "https://github.com/RokLenarcic/bolha.git" :sha "6bd10d8607a0de3e5dde077a7a79199ee12ed5e1"}}}' -m bolha


in dodas opcije na koncu, brez opcij ti bo izpisalo mozne opcije.

Example opcij:

--host smtp.gmail.com --mail 'rok.lenarcic@gmail.com' --user rok.lenarcic --pass password --port 587 --tls --query lego

Zgodovina sprememb…

  • spremenil: Spura ()

RockyS ::

Dobra zadeva!

t-zonaz ::

Kakšna varianta za mobitel?
t-zonaz

Spura ::

V kaksnem smislu za mobitel? A da bi ti mobitel to skos skeniral? Ti bo vso baterijo skurilo. Poleg tega pa tele skripte itak posiljajo email za katerega predvidevam da dobis obvestilo na telefonu.

i33a ::

Pozdravljeni, sem pred časom videl temo in sem spisal eno skrpto, ki obiskuje določen URL na avto.net vsake npr. 15 min.
Po nekaj iteracijah vedno dobim napako:
 Max retries exceeded with url: 
.
Torej Avto.net ne pusti več takih zahtev in s tem nekako preprečuje DOS napad. Mi je pa zanimivo, ker se to pojavi, tudi ko je ena zahteva na 15 min, kar se mi ne zdi ravno pogosto.
Obstaja kakšen način kako to zaobiti in na recimo 15-30min pridobivati podatke?

XLapsus ::

Meni dela bp cronjob na 5min brez kakšnih posebnih nastavitev.

i33a ::

Kako pa daješ requeste? S kakšno knjižnico?

XLapsus ::

Rabim en request (v bistvu dva, ker preverjam dve strani) na 5min. Uporabljen kar PHP
file_get_contents(url)

planina91 ::

Google Alert
https://www.google.com/alerts?hl=sl#

Primer pri meni za iskanje:

GTX site:bolha.com/nvidia-graficne-kartice

Traja pa malenkost dlje, da google poindeksira bolho.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Postavitev mySQL

Oddelek: Programiranje
92080 (1658) M01O
»

[Python3] Izvajanje ukazov po določenem času

Oddelek: Programiranje
211317 (927) noraguta
»

Fake traffic generator

Oddelek: Omrežja in internet
192056 (1252) HotBurek
»

[C#] Simobilov Glasnik

Oddelek: Programiranje
134171 (1251) Mrch
»

asp-problem z datumom

Oddelek: Izdelava spletišč
111302 (1166) Old-Death

Več podobnih tem