#1 Le 19/11/2013, à 19:11
- k3c
[script Python] Récupérer simplement des proxys de différents pays
J'ai écrit un module Python qui récupère des proxys sur proxynova.com, exemple
1) get_valid_countries()
affiche la liste des pays pour lesquels au moins un proxy est disponible
2) get_proxy('ca')
affiche dans une liste les proxys du Canada, gb pour la Grande-Bretagne, ch pour la Suisse...
>>> from proxy_tous import get_valid_countries
>>> get_valid_countries()
set([u'gt', u'gr', u'gq', u'ge', u'gb', u'ga', u'gh', u'tz', u'tn', u'tw', u'tr', u'lk', u'lv', u'lt', u'lu', u'th', u'td', u'ly', u'do', u'dk', u'de', u'dz', u'ma', u'zm', u'ee', u'eg', u'za', u'ec', u'mk', u'eu', u'zw', u'es', u'ru', u'rs', u'ro', u'bd', u'be', u'bg', u'ba', u'bn', u'bo', u'jp', u'bj', u'jm', u'jo', u'br', u'by', u'om', u'ua', u'bw', u'mz', u'ci', u'ch', u'co', u'cn', u'cm', u'cl', u'ca', u'cd', u'cz', u'cy', u'cr', u'cu', u'ps', u'pt', u'py', u'pa', u'pf', u'pg', u'pe', u'pk', u'ph', u'pl', u'hr', u'tm', u'al', u'hk', u'hn', u'ao', u'me', u'md', u'mg', u'uy', u'uz', u'mo', u'mn', u'us', u'my', u'mx', u'at', u'ae', u've', u'af', u'iq', u'ir', u'am', u'it', u'vn', u'ar', u'au', u'il', u'in', u'az', u'ie', u'id', u'ni', u'nl', u'no', u'na', u'ng', u'nz', u'np', u'fr', u'fi', u'fj', u'hu', u'sz', u'sy', u'kg', u'ke', u'kh', u'sv', u'sk', u'kr', u'sn', u'kz', u'sa', u'sg', u'se', u'sd'])
>>> from proxy_tous import get_proxy
>>> get_proxy('ch')
[u'46.14.169.34:3128', u'212.249.11.115:8123', u'195.49.20.6:3128', u'195.49.20.2:3128', u'178.82.51.17:3128', u'46.14.211.106:8080']
>>> get_proxy('gb')
[u'80.193.214.234:3128', u'95.154.199.200:443', u'80.193.214.238:3128', u'91.109.17.199:3128', u'80.193.214.231:3128', u'95.154.199.100:443', u'91.241.21.10:8080', u'91.232.102.134:8080', u'80.193.214.239:3128', u'80.193.214.226:3128', u'62.253.249.2:8080', u'94.142.67.45:8080', u'87.84.48.235:80', u'82.145.44.49:80', u'94.142.67.41:8080', u'91.239.66.108:3128', u'80.192.41.229:3128', u'217.194.213.52:3128', u'86.53.165.101:8080', u'109.123.111.99:80', u'178.79.128.73:3128', u'91.106.34.107:8080', u'213.138.103.246:8888', u'31.3.250.42:3128', u'87.236.211.37:3128', u'94.142.69.241:8080', u'80.169.171.18:8080', u'31.3.250.54:6666', u'109.169.18.114:3128', u'95.154.199.220:443']
>>> get_proxy('ca')
[u'192.227.139.227:8089', u'192.34.57.214:3128', u'192.227.139.227:7808', u'67.55.2.15:443', u'74.3.167.40:8080', u'98.158.86.61:80', u'199.19.214.140:7808', u'199.19.214.140:8089', u'199.19.214.140:3127', u'209.141.46.195:8888', u'209.141.52.43:8888', u'198.52.247.103:8080', u'192.139.15.33:8080', u'192.227.157.173:8089', u'192.227.157.173:7808', u'96.49.226.251:8123', u'72.29.4.111:8089', u'72.29.4.111:7808', u'192.34.58.38:8123', u'66.165.98.25:80', u'184.107.243.6:3128', u'184.107.243.4:3128', u'184.107.243.5:3128', u'184.107.243.3:3128', u'184.107.243.2:3128']
Le code
#!/usr/bin/python
#-*- coding:utf-8 -*-
from urllib2 import urlopen
import sys
from BeautifulSoup import BeautifulSoup
__version__ = '0.1'
def get_valid_countries():
res = set()
# Use any country to get the full countries list
html = urlopen('http://www.proxynova.com/proxy-server-list/country-gb/').read()
soup = BeautifulSoup(html)
asel = soup.find('select', attrs={'name':'proxy_country'})
aopt = asel.findAll('option')
for opt in aopt:
if opt.has_key('value') and opt['value'] != u'' :
res.add(opt['value'])
return res
def get_proxy(country):
html = urlopen('http://www.proxynova.com/proxy-server-list/country-' + country + '/').read()
soup = BeautifulSoup(html)
atr = soup.tbody.findAll('tr')
tbl = []
n = 0
fl = True
for tr in atr:
atd = tr.findAll('td')
for x in atd:
if x.has_key('colspan'):
continue
if n%6 < 2:
if fl:
tmp = x
else:
tbl.append([tmp, x])
fl = not fl
n+=1
lst = []
for addr, port in tbl:
v = addr.span.script.string
v = v[v.find('(')+ 1:-2]
v = v.replace('"', '').replace(' ','').replace('+','')
if port.a is not None:
proxy = u"%s:%s" % (v, str(port.a.string))
else:
vv = port.contents[0].replace('\t','').replace('\n','').replace('\r', '')
proxy = u"%s:%s" % (v, vv)
lst.append(proxy)
return lst
if __name__ == '__main__':
if len(sys.argv) == 1:
print get_valid_countries()
else:
print get_proxy(sys.argv[1])
Dernière modification par k3c (Le 20/11/2013, à 05:58)
Debian 12 sur Thinkpad reconditionné
En ligne
#2 Le 20/11/2013, à 18:12
- TOROSA
Re : [script Python] Récupérer simplement des proxys de différents pays
Quelle est l’intérêt de se script k3c ?
Hors ligne
#3 Le 20/11/2013, à 18:39
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
Quand tu as besoin d'un proxy pour récupérer des vidéos sur une télé espagnole, anglaise, norvégienne, tu as plein de scripts qui fonctionnent... quand tu es dans le pays.
Donc tu ajoutes une liste de proxys que tu passes au script pour qu'il essaye, jusqu'à ce qu'il en trouve un qui marche.
J'ai posté un script pour récupérer les vidéos de la BBC dans ce même forum, par exemple.
Il peut y avoir plein d'autres raisons.
Tu peux aller à l'étranger et vouloir récupérer des vidéos de télés françaises...
Debian 12 sur Thinkpad reconditionné
En ligne
#4 Le 21/11/2013, à 09:33
- Vergeylen
Re : [script Python] Récupérer simplement des proxys de différents pays
Salut k3c,
Je teste ce soir et je te fais un retour. Ca a l'air pas mal.
Daniel.
Hors ligne
#5 Le 22/11/2013, à 15:56
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
Il est possible de tester ceux qui répondent vite, comme je le fais pour récupérer les vidéos de la BBC, test de la réponse sous 3, 10, 15 puis 20 secondes
extrait
allTimeouts = (3, 10, 15, 20)
#...
def getValidProxy():
for timeout in allTimeouts:
print 'Timeout =', timeout
socket.setdefaulttimeout(timeout)
for host, port, typeproxy in getProxy():
try:
print 'Trying %s:%s' % (host, port)
params = (host, int(port))
# buffer_size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(params)
s.close()
yield host, port, typeproxy
# except urllib2.URLError:
# pass
except socket.timeout:
pass
except socket.error:
pass
Debian 12 sur Thinkpad reconditionné
En ligne
#6 Le 30/11/2013, à 15:56
- Vergeylen
Re : [script Python] Récupérer simplement des proxys de différents pays
Hello k3c,
Désolé pour le temps dé réponse. J'ai pu tester, le script fonctionne nickel (il renvoie bien une liste d'IPs), par contre je n'ai pas réussi à obtenir du contenu français (je suis en Belgique). Sur France tv Pluzz, j'ai pris (au hasard) un épisode de Castle, j'ai configuré firefox pour passer par un des proxys de la liste, mais le serveur me renvoie 403 forbidden.
Quand je vais sur http://www.whatismyip.com/, il détecte ma vraie IP, en affichant fièrement que je passe par un proxy. Il semblerait que ce dernier n'anonymise pas totalement, et que le serveur puisse facilement le détecter le proxy.
Quand on fait une recherche google, il demande un captcha systématique, car il détecte le proxy. Penses-tu qu'on atteigne les limites de l'anonymisation par proxy?
Daniel.
Hors ligne
#7 Le 30/11/2013, à 18:04
- bibichouchou
Re : [script Python] Récupérer simplement des proxys de différents pays
@Vergeylen
salut,
je ne suis pas un expert ès proxy, mais apparemment il y a différents types de proxys proposés sur des sites comme celui du script. Les qualificatifs sont à peu près "non anonyme", "anonyme", "hautement anonyme". j'imagine que le proxy que tu as sélectionné est "non anonyme". du coup, ben ça sert à rien de l'utiliser via foxyproxy ou je ne sais quoi dans firefox : le proxy est transparent et le site sait qu'en fait celui qui fait la requête est en belgique. il faut prendre garde à sélectionner les proxys qui anonymisent vraiment. ;-) peut-être que k3c peut modifier son script pour en tenir compte ? ah ben d'ailleurs, je viens de regarder le site en question et il y a une colonne qui dit si le proxy est transparent, anonyme ou élite (?)... k3c si tu as un peu de temps...
Hors ligne
#8 Le 30/11/2013, à 21:16
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
@bibichouchou
Oui je peux modifier le script, mais c'est pas simple, le code est compliqué exprès, par exemple le deuxième proxy GB est
95.154.199.200 sur le port 443, dans le code source de la page, on trouve
<span class="proxy_transparent" style="font-weight:bold; font-size:10px;">Transparent</span></td>
</tr>
<tr>
<td align="left">
<span class="row_proxy_ip">
<script>print("95.154.199" + ".200");</script>
</span></td>
<td align="left">
<a href="http://www.proxynova.com/proxy-server-list/port-443/" title="Proxy List - Proxies with port 443">443</a>
</td>
Edit : ah oui, il te faut un elite proxy, comme ils disent dans le source de la page, je vais peut-être me contenter de récupérer les "elite proxys"
<span class="proxy_transparent"><strong>Transparent</strong></span> - Web server knows your IP address and it knows that you're using a proxy
</li>
<li>
<span class="proxy_anonymous"><strong>Anonymous</strong></span> - Web servers does not know your IP address, but it knows that you're using a proxy;
</li>
<li>
<span class="proxy_elite"><strong>Elite</strong></span> - Web server does not know your IP address, nor is it aware that you're using proxy.
</li>
Dernière modification par k3c (Le 30/11/2013, à 22:15)
Debian 12 sur Thinkpad reconditionné
En ligne
#9 Le 30/11/2013, à 22:02
- Olivier_Dev
Re : [script Python] Récupérer simplement des proxys de différents pays
bonsoir
comment ça marche cette histoire de proxy ?
j'ai pas tout compris, j'ai vlc par exemple est ce que avec un proxy je peux acceder a une vidéo ?
Hors ligne
#10 Le 30/11/2013, à 22:18
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
@Vergeylen
salut,je ne suis pas un expert ès proxy, mais apparemment il y a différents types de proxys proposés sur des sites comme celui du script. Les qualificatifs sont à peu près "non anonyme", "anonyme", "hautement anonyme". j'imagine que le proxy que tu as sélectionné est "non anonyme". du coup, ben ça sert à rien de l'utiliser via foxyproxy ou je ne sais quoi dans firefox : le proxy est transparent et le site sait qu'en fait celui qui fait la requête est en belgique. il faut prendre garde à sélectionner les proxys qui anonymisent vraiment. ;-) peut-être que k3c peut modifier son script pour en tenir compte ? ah ben d'ailleurs, je viens de regarder le site en question et il y a une colonne qui dit si le proxy est transparent, anonyme ou élite (?)... k3c si tu as un peu de temps...
Essai ce proxy fr de catégorie elite
87.255.159.182:80
et dis-nous (si tu essayes rapidement, sinon prends le plus récent de la liste)
Debian 12 sur Thinkpad reconditionné
En ligne
#11 Le 30/11/2013, à 22:24
- bibichouchou
Re : [script Python] Récupérer simplement des proxys de différents pays
@k3c
salut,
c'est gentil de regarder. qd tu dis
mais c'est pas simple, le code est compliqué exprès
tu parles évidemment du code html de la page web ?
si je devais le faire, vu l'extrait que tu donnes, je commencerai par tout reformater à coup de sed (de façon à mettre sur une même ligne toutes les infos relatives à un proxy donné) puis je grepperai les lignes contenant "élite". ça n'est probablement pas très élégant, mais je pense que j'y arriverai ainsi. mais bon en python, je ne suis pas encore super à l'aise avec des opérations sur du texte.
d'ailleurs, j'en profite pour du hs. je prévois de me mettre au parsing de page hmtl/xml avec python. tu utilises toujours beautifulsoup. as-tu testé d'autres bibliothèques de ce genre ? et si oui, pourquoi cette bibliothèque a tes préférences ? et as-tu une bonne doc FR ou EN ou les deux ? merci d'avance.
@Olivier_Dev
un proxy, c'est pour faire croire que tu es dans un pays. le cas fréquent, un français expatrié qui veut regarder "Jusqu'ici tout va bien" (oui oui, c'est une bonne émission ;-)). S'il se connecte sur pluzz.fr, un gentil message lui dira que c'est pas possible car il ne se trouve pas en France. Une solution est d'utiliser foxyproxy dans Firefox, de choisir un proxy FR et maintenant la vidéo devrait être accessible.
pour ton problème avec vlc, je crois que vlc tient compte de la variable d'environnement http_proxy (à tester). Si c'est bien le cas, il suffit de faire dans un terminal :
export http_proxy="1.2.3.4:111"
vlc http://url_de_la_video
si tu n'aimes pas la ligne de commande, il faut fouiller les panneau d'options de vlc ; et là c'est sûr que tu pourras configurer un proxy.
Dernière modification par bibichouchou (Le 30/11/2013, à 22:26)
Hors ligne
#12 Le 30/11/2013, à 22:49
- Olivier_Dev
Re : [script Python] Récupérer simplement des proxys de différents pays
@bibichouchou
merci d'avoir pris le temps de me répondre.
non la ligne de commande ne me fait pas peur, pour répondre a ta question beautifulsoup est une lib qui fait bien son job pour iterer sur les balises html.
Maintenant pour se qui est du parsing, je n'utiiserai pas Beautifullsoup.
Sur le plan de l'algo je me contenterai simplement d'utiliser urllib pour balancer la page dans une variable au format texte, comme il le fait d'aiileur, et l'iterer ligne par ligne a la recherche des mots clés qui nous interesse.
Bref je jetterai un oeil a ce sujet qui m'intéresse demain aprés une bonne nuit de sommeil.
Hors ligne
#13 Le 30/11/2013, à 22:58
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
@ bibichouchou
>>>k3c a écrit :
>>>mais c'est pas simple, le code est compliqué exprès
>>>tu parles évidemment du code html de la page web ?
oui, tout à fait, au lieu d'écrire une adresse IP, ils en écrivent un bout, puis ils écrivent ".12", ou alors un début d'adresse, comme "12.211.21" et ils ajoutent "1.34"
Bref des pervers psychopathes ont écrit ce code :-)
Pour les parseurs HTML/XML, ça dépend.
Pour du HTML, dans ce code j'utilise BeautifulSoup3, la doc est à
http://www.crummy.com/software/Beautifu … ation.html
sinon j'utilise de préférence BeautifulSoup4, la doc est à
http://www.crummy.com/software/BeautifulSoup/bs4/doc/
J'avais commencé à la traduire, mais je n'ai pas terminé :-(
Pour du xml, je préfère lxml, qui est considéré comme rapide, mais soyons honnêtes, pour mes scripts analysant un peu de xml (et pas des documents énormes), on s'en fout.
si tu regardes les scripts concernant tv5mondeplus, d8 et tou.tv, tu verras des utilisations simples de lxml
Debian 12 sur Thinkpad reconditionné
En ligne
#14 Le 01/12/2013, à 00:07
- bibichouchou
Re : [script Python] Récupérer simplement des proxys de différents pays
@ k3c, Olivier_Dev
merci pour vos indications sur beautifulsoup ou autres. je vais regarder et creuser. je pensais utiliser le même outil (= beautifulsoup) pour le html et le xml, histoire de n'apprendre qu'un seul truc (ouais, ch'uis un peu feignasse)... mais apparemment, c'est possible mais pas forcément le mieux en terme de performance. d'un autre côté, comme tu dis, k3c, si c'est quelques pages, on s'en fiche un peu
@ Olivier_Dev
en fait, k3c a écrit ce bout de code pour faciliter l'utilisation de get_iplayer en dehors du sol britannique. get_iplayer permet d'accéder aux vidéos bbc et est dans les dépôts officiels. [A propos, ça me paraît toujours incroyable, vu que c'est limite limite côté légalité (mais c'est un long débat).] Et les vidéos utilisent le protocole rtmp. Donc il faut utiliser rtmpdump+vlc pour les lire.
Dernière modification par bibichouchou (Le 01/12/2013, à 00:08)
Hors ligne
#15 Le 01/12/2013, à 00:16
- Olivier_Dev
Re : [script Python] Récupérer simplement des proxys de différents pays
ok ok
tiens si ça peut aider, voici le script sans beautifullsoup et un retour de dico pour get_valid_countries ainsi qu'un gestion d exception pour get_proxy si l'argument fait cracher urllib:
#!/usr/bin/python
#-*- coding:utf-8 -*-
import sys
from urllib2 import urlopen, HTTPError
__version__ = '0.1'
proxinova = 'http://www.proxynova.com/proxy-server-list/country-gb/'
proxinova_research = 'http://www.proxynova.com/proxy-server-list/country-'
def get_valid_countries():
country_proxy_list = {}
# Use any country to get the full countries list
html = urlopen(proxinova).readlines()
for line in html:
if "option" in line:
split_line = line.split()
for element in split_line:
if "value" in element:
country_pair = element.replace('value=','').replace('"','').split('>')
if country_pair[0] != "" and len(country_pair) > 1:
#print country_pair
country_proxy_list[country_pair[0]] = country_pair[1]
#return dictionnary
return country_proxy_list
def get_proxy(country):
country_proxy_list = []
country_name = get_valid_countries()
try:
html = urlopen( proxinova_research + country + '/').readlines()
except HTTPError, e:
print e
sys.exit()
for line in html:
if "print" in line:
ip_search = line.split('(')[1].split(')')[0].replace('"','').replace('+','').replace(' ','')
if ip_search.split('.')[0].isdigit() and not ip_search.split('.')[0] == "None":
ip = ip_search
if "Proxies with port" in line:
port = line.split("/")[4].split('-')[1]
proxy = ip + ":" + port
country_proxy_list.append(u'%s' %proxy)
#exemple
print len(country_proxy_list), "proxy found for :",country, country_name[country]
#return list
return country_proxy_list
if __name__ == '__main__':
if len(sys.argv) == 1:
print get_valid_countries()
else:
print get_proxy(sys.argv[1])
Dernière modification par Olivier_Dev (Le 01/12/2013, à 00:17)
Hors ligne
#16 Le 01/12/2013, à 00:24
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
@bibichouchou
>>>A propos, ça me paraît toujours incroyable, vu que c'est limite limite côté légalité (mais c'est un long débat).] Et les vidéos utilisent le protocole rtmp. >>>Donc il faut utiliser rtmpdump+vlc pour les lire.
Ce qui est marrant, c'est que la BBC ou les canadiens de tou.tv, c'est le même système, il faut un proxy du pays pour récupérer la vraie adresse de la vidéo, ensuite plus besoin, on envoie le rtmpdump ou une autre commande, et on récupère la vidéo, et comme souvent elle reste disponioble bien plus longtemps que les 7 ou 15 ou 30 jours annoncés..
Par exemple, j'aime bien les Inspecteur Montalbano
http://fr.wikipedia.org/wiki/Salvo_Montalbano
et c'est dispo sur la RAI, je vais ajouter un proxy italien à des scripts xbmc pour la RAI
Pareil pour des scripts norvégiens proposant Lilyhammer ou Bron sur nrk.no.
Les fichiers de sous-titres sont disponibles partout.
Dernière modification par k3c (Le 01/12/2013, à 07:09)
Debian 12 sur Thinkpad reconditionné
En ligne
#17 Le 01/12/2013, à 12:56
- Vergeylen
Re : [script Python] Récupérer simplement des proxys de différents pays
Hello,
bibichouchou a écrit :@Vergeylen
salut,je ne suis pas un expert ès proxy, mais apparemment il y a différents types de proxys proposés sur des sites comme celui du script. Les qualificatifs sont à peu près "non anonyme", "anonyme", "hautement anonyme". j'imagine que le proxy que tu as sélectionné est "non anonyme". du coup, ben ça sert à rien de l'utiliser via foxyproxy ou je ne sais quoi dans firefox : le proxy est transparent et le site sait qu'en fait celui qui fait la requête est en belgique. il faut prendre garde à sélectionner les proxys qui anonymisent vraiment. ;-) peut-être que k3c peut modifier son script pour en tenir compte ? ah ben d'ailleurs, je viens de regarder le site en question et il y a une colonne qui dit si le proxy est transparent, anonyme ou élite (?)... k3c si tu as un peu de temps...
Essai ce proxy fr de catégorie elite
87.255.159.182:80et dis-nous (si tu essayes rapidement, sinon prends le plus récent de la liste)
Malheureusement il ne répond pas, même pas aux pings...
En fait, il faut de la chance, avoir un proxy Elite et qu'il ait été vérifié il y a peu de temps...
@bibichouchou,
en fait moi je suis Belge, donc j'utiliserais bien ce système pour voir des émissions belges quand je suis en France..
Hors ligne
#18 Le 01/12/2013, à 15:35
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
@ Vergeylen
>>>En fait, il faut de la chance, avoir un proxy Elite et qu'il ait été vérifié il y a peu de temps..
Le problème des proxys gratuits, c'est justement qu'il y en a plein qui ne sont pas fiables, de là le business autour des VPN payants et des proxys payants.
@ bibichouchou
Petit tuto de parsing HTML/XML avec BeautifulSoup
Illustration avec une vidéo sur d8.tv
http://www.d8.tv/d8-series/pid6654-d8-longmire.html
on y trouve dans le source de la page (CTRL U sous Firefox)
<div class="block-common block-player-programme">
<div class="bpp-player">
<div class="playerVideo player_16_9">
<canal:player videoId="980635" width="640" height="360" id="CanalPlayerEmbarque"></canal:player>
comment trouver ce qui suit videoId=, qui est l'identifiant de la vidéo ?
from urllib2 import urlopen
import bs4 as BeautifulSoup
on lit la page
html = urlopen('http://www.d8.tv/d8-series/pid6654-d8-longmire.html').read()
s = BeautifulSoup.BeautifulSoup(html)
On commence par chercher les balises div avec class et block-common block-player-programme
s.findAll('div', attrs={"class":u"block-common block-player-programme"})
renvoie une liste Python, cette liste peut contenir 0 à n éléments.
[<div class="block-common block-player-programme">
<div class="bpp-player">
<div class="playerVideo player_16_9">
<canal:player height="360" id="CanalPlayerEmbarque" videoid="980635" width="640"></canal:player>
</div>
</div>
<input id="iVideoEnCours" type="hidden" value="980635"/>
<div class="bpp-infos">
<div class="bpp-share">
<a class="twitter-share-button" data-count="hoizontal" data-lang="fr" data-text="Episode 4 : Le cancer" data-url="http://player.canalplus.fr/#/980635&sc_cmpid=TWSha
re" data-via="D8TV" href="http://twitter.com/share"></a>
<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
<div class="fb-like" data-action="like" data-colorscheme="light" data-height="21" data-href="http://player.canalplus.fr/#/980635&sc_cmpid=FBShare" data-layout="butt
on_count" data-send="false" data-show-faces="false" data-width="145"></div>
</div>
<h3 class="bpp-title">Episode 4 : Le cancer - Longmire</h3>
</div>
<ul class="bpp-list bpp-list-empty">
</ul>
</div>]
Ici pas de programmation défensive, on suppose que le premier élément de la liste est ce que l'on veut, donc on ajoute [0] pour prendre ce premier élément
s.findAll('div', attrs={"class":u"block-common block-player-programme"})[0]
<div class="block-common block-player-programme">
<div class="bpp-player">
<div class="playerVideo player_16_9">
<canal:player height="360" id="CanalPlayerEmbarque" videoid="980635" width="640"></canal:player>
</div>
</div>
<input id="iVideoEnCours" type="hidden" value="980635"/>
<div class="bpp-infos">
<div class="bpp-share">
<a class="twitter-share-button" data-count="hoizontal" data-lang="fr" data-text="Episode 4 : Le cancer" data-url="http://player.canalplus.fr/#/980635&sc_cmpid=TWSha
re" data-via="D8TV" href="http://twitter.com/share"></a>
<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
<div class="fb-like" data-action="like" data-colorscheme="light" data-height="21" data-href="http://player.canalplus.fr/#/980635&sc_cmpid=FBShare" data-layout="butt
on_count" data-send="false" data-show-faces="false" data-width="145"></div>
</div>
<h3 class="bpp-title">Episode 4 : Le cancer - Longmire</h3>
</div>
<ul class="bpp-list bpp-list-empty">
</ul>
</div>
ce qui nous intéresse est
<canal:player height="360" id="CanalPlayerEmbarque" videoid="980635" width="640"></canal:player>
donc on sélectionne cette ligne
s.findAll('div', attrs={"class":u"block-common block-player-programme"})[0]('canal:player')
ou, autre syntaxe
s.findAll('div', attrs={"class":u"block-common block-player-programme"})[0].find('canal:player')
renvoie une autre liste
[<canal:player height="360" id="CanalPlayerEmbarque" videoid="980635" width="640"></canal:player>]
en debug, les commandes type(x), dir(x), sont très utiles, pour savoir si on manipule un bs4 element tag (souvent dans BeautifulSoup), et si on a à notre disposition une méthode
has_key
has_attr
get
contents
text
descendants
children
ou autre
dir(soup.findAll('div', attrs={"class":u"block-common block-player-programme"})[0])
['FORMATTERS', '__call__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__eq__', '__format__', '__getattr__', '__getattribute__',
'__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__'
, '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_all_strings', '_attr_value_as_string', '_attribute_checker', '_find_all',
'_find_one', '_lastRecursiveChild', '_last_descendant', 'append', 'attribselect_re', 'attrs', 'can_be_empty_element', 'childGenerator', 'children', 'clear', 'contents',
'decode', 'decode_contents', 'decompose', 'descendants', 'encode', 'encode_contents', 'extract', 'fetchNextSiblings', 'fetchParents', 'fetchPrevious', 'fetchPreviousSi
blings', 'find', 'findAll', 'findAllNext', 'findAllPrevious', 'findChild', 'findChildren', 'findNext', 'findNextSibling', 'findNextSiblings', 'findParent', 'findParents
', 'findPrevious', 'findPreviousSibling', 'findPreviousSiblings', 'find_all', 'find_all_next', 'find_all_previous', 'find_next', 'find_next_sibling', 'find_next_sibling
s', 'find_parent', 'find_parents', 'find_previous', 'find_previous_sibling', 'find_previous_siblings', 'format_string', 'get', 'getText', 'get_text', 'has_attr', 'has_k
ey', 'hidden', 'index', 'insert', 'insert_after', 'insert_before', 'isSelfClosing', 'is_empty_element', 'name', 'namespace', 'next', 'nextGenerator', 'nextSibling', 'ne
xtSiblingGenerator', 'next_element', 'next_elements', 'next_sibling', 'next_siblings', 'parent', 'parentGenerator', 'parents', 'parserClass', 'parser_class', 'prefix',
'prettify', 'previous', 'previousGenerator', 'previousSibling', 'previousSiblingGenerator', 'previous_element', 'previous_elements', 'previous_sibling', 'previous_sibli
ngs', 'recursiveChildGenerator', 'renderContents', 'replaceWith', 'replaceWithChildren', 'replace_with', 'replace_with_children', 'select', 'setup', 'string', 'strings'
, 'stripped_strings', 'tag_name_re', 'text', 'unwrap', 'wrap']
et on y est
soup.findAll('div', attrs={"class":u"block-common block-player-programme"})[0].div('canal:player')[0].get('videoid')
'980635'
ou
soup.findAll('div', attrs={"class":u"block-common block-player-programme"})[0].div('canal:player')[0]['videoid']
'980635'
Prenez ce que vous trouvez le plus lisible !
Dernière modification par k3c (Le 01/12/2013, à 21:16)
Debian 12 sur Thinkpad reconditionné
En ligne
#19 Le 01/12/2013, à 18:51
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
Pour le scripting XML, on ouvre le fichier
http://service.canal-plus.com/video/res … /d8/980635
donc
from lxml import objectify
zz = urlopen('http://service.canal-plus.com/video/rest/getVideosLiees/d8/980635).read()
root = objectify.fromstring(zz)
on a maintenant la base pour analyser un arbre XML, par exemple
for element in root.iter():
if element.tag == 'HD':
print element.text
rtmp://geo2-vod-fms.canalplus.fr/ondemand/geo2/1311/1163291_4_1500k.mp4
rtmp://geo2-vod-fms.canalplus.fr/ondemand/geo2/1311/1163291_2_1500k.mp4
rtmp://geo2-vod-fms.canalplus.fr/ondemand/geo2/1311/1163291_3_1500k.mp4
rtmp://ugc-vod-fms.canalplus.fr/ondemand/videos/1311/BA_LONGMIRE_BASTON__131125_UGC_3357_video_HD.mp4
rtmp://ugc-vod-fms.canalplus.fr/ondemand/videos/1311/LONGMIRE___BANDE_ANNONCE__131120_UGC_3279_video_HD.mp4
Bon j'ai étalé toute ma culture pour scripter du XML (oui il n'y a pas grand chose !).
Dernière modification par k3c (Le 01/12/2013, à 21:03)
Debian 12 sur Thinkpad reconditionné
En ligne
#20 Le 12/12/2013, à 17:27
- bibichouchou
Re : [script Python] Récupérer simplement des proxys de différents pays
salut,
avec du retard un grand merci à vous deux pour vos exemples. je vais potasser cela très vite (j'espère ce weekend... on fait pas toujours ce qu'on veut dans la vie...)
Hors ligne
#21 Le 18/12/2013, à 15:05
- hokusai
Re : [script Python] Récupérer simplement des proxys de différents pays
Hello je m'immisce avec une question dérangeantes... partant du fait que google scholar bloque de façon aléatoire les pages des bouquins en fonction de l'ip et du temps, ce script pourrait-il être couplé avec un autre script qui permettrait de récupérer les ouvrages en lignes? Je sais c'est sûrement pas bien dit comme ça mais... à 30€ minimum les ouvrages que je suis obligé de consulter pour mes recherches je vous laisse deviner jusqu'à quel point la culture est accessible ;-)
-- Debian wheezy Net install + Awesome -- Laptop Samsung 8Go RAM I5 NVIDIA Optimus --
Hors ligne
#22 Le 06/03/2014, à 20:59
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
Le site proxynova ayant changé, voici une nouvelle version
#!/usr/bin/python
#-*- coding:utf-8 -*-
from urllib2 import urlopen
import sys
from BeautifulSoup import BeautifulSoup
__version__ = '0.1'
cat_elite = 0
cat_transp = 1
cat_anon = 2
cat_other = 3
def get_valid_countries():
res = set()
# Use any country to get the full countries list
html = urlopen('http://www.proxynova.com/proxy-server-list/country-gb/').read()
soup = BeautifulSoup(html)
asel = soup.find('select', attrs={'name':'proxy_country'})
aopt = asel.findAll('option')
for opt in aopt:
if opt.has_key('value') and opt['value'] != u'' :
res.add(opt['value'])
return res
def get_proxy(country):
html = urlopen('http://www.proxynova.com/proxy-server-list/country-' + country + '/').read()
soup = BeautifulSoup(html)
atr = soup.find('tbody').findAll('tr')
tbl = []
fl = True
for tr in atr:
atd = tr.findAll('td')
n = 0
for x in atd:
if x.has_key('colspan'):
continue
# ip, port, x, x, x, category
if n < 2:
if fl:
tmp = x
else:
port = x
fl = not fl
if n == 5:
category = x.span.string
cat = x.span.string
if cat == u'Elite':
cat = cat_elite
elif cat == u'Transparent':
cat = cat_transp
elif cat == u'Anonymous':
cat = cat_anon
else:
cat = cat_other
tbl.append([tmp, port, cat])
n+=1
lst = []
for addr, port, category in tbl:
try:
v = addr.span.script.string
v = v[v.find('(')+ 1:-2]
v = v.replace('"', '').replace(' ','').replace('+','')
if port.a is not None:
proxy = u"%s:%s" % (v, str(port.a.string))
else:
vv = port.contents[0].replace('\t','').replace('\n','').replace('\r', '')
proxy = u"%s:%s" % (v, vv)
lst.append((category, proxy))
#mettre la bonne exception
except:
pass
lst.sort()
return lst
if __name__ == '__main__':
if len(sys.argv) == 1:
print get_valid_countries()
else:
print get_proxy(sys.argv[1])
Debian 12 sur Thinkpad reconditionné
En ligne
#23 Le 09/03/2014, à 16:49
- melixgaro
Re : [script Python] Récupérer simplement des proxys de différents pays
salut k3c,
c'est gentil de faire la maintenance !
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#24 Le 09/03/2014, à 17:16
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
ah tiens, ça sert à une personne !
il faut passer le pays en minuscule, sinon on a une superbe erreur 404 !
ou modifier
def get_proxy(country):
country = country.lower()
html = urlopen('http://www.proxynova.com/proxy-server-list/country-' + country + '/').read()
soup = BeautifulSoup(html)
Dernière modification par k3c (Le 09/03/2014, à 18:16)
Debian 12 sur Thinkpad reconditionné
En ligne
#25 Le 24/05/2014, à 20:42
- k3c
Re : [script Python] Récupérer simplement des proxys de différents pays
Le site ayant changé, une nouvelle version
#!/usr/bin/python
#-*- coding:utf-8 -*-
from urllib2 import urlopen
import sys
from BeautifulSoup import BeautifulSoup
__version__ = '0.1'
cat_elite = 0
cat_transp = 1
cat_anon = 2
cat_other = 3
def get_valid_countries():
res = set()
# Use any country to get the full countries list
country = country.lower()
html = urlopen('http://www.proxynova.com/proxy-server-list/country-gb/').read()
soup = BeautifulSoup(html)
asel = soup.find('select', attrs={'name':'proxy_country'})
aopt = asel.findAll('option')
for opt in aopt:
if opt.has_key('value') and opt['value'] != u'' :
res.add(opt['value'])
return res
def get_proxy(country):
country = country.lower()
html = urlopen('http://www.proxynova.com/proxy-server-list/country-' + country + '/').read()
soup = BeautifulSoup(html)
atr = soup.find('tbody').findAll('tr')
tbl = []
fl = True
for tr in atr:
atd = tr.findAll('td')
n = 0
for x in atd:
if x.has_key('colspan'):
continue
# ip, port, x, x, x, category
if n < 2:
if fl:
tmp = x
else:
port = x
fl = not fl
if n == 5:
category = x.span.string
cat = x.span.string
if cat == u'Elite':
cat = cat_elite
elif cat == u'Transparent':
cat = cat_transp
elif cat == u'Anonymous':
cat = cat_anon
else:
cat = cat_other
tbl.append([tmp.span.contents[0], port, cat])
n+=1
lst = []
for addr, port, category in tbl:
try:
v = addr.string.strip()
v = v[v.find('(')+ 1:-2]
v = v.replace('"', '').replace(' ','').replace('+','')
if port.a is not None:
proxy = u"%s:%s" % (v, str(port.a.string))
else:
vv = port.contents[0].replace('\t','').replace('\n','').replace('\r', '')
proxy = u"%s:%s" % (v, vv)
lst.append((category, proxy))
#mettre la bonne exception
except Exception,e:
print e
lst.sort()
return lst
if __name__ == '__main__':
if len(sys.argv) == 1:
print get_valid_countries()
else:
print get_proxy(sys.argv[1])
exemple
python proxy.py ca
affiche des proxys canadiens, d'abord ceux de catégorie 0 (élite)
[(0, u'178.82.51.:80'), (0, u'213.144.132.1:80'), (0, u'31.11.3.:80'), (0, u'80.218.81.1:80'), (0, u'93.184.16.:81'), (2, u'46.28.206.:3128'), (2, u'62.202.16.:3128'), (2, u'81.13.132.1:8080'), (2, u'81.13.184.1:8080'), (2, u'81.13.186.:80'), (2, u'81.13.186.:8080'), (2, u'81.13.235.:80')]
Edit : ah problème avec les proxys suisses, ce ne récupère pas l'adresse IP complète, je regarde...
Dernière modification par k3c (Le 24/05/2014, à 21:51)
Debian 12 sur Thinkpad reconditionné
En ligne