Question

Au lieu d'utiliser simplement urllib, est-ce que quelqu'un connaît le package le plus efficace pour le téléchargement rapide et multithread d'URL pouvant fonctionner via des proxies http? J'en connais quelques-uns comme Twisted, Scrapy, libcurl, etc., mais je n'en sais pas assez sur eux pour prendre une décision ou même s'ils peuvent utiliser des procurations. Quelqu'un connaît-il le meilleur à mes fins? Merci!

Était-ce utile?

La solution

est simple à implémenter en python.

  

La fonction urlopen () fonctionne   de manière transparente avec des mandataires qui font   pas besoin d'authentification. Dans un Unix   ou Windows, définissez le   http_proxy, ftp_proxy ou gopher_proxy   les variables d'environnement à une URL qui   identifie le serveur proxy avant   démarrer l'interpréteur Python

# -*- coding: utf-8 -*-

import sys
from urllib import urlopen
from BeautifulSoup import BeautifulSoup
from Queue import Queue, Empty
from threading import Thread

visited = set()
queue = Queue()

def get_parser(host, root, charset):

    def parse():
        try:
            while True:
                url = queue.get_nowait()
                try:
                    content = urlopen(url).read().decode(charset)
                except UnicodeDecodeError:
                    continue
                for link in BeautifulSoup(content).findAll('a'):
                    try:
                        href = link['href']
                    except KeyError:
                        continue
                    if not href.startswith('http://'):
                        href = 'http://%s%s' % (host, href)
                    if not href.startswith('http://%s%s' % (host, root)):
                        continue
                    if href not in visited:
                        visited.add(href)
                        queue.put(href)
                        print href
        except Empty:
            pass

    return parse

if __name__ == '__main__':
    host, root, charset = sys.argv[1:]
    parser = get_parser(host, root, charset)
    queue.put('http://%s%s' % (host, root))
    workers = []
    for i in range(5):
        worker = Thread(target=parser)
        worker.start()
        workers.append(worker)
    for worker in workers:
        worker.join()

Autres conseils

généralement, les mandataires filtrent les sites Web de manière catégorique en fonction de la manière dont ils ont été créés. Il est difficile de transmettre des données via des serveurs mandataires basés sur des catégories. Par exemple, youtube est classé comme flux audio / vidéo, c’est pourquoi youtube est bloqué à certains endroits, notamment dans les écoles. Si vous souhaitez éviter les mandataires, extraire les données d’un site Web et les placer dans votre propre site Web, comme un site Web com qui peut l’être enregistré. Lorsque vous créez et enregistrez un site Web, définissez-le comme tout ce que vous voulez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top