Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: συλλογη δεδομενων απο web

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4793

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
Χαιρετω τους φιλους.Υπαρχουν καπου οδηγιες ή συστασεις για το πως μπορει να γινει αυτο?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4794

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Αυτό που θες να κάνεις ονομάζεται Web Scraping. Στην ουσία επεξεργάζεσαι html αρχεία για να αντλίσεις πληροφορίες από αυτά (όπως τον τίτλο μια ιστοσελίδας, ένα link το οποίο δίχνει σε κάποιο άλλο html αρχείο κτλ).

Στην python υπάρχει μιά πολύ ωραία βιβλιοθήκη για να επεξεργάζεσαι html αρχεία.Η βιβλιοθήκη αυτήν ονομάζεται BeautifulSoup.

Για διευκόλυνση μπορείς να δεις αυτά τα βίντεο tutorials

Δεν έχω ασχοληθεί πολύ με αυτό το θέμα για αυτό δεν γνωρίζω να σου δώσω περισσότερες πληροφορίες.

Καλή επυτιχία.
Τελευταία διόρθωση: 6 Χρόνια 5 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4795

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
σε ευχαριστω πολυ θα τα δω
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4796

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
import urllib.request
import re


symlis=["ΑΙΟΛΚ","ΒΙΟΣΚ","ΚΑΘΗ","ΙΝΤΕΡΚ"]

i=0
while i <len(symlis):
url= (u"www.capital.gr/finance/quote/")+ symlis
#url = unicode(url, "utf-8")
hfile=urllib.request.urlopen(url)
htex=hfile.read()

regex='<span data-bind="text: l.extend({priceNumeric: null}), css: displayClass, flashBackground: {dependOn: l, indentifier: s}" class="loser">(.+?)</span>'

p=re.compile(regex)

price=re.findall(p,htext)
print(price)
i+=1
Με το παραπανω προσπαθω να διαβασω τιμες κλεισιματος μετοχων που ειναι μεσα στη λιστα.Παιρνω μονιμα στο run το παρακατω λαθος.

'ascii' codec can't encode characters in position 19-23: ordinal not in range(128)

σκαει μαλλον στο hfile=urllib.request.urlopen(url).Δεν εχω βγαλει ακρη τι το χαλαει και πως θα το διορθωσω.Βλεπει καποιος φιλος κατι?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4797

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
To url πρέπει να είναι ascii

 
>>> from urllib.parse import quote
>>> from urllib.request import urlopen
>>> url=r'http://www.capital.gr/finance/quote/'+quote('ΑΙΟΛΚ')
>>> data=urlopen(url)
>>>
Γενικά όμως πιστεύω ότι θα πρέπει να βρεις άλλο τρόπο
δεν νομίζω να δουλέψει έτσι
Τελευταία διόρθωση: 6 Χρόνια 5 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4798

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
theo σε ευχαριστω.Με μικρη μετατροπη διαβαζω και παιρνω τιμες απο nyse(χρημ νεας υορκ).Χαλαει στα ελληνικα και δεν μπορω ακομα να διαβασω το ελλ χρηματιστηριο και κυπρο.Θα δοκιμασω με bs4.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4799

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Σου εξηγώ ένα τρόπο για να το κάνεις είναι λίγο μεγάλη η εξήγηση ελπίζω να καταλάβεις
 
Οι βιβλιοθήκες που θα χρησιμοποιήσω είναι της standar library
 
>>> from urllib.request import Request, urlopen
>>> from urllib.parse import quote
>>> import re, time
 
Κατ' αρχήν κοιτάω το στόχο μου και τη πληροφορία θέλω να αντλήσω
έστω ο στόχος  είναι http://www.capital.gr/finance/quote/ΑΙΟΛΚ
 
Το βάζω στο browser και ελέγχω αν δουλεύει
οκ δουλεύει και βλέπω την τιμή της μετοχής 0,422
 
επειδή το url έχει ελληνικούς χαρακτήρες θα πρέπει να το αλλάξω σε ascii
πάω στο browser και κάνω όλο το url copy paste σε έναν editor http://www.capital.gr/finance/quote/%CE%91%CE%99%CE%9F%CE%9B%CE%9A 
βλέπεις ότι τα ελληνικά έχουν κάπως αλλάξει
 
το ίδιο αποτελέσμα παίρνω με 
url=r'http://www.capital.gr/finance/quote/'+quote('ΑΙΟΛΚ')
 
