Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails)

#1 Le 19/11/2013, à 20: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, à 06:58)


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#2 Le 20/11/2013, à 19: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 ? hmm

Hors ligne

#3 Le 20/11/2013, à 19: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...


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#4 Le 21/11/2013, à 10: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. smile

Daniel.


https://Place2Be.biz (en préparation)

Hors ligne

#5 Le 22/11/2013, à 16: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

Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#6 Le 30/11/2013, à 16: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.


https://Place2Be.biz (en préparation)

Hors ligne

#7 Le 30/11/2013, à 19: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, à 22: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, à 23:15)


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#9 Le 30/11/2013, à 23: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, à 23:18

k3c

Re : [script Python] Récupérer simplement des proxys de différents pays

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:80

et dis-nous (si tu essayes rapidement, sinon prends le plus récent de la liste)


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#11 Le 30/11/2013, à 23: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

k3c a écrit :

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, à 23:26)

Hors ligne

#12 Le 30/11/2013, à 23: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, à 23: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


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#14 Le 01/12/2013, à 01: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, à 01:08)

Hors ligne

#15 Le 01/12/2013, à 01: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, à 01:17)

Hors ligne

#16 Le 01/12/2013, à 01: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, à 08:09)


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#17 Le 01/12/2013, à 13:56

Vergeylen

Re : [script Python] Récupérer simplement des proxys de différents pays

Hello,

k3c a écrit :
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:80

et 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... hmm

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.. smile


https://Place2Be.biz (en préparation)

Hors ligne

#18 Le 01/12/2013, à 16: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&amp;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&amp;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&amp;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&amp;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, à 22:16)


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#19 Le 01/12/2013, à 19: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, à 22:03)


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#20 Le 12/12/2013, à 18: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, à 16: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, à 21: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])

Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#23 Le 09/03/2014, à 17:49

melixgaro

Re : [script Python] Récupérer simplement des proxys de différents pays

salut k3c,

c'est gentil de faire la maintenance !


Utilisateur Linux depuis ~2007 : Mandriva 2007 => Ubuntu 8.04 => Ubuntu 8.10 => Opensuse 10 => Ubuntu 9.10 => Fedora 11 => Ubuntu 10.04 => Ubuntu 10.10 [la meilleure des ubuntu avant la cata unity] => Xubuntu 11.10 => Xubuntu 12.04 => Xubuntu 12.10 => Xubuntu 13.10

Hors ligne

#24 Le 09/03/2014, à 18: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, à 19:16)


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

#25 Le 24/05/2014, à 21: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, à 22:51)


Acer Aspire One 150 8,9 "
Norhtec avec une Clé Usb bootable http://www.norhtec.com/products/mcsr/index.html

Toshiba Satellite L750

Hors ligne

Haut de page ↑