67 votes

Quelqu'un connais un bon basé sur Python, web crawler que je pourrais utiliser?

Je suis à moitié tenté d'écrire mon propre, mais je n'ai pas vraiment assez de temps en ce moment. J'ai vu l'article sur Wikipedia: liste de l'open source robots , mais je préfère quelque chose d'écrit en Python. Je me rends compte que je pourrais simplement utiliser l'un des outils sur la page de Wikipedia et l'envelopper dans Python. Je pourrais le faire - si quelqu'un a des conseils à propos de l'un de ces outils, je suis ouvert à entendre parler d'eux. J'ai utilisé Heritrix via son interface web, et je trouve qu'il est assez lourd. Je certainement ne pas être l'aide d'un navigateur API pour mon prochain projet.

Merci à l'avance. Aussi, c'est mon premier DONC question!

56voto

RexE Points 4498
  • Mechanize est mon préféré; grand de haut niveau de fonctionnalités de navigation (super-simple remplissage du formulaire et de la soumission).
  • Le sergé est un langage de script simple construit sur le haut de Mécaniser
  • BeautifulSoup + urllib2 fonctionne également très bien.
  • Scrapy ressemble à une très prometteuse projet; c'est nouveau.

44voto

nosklo Points 75862

Utilisation Scrapy.

C'est un tordu à base de web crawler cadre. Encore en développement, mais il fonctionne déjà. A de nombreux goodies:

  • La prise en charge intégrée pour l'analyse HTML, XML, CSV, et Javascript
  • Un support de pipeline pour le raclage des articles avec des images (ou tout autre support) et de télécharger les fichiers image
  • Faveur de l'extension de Scrapy en branchant votre propre fonctionnalité à l'aide de middlewares, des extensions, et des canalisations
  • Large gamme de middlewares et des extensions pour le traitement de la compression, cache, les cookies, l'authentification, l'usurpation d'agent utilisateur, robots.txt de manutention, de statistiques, d'analyse de la profondeur de restriction, etc
  • Interactif de grattage coque de la console, très utiles pour le développement et le débogage
  • Web de la console de gestion pour le suivi et le contrôle de votre bot
  • Console Telnet pour un accès de bas niveau à la Scrapy processus

Exemple de code pour extraire des informations sur tous les fichiers torrent ajouté aujourd'hui dans le mininova site de torrent, à l'aide d'un XPath sélecteur sur le code HTML renvoyé:

class Torrent(ScrapedItem):
    pass

class MininovaSpider(CrawlSpider):
    domain_name = 'mininova.org'
    start_urls = ['http://www.mininova.org/today']
    rules = [Rule(RegexLinkExtractor(allow=['/tor/\d+']), 'parse_torrent')]

    def parse_torrent(self, response):
        x = HtmlXPathSelector(response)
        torrent = Torrent()

        torrent.url = response.url
        torrent.name = x.x("//h1/text()").extract()
        torrent.description = x.x("//div[@id='description']").extract()
        torrent.size = x.x("//div[@id='info-left']/p[2]/text()[2]").extract()
        return [torrent]

6voto

CMS Points 315406

De vérifier la HarvestMan, un multi-fileté web-crawler écrit en Python, aussi un coup d'œil à l' spider.py le module.

Et ici vous pouvez trouver des exemples de code pour construire un simple web-crawler.

3voto

kshahar Points 3014

J'ai utilisé Ruya et l'a trouvé très bon.

3voto

shim Points 31

J'ai piraté le script ci-dessus pour inclure une page de connexion comme j'ai besoin d'accéder à un site drupal. Pas joli, mais il peut aider quelqu'un là-bas.

#!/usr/bin/python

import httplib2
import urllib
import urllib2
from cookielib import CookieJar
import sys
import re
from HTMLParser import HTMLParser

class miniHTMLParser( HTMLParser ):

  viewedQueue = []
  instQueue = []
  headers = {}
  opener = ""

  def get_next_link( self ):
    if self.instQueue == []:
      return ''
    else:
      return self.instQueue.pop(0)


  def gethtmlfile( self, site, page ):
    try:
        url = 'http://'+site+''+page
        response = self.opener.open(url)
        return response.read()
    except Exception, err:
        print " Error retrieving: "+page
        sys.stderr.write('ERROR: %s\n' % str(err))
    return "" 

    return resppage

  def loginSite( self, site_url ):
    try:
    cj = CookieJar()
    self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

    url = 'http://'+site_url 
        params = {'name': 'customer_admin', 'pass': 'customer_admin123', 'opt': 'Log in', 'form_build_id': 'form-3560fb42948a06b01d063de48aa216ab', 'form_id':'user_login_block'}
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    self.headers = { 'User-Agent' : user_agent }

    data = urllib.urlencode(params)
    response = self.opener.open(url, data)
    print "Logged in"
    return response.read() 

    except Exception, err:
    print " Error logging in"
    sys.stderr.write('ERROR: %s\n' % str(err))

    return 1

  def handle_starttag( self, tag, attrs ):
    if tag == 'a':
      newstr = str(attrs[0][1])
      print newstr
      if re.search('http', newstr) == None:
        if re.search('mailto', newstr) == None:
          if re.search('#', newstr) == None:
            if (newstr in self.viewedQueue) == False:
              print "  adding", newstr
              self.instQueue.append( newstr )
              self.viewedQueue.append( newstr )
          else:
            print "  ignoring", newstr
        else:
          print "  ignoring", newstr
      else:
        print "  ignoring", newstr


def main():

  if len(sys.argv)!=3:
    print "usage is ./minispider.py site link"
    sys.exit(2)

  mySpider = miniHTMLParser()

  site = sys.argv[1]
  link = sys.argv[2]

  url_login_link = site+"/node?destination=node"
  print "\nLogging in", url_login_link
  x = mySpider.loginSite( url_login_link )

  while link != '':

    print "\nChecking link ", link

    # Get the file from the site and link
    retfile = mySpider.gethtmlfile( site, link )

    # Feed the file into the HTML parser
    mySpider.feed(retfile)

    # Search the retfile here

    # Get the next link in level traversal order
    link = mySpider.get_next_link()

  mySpider.close()

  print "\ndone\n"

if __name__ == "__main__":
  main()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X