Δημιουργώ ένα request για τον στόχο
rec=Request(url ,headers={'User-Agent': 'Mozilla/5.0'} )
και το κάνω open
data=urlopen(rec) αυτό το κάνω γιατί ίσως το site να έχει προστασία από User Agents 
που είναι προγράμματα. Αν κάνω κατευθείαν το urlopen το user agent που θα σταλεί είναι 
"Python-urllib/kati"
 
αφού τελειώσει το data μπορώ να το διαβάσω 
my_file=data.read() 
 
Εδώ πρέπει κανονικά να δώσω λίγο χρόνο για να το ανοίξει να έρθουν δηλαδή όλα τα δεδομένα στον
υπολογιστή μου οπότε ανάμεσα στο open και στο read καλό είναι να βάλω ένα 
time.sleep(1)
Αφού διαβάσω τα data μπορώ να τα κλείσω
data.close()
Το my_file τώρα είναι ένα binary file επίσης σε ascii και θα πρέπει να το κάνω decode
my_file=my_file.decode('utf-8')
και για να μπορώ να το χειριστώ και καλύτερα το κάνω text
my_file=str(my_file)
Τώρα έχω στον υπολογιστή μου το site 
ψάχνω την πληροφορία που θέλω
>>> my_file.find('0,422')
37723
Τυπώνω ένα μεγάλο κομμάτι για να δω εάν είναι όντως εκεί αυτό που θέλω
>>> print(my_file[37000:39000])
a" class="">Ειδήσεις</a>
 
        <a href="/finance/rating/all/%ce%91%ce%99%ce%9f%ce%9b%ce%9a" class="">Εκθέσεις</a>
 
            <a href="/fundamentals/balance/%ce%91%ce%99%ce%9f%ce%9b%ce%9a" class="">Θεμελιώδη</a>
 
            <a href="/finance/profile/%ce%91%ce%99%ce%9f%ce%9b%ce%9a" class="">Προφίλ</a>
 
            <a href="/forum/14">Συζητήσεις</a>
 
 
 
</nav>
 
<div class="finance__details" id="quoteData" data-bind="with: quotes()[0]">
 
 
 
    <div class="finance__details__left loser">
 
        <!--  <== winner loser -->
 
        <h3 class="price bold ">
 
            <span data-bind="text: l.extend({priceNumeric: null}), css: displayClass, flashBackground: {dependOn: l, indentifier: s}">0,422</span> €
 
        </h3>
 
 
 
 
 
        <h4 class="loser change" data-bind="css: displayClass, flashBackground: {dependOn: l, indentifier: function () { return s() + '!'; }}">
 
            <span data-bind="text: c.extend({priceNumeric: {dependOn: l, forceSign: true }})">-0,030</span>
 
            <span>(<span data-bind="text: pc.extend({numeric: { precision: 2, forceSign: true } })">-6,64</span>%)</span>
 
        </h4>
 
        <p data-bind="text: 'Τελ. Ενημέρωση ' + lu, flashBackground: lu">Αγορά Κλειστή  26/10/2017 12:22</p>
 
    </div>
 
    <div class="finance__details__right">
 
        <ul>
 
            <li>
 
                <i>Άνοιγμα</i>
 
                <span data-bind="text: o.extend({priceNumeric: l})">0,422</span>
 
            </li>
 
            <li>
 
                <i>Υψηλό</i>
 
                <span data-bind="text: hp.extend({priceNumeric: l})">0,422</span>
 
            </li>
 
            <li>
 
                <i>Χαμηλό</i>
 
                <span data-bind="text: lp.extend({priceNumeric: l})">0,422</span>
 
            </li>
 
        </ul>
 
        <ul>
 
            <li>
 
                <i>Όγκος</i>
 
                <span data-bind="text: tv() > 0? tv.extend({numeric: { precision: 0}})(): '', flashBackground: tv">355</span>
 
            </l
 
Βρίσκω το καταλληλότερο τμήμα για να κάνω ένα pattern για να διαβάζω αυτή την πληροφορία 
εγώ επιλέγω το παρακάτω που μου φαίνεται και μοναδικό (δεν είμαι σίγουρος
γιατί δεν έχει id)
<h3 class="price bold ">
 
            <span data-bind="text: l.extend({priceNumeric: null}), css: displayClass, flashBackground: {dependOn: l, indentifier: s}">0,422</span> €
 
πρέπει να ξέρω κάποια πράγματα από regex
εγώ κάνω το 
pat=r'class ?= ?"price bold ?"[^\d]*(\d*,\d*)'
 
