Kolejny etap to napisanie parserów wydobywających linki reklam. W przypadku wielu flashowych reklam link, na który kieruje reklama przekazuje się w parametrze animacji, który zazwyczaj nazywany jest
clickTag (lub podobna nazwa). W przypadku innych systemów - trzeba rozpoznać wzór i napisać wyrażenie regularne. Pomocne w tym celu będzie przejrzenie kodu HTML zwracanego przez webkita. Przykładowo widżet AdTaily wstawia linki postaci:
<a style="position: relative; font-weight: normal; text-align: left; background-image: none; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin-bottom: 10px; display: block; width: 125px; height: 125px; background-position: initial initial; " href="http://www.megiteam.pl/" title="Hosting nowych technologii" rel="nofollow" target="_blank">
Dość charakterystyczne style można wykorzystać do napisania wyrażenia regularnego wyciągającego adresy URL.
- W katalogu z aplikacją stworzyłem plik parsers.py, który zawierał będzie wszystkie parsery.
- Poniżej pierwszy "parser" - wyciągający linki z widżetu AdTaily:
# -*- coding: utf-8 -*-
from re import findall
def get_adtaily(html):
"""
Extract data from adtaily widgets
"""
links = findall(r'background-position: initial initial; " href="(.*?)"', unicode(html))
ret = []
for i in links:
if not i.startswith('http://www.adtaily'):
ret.append(i)
return ret
- Importujemy parsers w run.py i modyfikujemy w tym pliku metodę loadFinished do postaci:
def loadFinished(self):
"""
A page was loaded - get the data and load next page
"""
page = self.ui.webView.page()
frame = page.currentFrame()
content = frame.toHtml()
print u'Page content, got %s bytes' % len(content)
links = get_adtaily(content)
print links
if self.currentRefresh < self.refreshSite:
print 'Refresh +1'
self.currentRefresh += 1
else:
print 'Index +1'
self.currentRefresh = 0
self.currentIndex += 1
nexturl = self.__getNextUrl()
if nexturl:
self.ui.webView.load(nexturl)
- W powyższym kroku zmodyfikowaliśmy metodę tak by przekazywała kod HTML pobranej strony do metody get_adtaily i wyświetlała zwróconą listę. Teraz jeżeli odpalisz aplikację na jakiejś stronie z widżetem AdTaily (np. www.python.rk.edu.pl) to powinieneś zobaczyć wyszukane URLe.
- W przypadku reklam flashowych powszechnie stosuje się link pod zmienną clickTag - gdzie umieszcza się link przekierowujący (liczący kliknięcia przez serwis wyświetlający reklamę) na "licznik" i z licznika na docelową stronę. Może to wyglądać nawet tak:
<embed height="200" width="750" name="td_flash" id="td_flash" wmode="opaque" swliveconnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" quality="best" menu="false" flashvars="clickTAG=http%3A%2F%2Fclk.tradedoubler.com%2Fclick%3Fp%3D74000%26a%3D1545102%26g%3D17957364%26pools%3D305907%2C282487&CLICKTAG=http%3A%2F%2Fclk.tradedoubler.com%2Fclick%3Fp%3D74000%26a%3D1545102%26g%3D17957364%26pools%3D305907%2C282487&clicktag=http%3A%2F%2Fclk.tradedoubler.com%2Fclick%3Fp%3D74000%26a%3D1545102%26g%3D17957364%26pools%3D305907%2C282487&clickTag=http%3A%2F%2Fclk.tradedoubler.com%2Fclick%3Fp%3D74000%26a%3D1545102%26g%3D17957364%26pools%3D305907%2C282487&ClickTag=http%3A%2F%2Fclk.tradedoubler.com%2Fclick%3Fp%3D74000%26a%3D1545102%26g%3D17957364%26pools%3D305907%2C282487" src="http://ads.open.pl/kreacje/2009/05_09/doplata/google_750x200_z_doplata.swf"/>
- Parsers dla "clickTag" będzie wyglądał tak:
def get_clickTag(html):
"""
Extract data from flash ads
"""
links = findall(r'clicktag=(.*?)"', unicode(html).lower())
ret = []
for i in links:
ret.append(unquote(i))
return ret
- Jeżeli potrzebujesz pobierać reklamy z określonych serwisów to musisz sprawdzić w jaki sposób wstawiają reklamy i napisać pod to parsery. Powyższy parser clickTag będzie działał dla większości reklam flashowych wyświetlanych na popularnych serwisach. (unquote importujemy z urllib)
Za obsługę baz danych w Qt odpowiada komponent QtSql. Jest on dostępny także w PyQt4, lecz jego API nie jest zgodne z DB API dla modułów Pythona (bo nie było projektowane z myślą o Pythonie).
- Dodane: 03.11.2009 przez riklaunim