Σου εξηγώ ένα τρόπο για να το κάνεις είναι λίγο μεγάλη η εξήγηση ελπίζω να καταλάβεις
Οι βιβλιοθήκες που θα χρησιμοποιήσω είναι της 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