python编写的简单爬虫程序

来源:互联网 发布:t.tt域名多少钱 编辑:程序博客网 时间:2024/06/04 19:38

本文目的:

从某个网站作为起点,爬虫获取到指定数目的图片、或者ftp资源;然后结束。

 

主要使用HTMLParser解析资源(开始使用SGMLParser,但是发现img标签不能解析出来,就换了这个)。

 

拷贝代码保存,python $文件名 就可以运行了。

使用时主要需要修改的就是HOST/URI (爬虫开始的URL),NUM_ALL(指定获取资源的数目,到这个数目之后停止,运行时可能有小的误差,会大于该数目),

 

import urllib2
import HTMLParser

IMGS=[]
URLS=[]
FTPURLS=[]

MODES={1:"IMG_MODE",2:"FTP_MODE",3:"URLS_MODE"}
##定义制定的资源类型 

mymode=2  #获取FTP资源

NUM_ALL=100 #获取100个资源后停止

HOST="http://www.xiaopian.com"
URI="/html/gndy/jddy/20131109/103626.html"
originalUrl=HOST+URI  ##从该页面开始获取资源

 
def myAddElement(myArr,element): ###该函数主要是为了在记录资源的时候,不要重复记录
 if element in myArr:
  return
 else:
  myArr.append(element)

class myparser(HTMLParser.HTMLParser): ###定义HTML解析函数
 def __init__(self):
  HTMLParser.HTMLParser.__init__(self)
  
 def handle_starttag(self, tag, attrs):
  if tag=="img": ##图片资源
   for k,v in attrs:
    if k=="src":
     # IMGS.append(v)
     myAddElement(IMGS,v)
  elif tag=="a":
   for k,v in attrs:
    if "ftp:" in v or "thunder:" in v:  ##ftp或者thunder资源
     myAddElement(FTPURLS,v)
     continue
    if k=="href": ##页面中的http连接记录下来
     if "#" not in v:
      if "http:" not in v:
       tmpstr=HOST+v
       myAddElement(URLS,tmpstr)
      elif "http" in v:
       myAddElement(URLS,v)  
  
 def handle_endtag(self, tag):
  # print "end tag name :"  + tag
  pass 
 def resert(self):
  HTMLParser.reset(self)

##结束自己的解析类定义


def testmyparser(htmldata): ###解析html数据的函数
 try:
  parser=myparser()
  parser.feed(htmldata)
  parser.reset()
 except:
  print "may some coding error exists! go on"

def oneUrlParser(url):  ##调用上一个函数,主要用来解析单个页面
 print url
 try:
  oneUrlData=urllib2.urlopen(url).read()
 except:
  print "get url data exception"
  return 0
 testmyparser(oneUrlData)
 
def mysearch(url,MODEVALUE): ##调用上面一个函数,遍历第一个页面中获取到的urls进行解析,获取资源链接
 MODE=MODES.get(MODEVALUE,'ERROR')
 if MODES.has_key(MODEVALUE):
  print "your input mode is: " + MODE + ", value is: " + str(MODEVALUE)
 else:
  print "[WARNGING]: You have input the wrong mode. Please try again. (IMG_MODE|FTP_MODE|URLS_MODE)"
  return
 oneUrlParser(url)
 while(len(URLS)>0):
  oneUrlParser(URLS[0])
  del URLS[0]
  if MODE=="IMG_MODE":
   print len(IMGS)
   if len(IMGS)>=NUM_ALL:
    break
  elif MODE=="FTP_MODE":
   print len(FTPURLS)
   if len(FTPURLS)>=NUM_ALL:
    break
  elif MODE=="URLS_MODE":
   print len(URLS)
   if len(URLS)>=NUM_ALL:
    break

def printRes(MODEVALUE): ##打印获取到的资源结果
 MODE=MODES.get(MODEVALUE,'ERROR')
 if MODE=="IMG_MODE":
  print IMGS
 elif MODE=="FTP_MODE":
  print FTPURLS
 elif MODE=="URLS_MODE":
  print URLS
 else:
  print "[ERROR]you must input the wrong mode"


mysearch(originalUrl,mymode)###开始检索
printRes(mymode)##打印结果

 

程序只根据自己的需要实现了对应的功能;暂未考虑其他场景下的应用~~