首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >谁知道一个好的基于Python的网络爬虫,我可以使用?

谁知道一个好的基于Python的网络爬虫,我可以使用?
EN

Stack Overflow用户
提问于 2009-01-07 04:53:22
回答 5查看 97K关注 0票数 67

我不太想写我自己的,但是我现在真的没有足够的时间。我看过维基百科上的open source crawlers列表,但我更喜欢用Python语言写的东西。我意识到我可能只需要使用Wikipedia页面上的工具之一,并将其包装在Python中。我可能最终会这么做--如果任何人对这些工具有任何建议,我都乐于倾听。我通过Heritrix的web界面使用过它,我发现它相当笨拙。我肯定不会为我即将到来的项目使用浏览器API。

提前谢谢。另外,这也是我的第一个问题!

EN

回答 5

Stack Overflow用户

发布于 2009-01-07 05:11:41

查看HarvestMan,这是一个用Python语言编写的多线程网络爬虫,同时也查看了spider.py模块。

here你可以找到构建一个简单网络爬虫的代码样本。

票数 6
EN

Stack Overflow用户

发布于 2009-01-07 05:07:59

我用过Ruya,发现它很好用。

票数 3
EN

Stack Overflow用户

发布于 2010-11-11 18:04:05

我修改了上面的脚本,在访问drupal站点时需要包含一个登录页面。不是很漂亮,但可能会帮助到某个人。

代码语言:javascript
复制
#!/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()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/419235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档