το κάνω compile
pattern=re.compile(pat)
 
και το δοκιμάζω
>>> finds=pattern.search(my_file).group()
>>> finds
'class="price bold ">\r\n            <span data-bind="text: l.extend({priceNumeric: null}), css: displayClass, flashBackground: {dependOn: l, indentifier: s}">0,422'
>>> 
οκ δουλεύει
 
Μαζεύω τέλος όλα τα παραπάνω και τα κάνω μια συνάρτηση
 
def find_values_from_capital(metoxi):
	url=r'http://www.capital.gr/finance/quote/'+quote(metoxi)
        rec=Request(url ,headers={'User-Agent': 'Mozilla/5.0'} )
        try:
		data=urlopen(rec)
	except:
		print ('I cant open {}'.format('http://www.capital.gr/finance/quote/'+metoxi))
	else:
                time.sleep(1)
		my_file=str(data.read().decode('utf-8'))
		data.close()
		pattern=re.compile(r'class ?= ?"price bold ?"[^\d]*(\d*,\d*)')
		finds=pattern.search(my_file).group(1)
		return metoxi,finds
 
τη δοκιμάζω
 
 
>>> symlis=["ΑΙΟΛΚ","ΒΙΟΣΚ","ΚΑΘΗ","ΙΝΤΕΡΚ"]
>>> for metoxi in symlis:
	find_values_from_capital(metoxi)
 
 
('ΑΙΟΛΚ', '0,422')
('ΒΙΟΣΚ', '0,509')
('ΚΑΘΗ', '0,320')
I cant open http://www.capital.gr/finance/quote/ΙΝΤΕΡΚ
>>> 
>>> 
Τσεκάρω τα αποτελέσματα στον browser αν είναι σωστά

Ελπίζω να κατάλαβες περίπου τη λογική
Φυσικά εγώ προσωπικά δεν θα πήγαινα στη σελίδα της μετοχής αλλά στην κεντρική που έχει όλες τις μετοχές για να μην ανοίγω 3 αρχεία αλλά 1

Μετά θα κοιτάς αν το site έχει έτοιμο κάποιο api για να πάρεις απευθείας τα δεδομένα και κοιτάς και το www.capital.gr/robots.txt
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4800

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
THEO σε ευχαριστω για τον χρονο και τον κοπο
Τελικα το εκανα οπως παρακατω με bs4
import requests
from bs4 import BeautifulSoup
 
symbolslist = ['ΑΒΑΞ','ΑΔΜΗΕ','ΑΡΑΙΓ','hfjh','ΓΕΚΤΕΡΝΑ']
headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5)",
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "accept-charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
        "accept-encoding": "gzip,deflate,sdch",
        "accept-language": "gr,en-US,en;q=0.8",
    }
i=0
while i < len(symbolslist):
    url = r"http://www.capital.gr/finance/quote/"+symbolslist[i]
    r = requests.get(url,headers=headers)
 
    if r.status_code != 200:
        print("den brhka selida",symbolslist[i])
        pass
    else:
        print("scraping " + url)
 
 
    #print(r)
    bs = BeautifulSoup(r.text,"html.parser")
 
    #print(bs)
    for uls in bs.find_all('h3',{'class':'price bold '}): 
 
        lis = uls.find_all('span') 
        for li in lis:
            tex='text:{}'.format(li.text)
            print(symbolslist[i],'  ',tex[5:])
 
    i+=1  

μενει να βαλω στη λιστα ολες τις μετοχες,και ειναι ετοιμο.Και παλι σε ευχαριστω
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4801

  • nikpol
  • Το Άβαταρ του/της nikpol
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 42
Το robots.txt το βλεπω αλλα δεν καταλαβαινω αν επιτρεπει το scraping.Εχεις καμια ιδεα γιαυτο?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

συλλογη δεδομενων απο web 6 Χρόνια 5 Μήνες πριν #4802

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Εφόσον το /finance δεν είναι μέσα στα dissalowed είναι οκ να το χρησιμοποιήσεις

Τo requests και το bs4 είναι εξωτερικές βιβλιοθήκες πολύ καλές και οι δύο

Σκέψου μόνο μήπως είναι προτιμότερο να διαβάσεις τα δεδομένα σου από το www.capital.gr/finance/allstocks

Εγώ θα τα έπαιρνα όλα και μετά χρησιμοποιείς ότι χρειάζεσαι
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.484 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου