资源描述:
《python-实现网络爬虫、蜘蛛》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
|python中如何提取网页正文啊谢谢importurllib.request url="http://google.cn/" response=urllib.request.urlopen(url) page=response.read() python提取网页中的文本1.importos,sys,datetime 2.importhttplib,urllib,re 3.fromsgmllibimportSGMLParser 4. 5.importtypes 6. 7.classHtml2txt(SGMLParser): 8. defreset(self): 9. self.text='' 10. self.inbody=True 11. SGMLParser.reset(self) 12. defhandle_data(self,text): 13. ifself.inbody: 14. self.text+=text 15. 16. defstart_head(self,text): 17. self.inbody=False 18. defend_head(self): 19. self.inbody=True 20. 21. 22.if__name__=="__main__": 23. parser=Html2txt() 24. parser.feed(urllib.urlopen("http://icode.csdn.net").read()) 25. parser.close() 26. printparser.text.strip() python下载网页importhttplib conn=httplib.HTTPConnection("www.baidu.com")conn.request("GET","/index.html")r1=conn.getresponse()printr1.status,r1.reason |data=r1.read()printdataconn.close用python下载网页,超级简单!fromurllibimporturlopenwebdata=urlopen("").read()printwebdata深入python里面有python 下载网页内容,用python的pycurl模块实现1.用python下载网页内容还是很不错的,之前是使用urllib模块实验的,但听说有pycurl这个模块,而且比urllib好,所以尝试下,废话不说,以下是代码2.3.4.#!/usr/bin/envpython5.#-*-coding:utf-8-*-6.importStringIO7.importpycurl8.9.defwritefile(fstr,xfilename): f=open(xfilename,'w') f.write(fstr) f.close10.1.html=StringIO.StringIO()2.c=pycurl.Curl() |1.myurl='http://www.ppgchenshan.com'2. 3.c.setopt(pycurl.URL,myurl)4. 5.#写的回调6.c.setopt(pycurl.WRITEFUNCTION,html.write)7. 8.c.setopt(pycurl.FOLLOWLOCATION,1)9. 10.#最大重定向次数,可以预防重定向陷阱11.c.setopt(pycurl.MAXREDIRS,5)12. 13.#连接超时设置14.c.setopt(pycurl.CONNECTTIMEOUT,60)15.c.setopt(pycurl.TIMEOUT,300)16. 17.#模拟浏览器18.c.setopt(pycurl.USERAGENT,"Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322)")19. 20. 21. 22.#访问,阻塞到访问结束23.c.perform()24. 25.#打印出200(HTTP状态码,可以不需要)26.printc.getinfo(pycurl.HTTP_CODE)27. 28.#输出网页的内容 |1.printhtml.getvalue()2.#保存成down.txt文件3.writefile(html.getvalue(),"down.txt")python的pycurl模块的安装可以到http://pycurl.sourceforge.net/download/这里去找.不同系统使用不同版本,自己看看总结下,Python下载网页的几种方法1fd=urllib2.urlopen(url_link)data=fd.read()这是最简洁的一种,当然也是Get的方法2通过GET的方法defGetHtmlSource(url):try:htmSource=''req=urllib2.Request(url)fd=urllib2.urlopen(req,"")while1:data=fd.read(1024)ifnotlen(data):breakhtmSource+=datafd.close()delfd |delreqhtmSource=htmSource.decode('cp936')htmSource=formatStr(htmSource)returnhtmSourceexceptsocket.error,err:str_err="%s"%errreturn""3通过GET的方法defGetHtmlSource_Get(htmurl):htmSource=""try:urlx=httplib.urlsplit(htmurl)conn=httplib.HTTPConnection(urlx.netloc)conn.connect()conn.putrequest("GET",htmurl,None)conn.putheader("Content-Length",0)conn.putheader("Connection","close")conn.endheaders()res=conn.getresponse()htmSource=res.read()exceptException(),err:trackback.print_exec()conn.close()returnhtmSource |通过POST的方法defGetHtmlSource_Post(getString):htmSource=""try:url=httplib.urlsplit("http://app.sipo.gov.cn:8080")conn=httplib.HTTPConnection(url.netloc)conn.connect()conn.putrequest("POST","/sipo/zljs/hyjs-jieguo.jsp")conn.putheader("Content-Length",len(getString))conn.putheader("Content-Type","application/x-www-form-urlencoded")conn.putheader("Connection","Keep-Alive")conn.endheaders()conn.send(getString)f=conn.getresponse()ifnotf:raisesocket.error,"timedout"htmSource=f.read()f.close()conn.close()returnhtmSourceexceptException(),err:trackback.print_exec()conn.close()returnhtmSource本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sding/archive/2010/04/29/5538065.aspxDjango+python+BeautifulSoup组合的垂直搜索爬虫使用python+BeautifulSoup完成爬虫抓取特定数据的工作,并使用Django搭建一个管理平台,用来协调抓取工作。 |因为自己很喜欢Djangoadmin后台,所以这次用这个后台对抓取到的链接进行管理,使我的爬虫可以应对各种后期的需求。比如分时段抓取,定期的对已经抓取的地址重新抓取。数据库是用python自带的sqlite3,所以很方便。这几天正好在做一个电影推荐系统,需要些电影数据。本文的例子是对豆瓣电影抓取特定的数据。第一步:建立Django模型模仿nutch的爬虫思路,这里简化了。每次抓取任务开始先从数据库里找到未保存的(is_save=False)的链接,放到抓取链表里。你也可以根据自己的需求去过滤链接。python代码:viewplaincopytoclipboardprint?01.classCrawl_URL(models.Model):02.url=models.URLField('抓取地址',max_length=100,unique=True)03.weight=models.SmallIntegerField('抓取深度',default=0)#抓取深度起始104.is_save=models.BooleanField('是否已保存',default=False)#05.date=models.DateTimeField('保存时间',auto_now_add=True,blank=True,null=True)06.def__unicode__(self):07.returnself.urlclassCrawl_URL(models.Model):url=models.URLField('抓取地址',max_length=100,unique=True)weight=models.SmallIntegerField('抓取深度',default=0)#抓取深度起始1is_save=models.BooleanField('是否已保存',default=False)#date=models.DateTimeField('保存时间',auto_now_add=True,blank=True,null=True)def__unicode__(self):returnself.url然后生成相应的表。还需要一个admin管理后台viewplaincopytoclipboardprint?01.classCrawl_URLAdmin(admin.ModelAdmin):02.list_display=('url','weight','is_save','date',)03.ordering=('-id',)04.list_filter=('is_save','weight','date',)05.fields=('url','weight','is_save',) |06.admin.site.register(Crawl_URL,Crawl_URLAdmin)classCrawl_URLAdmin(admin.ModelAdmin):list_display=('url','weight','is_save','date',)ordering=('-id',)list_filter=('is_save','weight','date',)fields=('url','weight','is_save',)admin.site.register(Crawl_URL,Crawl_URLAdmin)第二步,编写爬虫代码爬虫是单线程,并且每次抓取后都有相应的暂定,豆瓣网会禁止一定强度抓取的爬虫爬虫根据深度来控制,每次都是先生成链接,然后抓取,并解析出更多的链接,最后将抓取过的链接is_save=true,并把新链接存入数据库中。每次一个深度抓取完后都需要花比较长的时候把链接导入数据库。因为需要判断链接是否已存入数据库。这个只对满足正则表达式http://movie.douban.com/subject/(d+)/的地址进行数据解析。并且直接忽略掉不是电影模块的链接。第一次抓取需要在后台加个链接,比如http://movie.douban.com/chart,这是个排行榜的页面,电影比较受欢迎。python代码:#这段代码不能格式化发#coding=UTF-8importurllib2fromBeautifulSoupimport*fromurlparseimporturljoinfrompysqlite2importdbapi2assqlitefrommovie.modelsimport*fromdjango.contrib.auth.modelsimportUserfromtimeimportsleepimage_path='C:/Users/soul/djcodetest/picture/'user=User.objects.get(id=1)defcrawl(depth=10):foriinrange(1,depth):print'开始抓取for%d....'%ipages=Crawl_URL.objects.filter(is_save=False)newurls={} |forcrawl_pageinpages:page=crawl_page.urltry:c=urllib2.urlopen(page)except:continuetry:#解析元数据和urlsoup=BeautifulSoup(c.read())#解析电影页面ifre.search(r'^http://movie.douban.com/subject/(d+)/$',page):read_html(soup)#解析出有效的链接,放入newurlslinks=soup('a')forlinkinlinks:if'href'indict(link.attrs):url=urljoin(page,link['href'])ifurl.find("'")!=-1:continueiflen(url)>60:continueurl=url.split('#')[0]#removielocationportionifre.search(r'^http://movie.douban.com',url):newurls[url]=crawl_page.weight+1#连接有效。存入字典中try:print'addurl:'except:passexceptException.args:try:print"Couldnotparse:%s"%argsexcept:pass#newurls存入数据库is_save=Falseweight=icrawl_page.is_save=Truecrawl_page.save()#休眠2.5秒sleep(2.5)save_url(newurls)#保存url,放到数据库里defsave_url(newurls):for(url,weight)innewurls.items():url=Crawl_URL(url=url,weight=weight)try:url.save()except: |try:print'url重复:'except:passreturnTrue第三步,用BeautifulSoup解析页面抽取出电影标题,图片,剧情介绍,主演,标签,地区。关于BeautifulSoup的使用可以看这里BeautifulSoup技术文档viewplaincopytoclipboardprint?01.#抓取数据02.defread_html(soup):03.#解析出标题04.html_title=soup.html.head.title.string05.title=html_title[:len(html_title)-5]06.#解析出电影介绍07.try:08.intro=soup.find('span',attrs={'class':'allhidden'}).text09.except:10.try:11.node=soup.find('div',attrs={'class':'blank20'}).previousSibling12.intro=node.contents[0]+node.contents[2]13.except:14.try:15.contents=soup.find('div',attrs={'class':'blank20'}).previousSibling.previousSibling.text16.intro=contents[:len(contents)-22]17.except:18.intro=u'暂无'19.20.#取得图片21.html_image=soup('a',href=re.compile('douban.com/lpic'))[0]['href']22.data=urllib2.urlopen(html_image).read()23.image='201003/'+html_image[html_image.rfind('/')+1:]24.f=file(image_path+image,'wb')25.f.write(data)26.f.close()27.28.29.#解析出地区30.try:31.soup_obmo=soup.find('div',attrs={'class':'obmo'}).findAll('span')32.html_area=soup_obmo[0].nextSibling.split('/')33.area=html_area[0].lstrip()34.except:35.area=''36.37.#time=soup_obmo[1].nextSibling.split('')[1]38.#time=time.strptime(html_time,'%Y-%m-%d')39.40.#生成电影对象41.new_movie=Movie(title=title,intro=intro,area=area,version='暂无',upload_user=user,image=image)42.new_movie.save()43.try:44.actors=soup.find('div',attrs={'id':'info'}).findAll('span')[5].nextSibling.nextSibling.string.split('')[0]45.actors_list=Actor.objects.filter(name=actors)46.iflen(actors_list)==1:47.actor=actors_list[0]48.new_movie.actors.add(actor)49.else:50.actor=Actor(name=actors)51.actor.save()52.new_movie.actors.add(actor)53.except:54.pass55.56.#tag57.tags=soup.find('div',attrs={'class':'blank20'}).findAll('a')58.fortag_htmlintags:59.tag_str=tag_html.string60.iflen(tag_str)>4:61.continue62.tag_list=Tag.objects.filter(name=tag_str)63.if |len(tag_list)==1:64.tag=tag_list[0]65.66.new_movie.tags.add(tag)67.else:68.tag=Tag(name=tag_str)69.tag.save()70.new_movie.tags.add(tag)71.#try:72.73.#exceptException.args:74.#print"Couldnotdownload:%s"%args75.printr'downloadsuccess'76.#抓取数据defread_html(soup):#解析出标题html_title=soup.html.head.title.stringtitle=html_title[:len(html_title)-5]#解析出电影介绍try:intro=soup.find('span',attrs={'class':'allhidden'}).textexcept:try:node=soup.find('div',attrs={'class':'blank20'}).previousSiblingintro=node.contents[0]+node.contents[2]except:try:contents=soup.find('div',attrs={'class':'blank20'}).previousSibling.previousSibling.textintro=contents[:len(contents)-22]except:intro=u'暂无'#取得图片html_image=soup('a',href=re.compile('douban.com/lpic'))[0]['href']data=urllib2.urlopen(html_image).read()image='201003/'+html_image[html_image.rfind('/')+1:]f=file(image_path+image,'wb')f.write(data)f.close()#解析出地区try:soup_obmo=soup.find('div',attrs={'class':'obmo'}).findAll('span')html_area=soup_obmo[0].nextSibling.split('/')area=html_area[0].lstrip()except:area=''#time=soup_obmo[1].nextSibling.split('')[1]#time=time.strptime(html_time,'%Y-%m-%d') |#生成电影对象new_movie=Movie(title=title,intro=intro,area=area,version='暂无',upload_user=user,image=image)new_movie.save()try:actors=soup.find('div',attrs={'id':'info'}).findAll('span')[5].nextSibling.nextSibling.string.split('')[0]actors_list=Actor.objects.filter(name=actors)iflen(actors_list)==1:actor=actors_list[0]new_movie.actors.add(actor)else:actor=Actor(name=actors)actor.save()new_movie.actors.add(actor)except:pass#tagtags=soup.find('div',attrs={'class':'blank20'}).findAll('a')fortag_htmlintags:tag_str=tag_html.stringiflen(tag_str)>4:continuetag_list=Tag.objects.filter(name=tag_str)iflen(tag_list)==1:tag=tag_list[0]new_movie.tags.add(tag)else:tag=Tag(name=tag_str)tag.save()new_movie.tags.add(tag)#try:#exceptException.args:#print"Couldnotdownload:%s"%argsprintr'downloadsuccess'豆瓣的电影页面并不是很对称,所以有时候抓取的结果可能会有点出入 |本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Java2King/archive/2010/03/15/5378951.aspx爬Google的查询页最近没有没有GoogleAPIkey了,因此只能自己将查询对应的URL准备好,然后通过脚本将该链接对应的网页爬下来。我们假定,我们要爬这样一个页面:http://www.google.com/search?q=IBM我们可以直接在浏览器输入上面的URL,可以看到,是Google对应IBM这个查询的返回页。我们现在的目的是通过python程序把这个返回页download下来,存在本地,为后面的工作准备数据。一下就是我的代码:importurllib2,urlparse,gzipfromStringIOimportStringIOUSER_AGENT='Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR2.0.50727;CIBA;InfoPath.2;360SE)'classSmartRedirectHandler(urllib2.HTTPRedirectHandler):defhttp_error_301(self,req,fp,code,msg,headers):result=urllib2.HTTPRedirectHandler.http_error_301(self,req,fp,code,msg,headers)result.status=codereturnresultdefhttp_error_302(self,req,fp,code,msg,headers):result=urllib2.HTTPRedirectHandler.http_error_302(self,req,fp,code,msg,headers)result.status=codereturnresultclassDefaultErrorHandler(urllib2.HTTPDefaultErrorHandler):defhttp_error_default(self,req,fp,code,msg,headers):result=urllib2.HTTPError(req.get_full_url(),code,msg,headers,fp)result.status=codereturnresultdefopenAnything(source,etag=None,lastmodified=None,agent=USER_AGENT):ifhasattr(source,'read'):returnsource |ifsource=='-':returnsys.stdinifurlparse.urlparse(source)[0]=='http':request=urllib2.Request(source)request.add_header('USER-AGENT',agent)request.add_header('Cookie','PREF=ID=5e8d1d15fe369be8:U=95d9eb627acc6c79:LD=en:NW=1:CR=2:TM=1270616770:LM=1270616914:S=FAiBW5rEW2azKJXk;NID=33=rXimIAwO_TvEyFlE4lBRkxr1x3TTVh36maim2Cn0gk3b3SAbtn79qkAtgIli18d382TnTCFMOXjzgqxQFCEWLHEbnyf-MtVwfa4-pYmXSMkUMPYqDi61ZmmqyPcBbwzP')ifetag:request.add_header('If-None-Match',etag)iflastmodified:request.add_header('If-Modified-Since',lastmodified)#request.add_header('Accept-encoding','gzip')#request.add_header('Connection','Keep-Alive')opener=urllib2.build_opener(SmartRedirectHandler(),DefaultErrorHandler())returnopener.open(request)try:returnopen(source)except(IOError,OSError):passreturnStringIO(str(sources))deffetch(source,etag=None,last_modified=None,agent=USER_AGENT):result={}f=openAnything(source,etag,last_modified,agent)result['data']=f.read()ifhasattr(f,'headers'):result['etag']=f.headers.get('ETag')result['lastmodified']=f.headers.get('Last-Modified')iff.headers.get('content-encoding','')=='gzip':result['date']=gzip.GzipFile(fileobj=StringIO(result['data'])).read()ifhasattr(f,'url'):result['url']=f.urlresult['status']=200ifhasattr(f,'status'):result['status']=f.statusf.close()returnresult |if__name__=='__main__':result=fetch("http://www.google.com/search?q=IBM")printresult['data']printresult['url']printresult['status']要注意一下几点:1、要加User-agent,否则GOOGLE会返回403的forbidden信息,因为Python默认的User-agent是python........2、如果不想被重定向到Google中国,哦,NO,是Google香港,那么要记得在自己的cookie中找到对应的cookie加上去3、这种东西要多抓包,一个字节一个字节的比对,要相信,浏览器也是程序写的,浏览器能做到的程序也能做到本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/caiyichaobupt/archive/2010/04/08/5459497.aspx下载糗事百科的内容_python版1.#coding:utf-82.3.importurllib.request4.importxml.dom.minidom5.importsqlite36.importthreading7.importtime8.9.classlogger(object):10.deflog(self,*msg):11.foriinmsg:12.print(i)13.14.Log=logger()15.Log.log('测试下')16.17.classdownloader(object):18.19.def__init__(self,url):20.self.url=url21.22.defdownload(self):23.Log.log('开始下载',self.url)24.try:25.content=urllib.request.urlopen(self.url).read()26.#req=urllib.request.Request(url)27.#response= |urllib.request.urlopen(req)28.#content=response.read()29.Log.log('下载完毕')30.return(content)31.except:32.Log.log('下载出错')33.return(None)34.35.36.classparser(object):37.38.def__init__(self,content):39.#获得根节点40.self.html=xml.dom.minidom.parseString(content)41.42.defparse(self):43.Log.log('开始提取数据')44.contents={'content':'','url':[]}45.#获得div节点46.divs=self.html.getElementsByTagName('div')47.#获得content节点48.fordivindivs:49.ifdiv.hasAttribute('class')and50.div.getAttribute('class')=='content':51.#获得糗事百科的内容52.textNode=div.childNodes[0]53.qContent=textNode.data54.#数据填充55.contents['content']=qContent56.57.#获得上一糗事、下一糗事节点58.spans=self.html.getElementsByTagName('span')59.forspaninspans:60.pspan=span.parentNode61.ifpspan.tagName=='a':62.#pspan为对应的链接,此时需要将对应的地址加入数据库63.url=pspan.getAttribute('href')64.qid=url[10:][:-4]65.#数据填充66.contents['url'].append(qid)67.Log.log('提取数据完毕')68.return(contents)69.70.defdownloadPage(qid,db):71.url='http://www.qiushibaike.com/articles/'+str(qid)+'.htm'72.content=downloader(url).download()73.ifcontent:74.contents=parser(content).parse()75.ifcontents['content']:76.db.updateContent(qid,contents['content'])77.foriincontents['url']:78.db.addQID(i) |79.iflen(contents['url'])==2:80.db.updateStatus(qid,2)81.82.#下载池,表示同时允许下载的链接个数83.classdownloaderPool(object):84.def__init__(self,maxLength=15):85.self.downloaders=[None]*maxLength86.self.downloadList=[]87.self.db=None88.89.defsetDownloadList(self,downloadList):90.self.downloadList=list(set(self.downloadList+downloadList))91.92.defsetdb(self,db):93.self.db=db94.95.defdaemon(self):96.#每隔一秒查询线程的状态,为非活动线程则设置为None97.Log.log('设置守护进程')98.forindex,downloaderinenumerate(self.downloaders):99.ifdownloader:100.ifnotdownloader.isAlive():101.Log.log('将下载器置空',index)102.self.downloaders[index]=None103.104.#检查线程池状态105.forindex,downloaderinenumerate(self.downloaders):106.ifnotdownloader:107.qid=self.getQID()108.ifqid:109.#创建线程110.t=threading.Thread(target=downloadPage,args=(qid,self.db))111.self.downloaders[index]=t112.t.start()113.t.join()114.Log.log('设置下载器',index)115.#间隔一秒执行一次116.time.sleep(1)117.118.defgetQID(self):119.try:120.tmp=self.downloadList[0]121.delself.downloadList[0]122.return(tmp)123.except:124.return(None)125.126.defbeginDownload(self):127.#创建守护线程128.daemon=threading.Thread(target=self.daemon)129.daemon.setDaemon(True) |130.daemon.start()131.daemon.join()132.133.defgetDownloader(self):134.forindex,downloaderinenumerate(self.downloaders):135.ifnotdownloader:136.return(index)137.return(None)138.139.140.ADD_Q_ID='insertintoqiushibaike(id,success)values(?,?)'141.UPDATE_Q_CONTENT='updateqiushibaikesetcontent=?whereid=?'142.UPDATE_Q_STATUS='updateqiushibaikesetsuccess=?whereid=?'143.Q_LIST='selectidfromqiushibaikewheresuccess=?'144.Q_LIST_BY_ID='selectcount(*)fromqiushibaikewhereid=?'145.classdbConnect(object):146."""147.createtableqiushibaike(148.id,Integer149.content,Varchar150.success,Interger151.)152.#id表示糗事的ID153.#content表示糗事的内容154.#success表示是否下载成功,当该糗事内容下载完成,且获得上一页、下一页ID时表示下载完成155.1表示未完成156.2表示完成157."""158.def__init__(self,dbpath='db.sqlite'):159.self.dbpath=dbpath160.161.defaddQID(self,qid):162.Log.log('插入糗事百科',qid)163.#获得连接164.cn=sqlite3.connect(self.dbpath)165.c=cn.cursor()166.167.try:168.#添加内容并提交169.c.execute(ADD_Q_ID,(qid,1))170.cn.commit()171.except:172.Log.log('添加ID出错',qid)173.174.#关闭连接175.c.close()176.177.cn.close()178.Log.log('插入成功')179. |180.defupdateContent(self,qid,content):181.Log.log('更新糗事百科',qid,content)182.#获得连接183.cn=sqlite3.connect(self.dbpath)184.c=cn.cursor()185.#添加内容并提交186.c.execute(UPDATE_Q_CONTENT,(content,qid))187.cn.commit()188.#关闭连接189.c.close()190.cn.close()191.Log.log('更新成功')192.193.defupdateStatus(self,qid,flag):194.Log.log('更新状态',qid,flag)195.#获得连接196.cn=sqlite3.connect(self.dbpath)197.c=cn.cursor()198.#添加内容并提交199.c.execute(UPDATE_Q_STATUS,(flag,qid))200.cn.commit()201.#关闭连接202.c.close()203.cn.close()204.Log.log('更新状态成功')205.206.defgetList(self,unDonloaded=1):207.Log.log('获得列表')208.l=[]209.#获得连接210.cn=sqlite3.connect(self.dbpath)211.c=cn.cursor()212.#获得数据213.c.execute(Q_LIST,(unDonloaded,))214.rows=c.fetchall()215.216.foriinrows:217.l.append(i[0])218.#关闭连接219.c.close()220.cn.close()221.222.Log.log('获得列表成功')223.return(l)224.225.classsingleDownloader(object):226.def__init__(self):227.self.downloadList=[]228.229.defsetdb(self,db):230.self.db=db231.232.defsetDownloadList(self,downloadList):233.self.downloadList=list(set(self.downloadList+downloadList)) |234.235.defbeginDownload(self):236.foriinself.downloadList:237.downloadPage(i,self.db)238.239.defmain():240.db=dbConnect('db.sqlite')241.#dp=downloaderPool()242.#dp.setdb(db)243.sp=singleDownloader()244.sp.setdb(db)245.246.dp=sp247.248.unDownloadedList=db.getList()249.#当还有未下载的糗事时就要继续下载250.while(len(unDownloadedList)):251.#使用该列表填充下载池252.dp.setDownloadList(unDownloadedList)253.254.dp.beginDownload()255.256.time.sleep(1)257.#重置参数258.unDownloadedList=db.getList()259.260.if__name__=='__main__':261.main()代码是没问题的,可以正常运行,但是希望做到以下2方面:1、多线程下载2、代码分离度更高,跟面向对象各位看家有什么好想法,贴出来看看。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jj_liuxin/archive/2008/12/08/3466701.aspx用python把xml和xsl转换为html前些天用python处理xml的转换的一个小程序,用来把xml,xsl转换成html。用的libxml2,所以还要先安装了libxml2模块才能使用。#-*-coding:mbcs-*-#!/usr/bin/pythonimportlibxml2,libxsltclasscompoundXML: |def__init__(self):self._result=Noneself._xsl=Noneself._xml=Nonedefdo(self,xml_file_name,xsl_file_name):self._xml=libxml2.parseFile(xml_file_name)ifself._xml==None:return0styledoc=libxml2.parseFile(xsl_file_name)ifstyledoc==None:return0self._xsl=libxslt.parseStylesheetDoc(styledoc)ifself._xsl==None:return0self._result=self._xsl.applyStylesheet(self._xml,None)defget_xml_doc(self):returnself._resultdefget_translated(self):returnself._result.serialize('UTF-8')defsave_translated(self,file_name):self._xsl.saveResultToFilename(file_name,self._result,0)defrelease(self):'''thisfunctionmustbecalledintheend.'''self._xsl.freeStylesheet()self._xml.freeDoc()self._result.freeDoc()self._xsl=Noneself._xml=Noneself._result=Noneif__name__=='__main__':test=compoundXML() |test.do('test/testxmlutil.xml','test/testxmlutil.xsl')printtest.get_translated()test.save_translated('test/testxmlutil.htm')test.release()本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhaoweikid/archive/2004/08/14/74837.aspx用python下载网页,超级简单!fromurllibimporturlopenwebdata=urlopen("http://www.pythonid.com").read()printwebdata够简单吧,哈哈。我来补充点,你那只能说是查看网页,怎能说是下载呢,总得如存吧importurllibwebfile=urllib.urlopen("http://www.insenz.com").read()fp=file('rhf.html','a+')#fp=open('rhf.html','a+')fp.write(webfile)fp.close()哦,我没有试www.insenz.com,我试的http://www.pythonid.com最简单的下载网页的方法只有2句:fromurllibimport |urlretrieveurlretrieve('http://www.python.org','f:\python_webpage.html')用python下载网页,超级简单!查看fromurllibimporturlopenwebdata=urlopen("http://www.pythonid.com").read()printwebdata---------------下载并保存importurllibwebfile=urllib.urlopen("http://www.insenz.com").read()fp=file('rhf.html','a+')#fp=open('rhf.html','a+')fp.write(webfile)fp.close()------------------下载南方周末最新网页并保存成一个txt文件列表里有个牛人做的。啄木鸟社区收录了.地址:http://wiki.woodpecker.org.cn/moin/MicroProj/2007-07-06#downhtmlfromzmandsavehtmltotxt# -*-coding:utf-8-*-importhtmllib,formatter,urllib,rewebsite='http://www.nanfangdaily.com.cn/zm/'f=urllib.urlopen(website)html=f.read().lower()i=html.find('url=')j=html.find('/',i+4)date=html[i+4:j]website+=datef=urllib.urlopen(website)p=htmllib.HTMLParser(formatter.NullFormatter())p.feed(f.read())p.close()seen=set()forurlinp.anchorlist: |ifurl[-3::]=='asp': ifurlinseen:continue seen.add(url)urls=list(seen)k=len(urls)doc=open(u'南方周末'.encode('gb18030')+date+'.txt','a')forl,urlinenumerate(urls):f=urllib.urlopen(website+url[1:])html=f.read()i=html.find('#ff0000')i=html.find('>',i+7)j=html.find('<',i+1)doc.write(html[i+1:j])i=html.find('content01',j+1)i=html.find('>',i+9)j=html.find(']*>',re.IGNORECASE)doc.write(reobj.sub(' ',content)+' ------------ ')printl+1,'-->',kdoc.close()printu'下载结束'把百度空间的文章下载为html/*作者:youstarhttp://www.youstar.org.ru转载注明原创*/0x1 本文借鉴网上的代码加以修改实现了一个可以把百度空间的文章下载为html的功能,相对而言还有很多功能需要添加。编程使用的语言是python,越来越喜欢这脚本了,感觉在处理很多事情上很方便,其中调用一些lib和函数,看代码的时候也学到了一些函数的使用。0x2#!/usr/bin/envpython#coding=utf-8importurllib2importreimportsysimportospattern=""reg_tail=""username="" |defdownURL(url,filename): print"Download%s,saveas%s"%(url,filename) try: fp=urllib2.urlopen(url) except: print"downloadexception" return0 paths=os.getcwd()+username+'/'+filename op=open(paths,"wb") while1: s=fp.read() ifnots: break op.write(s) fp.close() op.close() return1defgetURL(url): print"Parsing%s"%url try: fp=urllib2.urlopen(url) contents=fp.readlines() except: print"exception" return[] item_list=[] forsincontents: urls=pattern.findall(s) ifurls: item_list.extend(urls) fp.close() returnitem_listdefCreateDirectory(): ifnotos.path.exists(os.getcwd()+username): os.mkdir(os.getcwd()+username) print'step2:CreateDirectorySuccess!' else: print'step2:Directoryhasexisted!'defreptile(base_url): """ Downloadallarticlesfrombase_url. Arguments: -`base_url`:Urlof |website. """ page_list=[] base_page=base_url.rstrip("/")+"/blog/index/" sign_tail=u"尾页" tail="" total_page=10 globalusername print'step3:Numberofindex' try: fp=urllib2.urlopen(base_page+"0") except: print"%s:Notsuchurl"%page printsys.exc_info() else: forsinfp.readlines(): ifsign_tailins.decode("gbk"): tail=s.decode("gbk") break fp.close() iftail: pos=tail.rfind(u"尾页") total_page=int(tail[:pos-3].split("/")[-1]) output_list=[] foridxinrange(total_page+1): item_page="%s%d"%(base_page,idx) item_list=getURL(item_page) ifitem_list: output_list.extend(item_list) print'step4:Downpages!' item_list=list(set(output_list)) foriteminitem_list: down_url=item.replace("/%s"%username, "http://hi.baidu.com/%s"%username) local_file=down_url.split("/")[-1] ret=downURL(down_url,local_file) print"step5:Total:%darticles."%(len(item_list)) print"Congratulations" pass |if__name__=='__main__': iflen(sys.argv)!=2: print"Usage:%surlofbaiduspace"%sys.argv[0] print"Suchas:%shttp://hi.baidu.com/Username" sys.exit(1) base_url=sys.argv[1] ifnotbase_url.startswith("http://hi.baidu.com/"): print"WrongTypeofURL??","ItworksonBaiduSpaceonly." sys.exit(1)username=base_url.rstrip("/").split("/")[-1] print('step1:'+username) CreateDirectory() reg_tail=re.compile(u"%s.*?尾页"%username) pattern=re.compile("/%s/blog/item/.*?.html"%username) reptile(base_url)0x3 实现界面0x4 link: http://hi.baidu.com/yangyingchao/blog/item/25d74f1ed9ec11f91ad5767d.html http://zh-cn.w3support.net/index.php?db=so&id=273192 |用Python进行网页分析实现批量下载(finalversion)转自:http://www.builder.com.cn/2008/0517/867087.shtmlstart.bat //makethedirforfilesandruntheproject mkdirfiles pythonCustomParser.pyCustomParser.pyfromsgmllibimportSGMLParserfromstringimportfind,replace,rjustfromthreadingimportThreadimporturllib__author__="ChenPeng(peng.ch@hotmail.com)"__version__="$Revision:1.0$"__date__="$Date:2006/03/03$"__copyright__="Copyright(c)2006ChenPeng"__license__="Python"__all__=["Gif_163_Parser"]classPDownloadThread(Thread): """ Downloadthefilesinthedictandsavethemtolocalfileswiththegivenname """ def__init__(self,DictList,i): Thread.__init__(self) self.DictList=DictList self.pageno=str(i); defrun(self): forkinself.DictList.keys(): try: print'Download'+self.DictList[k]+'......' uFile=urllib.urlretrieve(self.DictList[k],'.files'+k+'.'+self.DictList[k].split('.')[self.DictList[k].split('.').__len__()-1]) except: logfile=open('error.log','a') | logfile.write(self.pageno+''+self.DictList[k]+' '+k+'n') logfile.close() print'Savetofile'+k classGif_163_Parser(SGMLParser): """ 任务:下载163彩图 原理:http://mms.163.com/new_web/cm_lv2_pic.jsp?catID=&ord=dDate&page=2&type=1&key= 从1到415页(共6637)分析得到如下路径:“/fgwx/hhsj/1_060302175613_186/128x128.gif” eg: 下载路径:http://mmsimg.163.com/new_web/loaditem.jsp/type=1/path=/fgwx/llfj/1_060302175612_995/176x176.gif """ defreset(self): SGMLParser.reset(self) self.headURL='http://mmsimg.163.com/new_web/loaditem.jsp/type=1/path=' self.SubURL=[] self.Links={} defstart_script(self,attrs): #self.SubURL.extend(['%s="%s"'%(key,value)forkey,valueinattrs]) pass defend_script(self): pass defhandle_data(self,text): iffind(text,'showPic')!=-1: self.Links[replace(text.split('n')[1],'xc3xfbxd7xd6:','')]=self.headURL+replace(text.split(',')[2],''',''); defExecute(self): foriinrange(1,415): |self.Links.clear; try: usock=urllib.urlopen("http://mms.163.com/new_web/cm_lv2_pic.jsp?catID=&ord=dDate&page="+str(i)+"&type=1&key=") self.feed(usock.read()) usock.close() TestThread=PDownloadThread(self.Links,i) TestThread.start() self.close() exceptIOError: pass #print(["%s=%sn"%(k,self.Links[k])forkinself.Links.keys()]) #printself.Linksif__name__=='__main__': #Gif_163_Parser().Execute(); testtask=Gif_163_Parser() testtask.Execute() python下载天涯图片http://octoberken.blogbus.com/logs/46055962.html高喊学python好多天。。。就是没作出过什么东西。前几天看见同事用java写了个下载天涯图片的程序,于是也用python写了一个练练手。。 #-*-coding:gbk-*-'''Createdon2009-9-7@author:Ken'''import urllibimporturllib2import |randomimportosfromsgmllibimportSGMLParserclassURLLister(SGMLParser):'''获取html中的图片地址url地址,装入list中'''defreset(self):SGMLParser.reset(self)self.img=[]self.urls=[]defstart_img(self,attrs):img=[vfork,vinattrsifk=='src']ifimg:self.img.extend(img)defstart_a(self,attrs):href=[vfork,vinattrsifk=='href']ifhref:self.urls.extend(href)defget_docum(url):url=url+'//'sock=urllib.urlopen(url)file=sock.read()sock.close()returnfiledefis_img(url):globalimglenthrequest=urllib2.Request(url)opener=urllib2.build_opener()try:con=opener.open(request)Type=con.headers.dict['content-type'][:5]#判断链接返回的content-type是不是图片。Length=int(con.headers.dict['content-length'])#判断图片大小ifLength>imglenth:returnTypeelse:return0except:print'该图片无法在服务器找到或者图片地址无法识别!'printurldefget_file_name(ospath,imgname):name='P'+str(random.randint(10000000,99 |999999))filepath="%s%s.%s"%(ospath,name,(imgname.split('.'))[-1])returnfilepath defget_img(rq):parser=URLLister(); doc=get_docum(rq); parser.feed(doc); img=parser.imgparser.close()foriinrange(0,len(img)):ifimg[i][0:4]!='http':#处理绝对路径img[i]=rq+img[i]returnimgdefget_url(rq):parser=URLLister(); doc=get_docum(rq); parser.feed(doc); urls=parser.urlsparser.close()foriinrange(0,len(urls)):ifurls[i][0:4]!='http':#处理绝对路径urls[i]=rq+urls[i]returnurlsdefdepth(url,dep,ospath):'''三个参数分别是url:需要下载的网站地址dep:需要遍历的深度ospath:图片下载的本地文件夹 '''globalnumifdep<=0:return0else:img=get_img(url)forjinrange(0,len(img)):ifis_img(img[j])=='image':isExist=True;while(isExist):#判断文件是否已经存在filepath=get_file_name(ospath,img[j]);if(notos.path.exists(filepath)):isExist=False;try:urllib.urlretrieve(img[j],filepath)print |'已经下载好第%d张图片'%(num+1)num+=1except:print'该图片无法下载或者图片地址无法识别!'printimg[j]else:passurls=get_url(url)iflen(urls)>0:forurlinurls:depth(url,dep-1,ospath)else:return0return1if__name__=='__main__':imglenth=1 #设置需要下载的图片大小。num=0depth('http://www.tudou.com/',2,"E:img\") print'********************************我爬完了!!******************************************'Python用HTMLParser解析HTML文件HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析。本文主要简单讲一下HTMLParser的用法.使用时需要定义一个从类HTMLParser继承的类,重定义函数:·handle_starttag(tag,attrs)·handle_startendtag(tag,attrs)·handle_endtag(tag)来实现自己需要的功能。tag是的html标签,attrs是(属性,值)元组(tuple)的列表(list).HTMLParser自动将tag和attrs都转为小写。下面给出的例子抽取了html中的所有链接:fromHTMLParserimportHTMLParser classMyHTMLParser(HTMLParser):def__init__(self): |HTMLParser.__init__(self)self.links=[] defhandle_starttag(self,tag,attrs):#print"Encounteredthebeginningofa%stag"%tagiftag=="a":iflen(attrs)==0:passelse:for(variable,value)inattrs:ifvariable=="href":self.links.append(value) if__name__=="__main__":html_code="""google.comPythonClubSina"""hp=MyHTMLParser()hp.feed(html_code)hp.close()print(hp.links)输出为:['www.google.com','www.pythonclub.org','www.sina.com.cn']如果想抽取图形链接就要重定义handle_startendtag(tag,attrs)函数从HTML文件中抽取正文的简单方案zz原文地址:http://ai-depot.com/articles/the-easy-way-to-extract-useful-text-from-arbitrary-html/ |译者导读:这篇文章主要介绍了从不同类型的HTML文件中抽取出真正有用的正文内容的一种有广泛适应性的方法。其功能类似于CSDN近期推出的“剪影”,能够去除页眉、页脚和侧边栏的无关内容,非常实用。其方法简单有效而又出乎意料,看完后难免大呼原来还可以这样!行文简明易懂,虽然应用了人工神经网络这样的算法,但因为FANN良好的封装性,并不要求读者需要懂得ANN。全文示例以Python代码写成,可读性更佳,具有科普气息,值得一读。每个人手中都可能有一大堆讨论不同话题的HTML文档。但你真正感兴趣的内容可能隐藏于广告、布局表格或格式标记以及无数链接当中。甚至更糟的是,你希望那些来自菜单、页眉和页脚的文本能够被过滤掉。如果你不想为每种类型的HTML文件分别编写复杂的抽取程序的话,我这里有一个解决方案。本文讲述如何编写与从大量HTML代码中获取正文内容的简单脚本,这一方法无需知道HTML文件的结构和使用的标签。它能够工作于含有文本内容的所有新闻文章和博客页面……你想知道统计学和机器学习在挖掘文本方面能够让你省时省力的原因吗?答案极其简单:使用文本和HTML代码的密度来决定一行文件是否应该输出。(这听起来有点离奇,但它的确有用!)基本的处理工作如下:·一、解析HTML代码并记下处理的字节数。·二、以行或段的形式保存解析输出的文本。·三、统计每一行文本相应的HTML代码的字节数·四、通过计算文本相对于字节数的比率来获取文本密度·五、最后用神经网络来决定这一行是不是正文的一部分。仅仅通过判断行密度是否高于一个固定的阈值(或者就使用平均值)你就可以获得非常好的结果。但你也可以使用机器学习(这易于实现,简直不值一提)来减少这个系统出现的错误。现在让我从头开始……转换HTML为文本你需要一个文本模式浏览器的核心,它应该已经内建了读取HTML文件和显示原始文本功能。通过重用已有代码,你并不需要把很多时间花在处理无效的XML文件上。我们将使用Python来完成这个例子,它的htmllib模块可用以解析HTML文件,formatter模块可用以输出格式化的文本。嗯,实现的顶层函数如下:defextract_text(html):#Derivefromformatter.AbstractWritertostoreparagraphs.writer=LineWriter()#Defaultformattersendscommandstoourwriter.formatter=AbstractFormatter(writer)#Derivefromhtmllib.HTMLParsertotrackparsedbytes.parser=TrackingParser(writer,formatter)#GivetheparsertherawHTMLdata.parser.feed(html)parser.close()#Filtertheparagraphsstoredandoutputthem. |returnwriter.output()TrackingParser覆盖了解析标签开始和结束时调用的回调函数,用以给缓冲对象传递当前解析的索引。通常你不得不这样,除非你使用不被推荐的方法——深入调用堆栈去获取执行帧。这个类看起来是这样的:classTrackingParser(htmllib.HTMLParser):"""Trytokeepaccuratepointerofparsinglocation."""def__init__(self,writer,*args):htmllib.HTMLParser.__init__(self,*args)self.writer=writerdefparse_starttag(self,i):index=htmllib.HTMLParser.parse_starttag(self,i)self.writer.index=indexreturnindexdefparse_endtag(self,i):self.writer.index=ireturnhtmllib.HTMLParser.parse_endtag(self,i)LinWriter的大部分工作都通过调用formatter来完成。如果你要改进或者修改程序,大部分时候其实就是在修改它。我们将在后面讲述怎么为它加上机器学习代码。但你也可以保持它的简单实现,仍然可以得到一个好结果。具体的代码如下:classParagraph:def__init__(self):self.text=''self.bytes=0self.density=0.0classLineWriter(formatter.AbstractWriter):def__init__(self,*args):self.last_index=0self.lines=[Paragraph()]formatter.AbstractWriter.__init__(self)defsend_flowing_data(self,data):#Workoutthelengthofthistextchunk.t=len(data)#We'veparsedmoretext,soincrementindex.self.index+=t#Calculatethenumberofbytessincelasttime.b=self.index-self.last_indexself.last_index=self.index#Accumulatethisinformationincurrentline.l=self.lines[-1]l.text+=data |l.bytes+=bdefsend_paragraph(self,blankline):"""Createanewparagraphifnecessary."""ifself.lines[-1].text=='':returnself.lines[-1].text+='n'*(blankline+1)self.lines[-1].bytes+=2*(blankline+1)self.lines.append(Writer.Paragraph())defsend_literal_data(self,data):self.send_flowing_data(data)defsend_line_break(self):self.send_paragraph(0)这里代码还没有做输出部分,它只是聚合数据。现在我们有一系列的文字段(用数组保存),以及它们的长度和生成它们所需要的HTML的大概字节数。现在让我们来看看统计学带来了什么。数据分析幸运的是,数据里总是存在一些模式。从下面的原始输出你可以发现有些文本需要大量的HTML来编码,特别是标题、侧边栏、页眉和页脚。 |虽然HTML字节数的峰值多次出现,但大部分仍然低于平均值;我们也可以看到在大部分低HTML字节数的字段中,文本输出却相当高。通过计算文本与HTML字节数的比率(即密度)可以让我们更容易明白它们之间的关系:密度值图更加清晰地表达了正文的密度更高,这是我们的工作的事实依据。过滤文本行过滤文本行的最简单方法是通过与一个阈值(如50%或者平均值)比较密度值。下面来完成LineWriter类:defcompute_density(self):"""Calculatethedensityforeachline,andtheaverage."""total=0.0forlinself.lines:l.density=len(l.text)/float(l.bytes)total+=l.density#Storeforoptionalusebytheneuralnetwork.self.average=total/float(len(self.lines))defoutput(self):"""Returnastringwiththeuselesslinesfilteredout."""self.compute_density()output=StringIO.StringIO()forlinself.lines:#Checkdensityagainstthreshold.#Customfilterextensionsgohere.ifl.density>0.5:output.write(l.text) |监督式机器学习这是一个标识文本行是否为正文的接口界面:所谓的监督式学习就是为算法提供学习的例子。在这个案例中,我们给定一系列已经由人标识好的文档——我们知道哪一行必须输出或者过滤掉。我们用使用一个简单的神经网络作为感知器,它接受浮点输入并通过“神经元”间的加权连接过滤信息,然后输后另一个浮点数。大体来说,神经元数量和层数将影响获取最优解的能力。我们的原型将分别使用单层感知器(SLP)和多层感知器(MLP)模型。我们需要找些数据来供机器学习。之前的LineWriter.output()函数正好派上用场,它使我们能够一次处理所有文本行并作出决定哪些文本行应该输出的全局结策。从直觉和经验中我们发现下面的几条原则可用于决定如何过滤文本行:·当前行的密度·当前行的HTML字节数·当前行的输出文本长度·前一行的这三个值·后一行的这三个值我们可以利用FANN的Python接口来实现,FANN是FastArtificialNeuralNetWork库的简称。基本的学习代码如下:frompyfannimportfann,libfann#Thiscreatesanewsingle-layerperceptronwith1outputand3inputs.obj=libfann.fann_create_standard_array(2,(3,1))ann=fann.fann_class(obj)#Loadthedatawedescribedabove.patterns=fann.read_train_from_file('training.txt')ann.train_on_data(patterns,1000,1,0.0)#Thentestitwithdifferentdata. |fordatin,datoutinvalidation_data:result=ann.run(datin)print'Got:',result,'Expected:',datout尝试不同的数据和不同的网络结构是比较机械的过程。不要使用太多的神经元和使用太好的文本集合来训练(过拟合),相反地应当尝试解决足够多的问题。使用不同的行数(1L-3L)和每一行不同的属性(1A-3A)得到的结果如下:有趣的是作为一个猜测的固定阈值,0.5的表现非常好(看第一列)。学习算法并不能仅仅通过比较密度来找出更佳的方案(第二列)。使用三个属性,下一个SLP比前两都好,但它引入了更多的假阴性。使用多行文本也增进了性能(第四列),最后使用更复杂的神经网络结构比所有的结果都要更好,在文本行过滤中减少了80%错误。注意:你能够调整误差计算,以给假阳性比假阴性更多的惩罚(宁缺勿滥的策略)。结论从任意HTML文件中抽取正文无需编写针对文件编写特定的抽取程序,使用统计学就能获得令人惊讶的效果,而机器学习能让它做得更好。通过调整阈值,你能够避免出现鱼目混珠的情况。它的表现相当好,因为在神经网络判断错误的地方,甚至人类也难以判定它是否为正文。现在需要思考的问题是用这些“干净”的正文内容做什么应用好呢?解析网页内容的好代码from sgmllib import SGMLParserimport urllibclass URLLister(SGMLParser): def reset(self): SGMLParser.reset(self) self.urls = [] def start_a(self, attrs): href = [v for k, v in attrs if k =='href'] if href: self.urls.extend(href) |if __name__ == '__main__': usock = urllib.urlopen('www.xxx.com') parser = URLLister() parser.feed(usock.read()) usock.close() for url in parser.urls: print urlpython模块之HTMLParser:解析html,获取urlHTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然后重新定义这几个以handler_开头的函数即可。这几个函数包括:handle_startendtag处理开始标签和结束标签handle_starttag处理开始标签,比如handle_endtag处理结束标签,比如handle_charref处理特殊字符串,就是以开头的,一般是内码表示的字符handle_entityref处理一些特殊字符,以&开头的,比如 handle_data处理数据,就是data中间的那些数据handle_comment处理注释handle_decl处理的东西这里我以从网页中获取到url为例,介绍一下。要想获取到url,肯定是要分析标签,然后取到它的href属性的值。下面是代码:#-*-encoding:gb2312-*-importHTMLParserclassMyParser(HTMLParser.HTMLParser):def__init__(self):HTMLParser.HTMLParser.__init__(self)defhandle_starttag(self,tag,attrs):#这里重新定义了处理开始标签的函数 |iftag=='a':#判断标签的属性forname,valueinattrs:ifname=='href':printvalueif__name__=='__main__':a='test链接到163'my=MyParser()#传入要分析的数据,是html的。my.feed(a)本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhaoweikid/archive/2007/06/13/1649997.aspx利用Python抓取和解析网页(一)对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文将详细介绍如何利用Python抓取和解析网页。首先,我们介绍一个可以帮助简化打开位于本地和Web上的HTML文档的Python模块,然后,我们论述如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图像和Cookie等。最后,我们会给出一个规整HTML文件的格式标签的例子,通过这个例子您会发现使用python处理HTML文件的内容是非常简单的一件事情。 一、解析URL 通过Python所带的urlparse模块,我们能够轻松地把URL分解成元件,之后,还能将这些元件重新组装成一个URL。当我们处理HTML文档的时候,这项功能是非常方便的。 importurlparse parsedTuple=urlparse.urlparse( "http://www.google.com/search? hl=en&q=urlparse&btnG=Google+Search") unparsedURL=urlparse.urlunparse((URLscheme, | URLlocation,URLpath,'','','')) newURL=urlparse.urljoin(unparsedURL, "/module-urllib2/request-objects.html") 函数urlparse(urlstring[,default_scheme[,allow_fragments]])的作用是将URL分解成不同的组成部分,它从urlstring中取得URL,并返回元组(scheme,netloc,path,parameters,query,fragment)。注意,返回的这个元组非常有用,例如可以用来确定网络协议(HTTP、FTP等等)、服务器地址、文件路径,等等。 函数urlunparse(tuple)的作用是将URL的组件装配成一个URL,它接收元组(scheme,netloc,path,parameters,query,fragment)后,会重新组成一个具有正确格式的URL,以便供Python的其他HTML解析模块使用。 函数urljoin(base,url[,allow_fragments])的作用是拼接URL,它以第一个参数作为其基地址,然后与第二个参数中的相对地址相结合组成一个绝对URL地址。函数urljoin在通过为URL基地址附加新的文件名的方式来处理同一位置处的若干文件的时候格外有用。需要注意的是,如果基地址并非以字符/结尾的话,那么URL基地址最右边部分就会被这个相对路径所替换。比如,URL的基地址为Http://www.testpage.com/pub,URL的相对地址为test.html,那么两者将合并成http://www.testpage.com/test.html,而非http://www.testpage.com/pub/test.html。如果希望在该路径中保留末端目录,应确保URL基地址以字符/结尾。 下面是上面几个函数的详细一点的用法举例:importurlparse URLscheme="http" URLlocation="www.python.org" URLpath="lib/module-urlparse.html" modList=("urllib","urllib2", "httplib","cgilib") #将地址解析成组件 print"用Google搜索python时地址栏中URL的解析结果" parsedTuple= |urlparse.urlparse( "http://www.google.com/search? hl=en&q=python&btnG=Google+Search") printparsedTuple #将组件反解析成URL print"反解析python文档页面的URL" unparsedURL=urlparse.urlunparse( (URLscheme,URLlocation,URLpath,'','','')) print"t"+unparsedURL #将路径和新文件组成一个新的URL print" 利用拼接方式添加更多python文档页面的URL" formodinmodList: newURL=urlparse.urljoin(unparsedURL, "module-%s.html"%(mod)) print"t"+newURL #通过为路径添加一个子路径来组成一个新的URL print" 通过拼接子路径来生成Python文档页面的URL" newURL=urlparse.urljoin(unparsedURL, "module-urllib2/request-objects.html") print"t"+newURL上述代码的执行结果如下所示: 用Google搜索python时地址栏中URL的解析结果 | ('http','www.google.com','/search','', 'hl=en&q=python&btnG=Google+Search','') 反解析python文档页面的URL http://www.python.org/lib/module-urlparse.html 利用拼接方式添加更多python文档页面的URL http://www.python.org/lib/module-urllib.html http://www.python.org/lib/module-urllib2.html http://www.python.org/lib/module-httplib.html http://www.python.org/lib/module-cgilib.html 通过拼接子路径来生成Python文档页面的URL http://www.python.org/lib/module-urllib2/request-objects.html 二、打开HTML文档 上面介绍了如何解析页面的URL,现在开始讲解如何通过URL打开一个网页。实际上,Python所带的urllib和urllib2这两个模块为我们提供了从URL打开并获取数据的功能,当然,这包括HTML文档。 importurllib u=urllib.urlopen(webURL) u=urllib.urlopen(localURL) buffer=u.read() printu.info() print"从%s读取了%d字节数据. "%(u.geturl(),len(buffer)) 若要通过urllib模块中的urlopen(url[,data])函数打开一个HTML文档,必须提供该文档的URL地址,包括文件名。函数urlopen不仅可以打开位于远程web服务器上的文件,而且可以打开一个本地文件,并返回一个类似文件的对象,我们可以通过该对象从HTML文档中读出数据。 | 一旦打开了HTML文档,我们就可以像使用常规文件一样使用read([nbytes])、readline()和readlines()函数来对文件进行读操作。若要读取整个HTML文档的内容的话,您可以使用read()函数,该函数将文件内容作为字符串返回。 打开一个地址之后,您可以使用geturl()函数取得被获取网页的真正的URL。这是很有用的,因为urlopen(或使用的opener对象)也许会伴随一个重定向。获取的网页URL也许和要求的网页URL不一样。 另一个常用的函数是位于从urlopen返回的类文件对象中的info()函数,这个函数可以返回URL位置有关的元数据,比如内容长度、内容类型,等等。下面通过一个较为详细的例子来对这些函数进行说明。 importurllib webURL="http://www.python.org" localURL="index.html" #通过URL打开远程页面 u=urllib.urlopen(webURL) buffer=u.read() printu.info() print"从%s读取了%d字节数据. "%(u.geturl(),len(buffer)) #通过URL打开本地页面 u=urllib.urlopen(localURL) buffer=u.read() printu.info() print"从%s读取了%d字节数据. "%(u.geturl(),len(buffer)) 上面代码的运行结果如下所示: Date:Fri,26Jun200910:22:11GMT Server:Apache/2.2.9(Debian)DAV/2SVN/1.5.1mod_ssl/2.2.9OpenSSL/0.9.8gmod_wsgi/2.3 |Python/2.5.2 Last-Modified:Thu,25Jun200909:44:54GMT ETag:"105800d-46e7-46d29136f7180" Accept-Ranges:bytes Content-Length:18151 Connection:close Content-Type:text/html 从http://www.python.org读取了18151字节数据. Content-Type:text/html Content-Length:865 Last-modified:Fri,26Jun200910:16:10GMT 从index.html读取了865字节数据. 三、小结 对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文中,我们介绍了一个可以帮助简化打开位于本地和Web上的HTML文档的Python模块。在下篇中,我们将论述如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图像和Cookie等。利用Python抓取和解析网页(二)对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文上篇中,我们介绍了一个可以帮助简化打开位于本地和Web上的HTML文档的Python模块。在本文中,我们将论述如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图像和Cookie等。同时还会介绍如何规范HTML文件的格式标签。 一、从HTML文档中提取链接 | Python语言还有一个非常有用的模块HTMLParser,该模块使我们能够根据HTML文档中的标签来简洁、高效地解析HTML文档。所以,在处理HTML文档的时候,HTMLParser是最常用的模块之一。 importHTMLParser importurllib classparseLinks(HTMLParser.HTMLParser): defhandle_starttag(self,tag,attrs): iftag=='a': forname,valueinattrs: ifname=='href': printvalue printself.get_starttag_text() lParser=parseLinks() lParser.feed(urllib.urlopen("http://www.python.org/index.html").read()) 处理HTML文档的时候,我们常常需要从其中提取出所有的链接。使用HTMLParser模块后,这项任务将变得易如反掌。首先,我们需要定义一个新的HTMLParser类,以覆盖handle_starttag()方法,我们将使用这个方法来显示所有标签的HRef属性值。 定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象。然后,就可以使用urllib.urlopen(url)打开HTML文档并读取该HTML文件的内容了。 为了解析HTML文件的内容并显示包含其中的链接,可以使用read()函数将数据传递给HTMLParser对象。HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析。需要注意,如果传给HTMLParser的feed()函数的数据不完整的话,那么不完整的标签会保存下来,并在下一次调用feed()函数时进行解析。当HTML文件很大,需要分段发送给解析器的时候,这个功能就会有用武之地了。下面是一个具体的例子 | importHTMLParser importurllib importsys #定义HTML解析器 classparseLinks(HTMLParser.HTMLParser): defhandle_starttag(self,tag,attrs): iftag=='a': forname,valueinattrs: ifname=='href': printvalue printself.get_starttag_text() #创建HTML解析器的实例 lParser=parseLinks() #打开HTML文件 lParser.feed(urllib.urlopen( "http://www.python.org/index.html").read()) lParser.close() 上述代码的运行结果太长,在此省略,您可以自己运行代码试试。二、从HTML文档中提取图像 处理HTML文档的时候,我们常常需要从其中提取出所有的图像。使用HTMLParser模块后,这项任务将变得易如反掌。首先,我们需要定义一个新的HTMLParser类,以覆盖handle_starttag()方法,该方法的作用是查找img标签,并保存src属性值所指的文件。 import |HTMLParser importurllib defgetImage(addr): u=urllib.urlopen(addr) data=u.read() classparseImages(HTMLParser.HTMLParser): defhandle_starttag(self,tag,attrs): iftag=='img': forname,valueinattrs: ifname=='src': getImage(urlString+"/"+value) u=urllib.urlopen(urlString) lParser.feed(u.read()) 定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象。然后,就可以使用urllib.urlopen(url)打开HTML文档并读取该HTML文件的内容了。 为了解析HTML文件的内容并显示包含其中的图像,可以使用feed(data)函数将数据发送至HTMLParser对象。HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析。下面是一个具体的示例: importHTMLParser importurllib importsys urlString="http://www.python.org" #把图像文件保存至硬盘 defgetImage(addr): u= |urllib.urlopen(addr) data=u.read() splitPath=addr.split('/') fName=splitPath.pop() print"Saving%s"%fName f=open(fName,'wb') f.write(data) f.close() #定义HTML解析器 classparseImages(HTMLParser.HTMLParser): defhandle_starttag(self,tag,attrs): iftag=='img': forname,valueinattrs: ifname=='src': getImage(urlString+"/"+value) #创建HTML解析器的实例 lParser=parseImages() #打开HTML文件 u=urllib.urlopen(urlString) print"OpeningURL ====================" printu.info() #把HTML文件传给解析器 | lParser.feed(u.read()) lParser.close() 上述代码的运行结果如下所示: OpeningURL ==================== Date:Fri,26Jun200910:54:49GMT Server:Apache/2.2.9(Debian)DAV/2SVN/1.5.1mod_ssl/2.2.9OpenSSL/0.9.8gmod_wsgi/2.3Python/2.5.2 Last-Modified:Thu,25Jun200909:44:54GMT ETag:"105800d-46e7-46d29136f7180" Accept-Ranges:bytes Content-Length:18151 Connection:close Content-Type:text/html Savingpython-logo.gif Savingtrans.gif Savingtrans.gif Savingafnic.fr.png三、从HTML文档中提取文本 处理HTML文档的时候,我们常常需要从其中提取出所有的文本。使用HTMLParser模块后,这项任务将变得非常简单了。首先,我们需要定义一个新的HTMLParser类,以覆盖handle_data()方法,该方法是用来解析并文本数据的。 importHTMLParser import |urllib classparseText(HTMLParser.HTMLParser): defhandle_data(self,data): ifdata!=' ': urlText.append(data) lParser=parseText() lParser.feed(urllib.urlopen( http://docs.python.org/lib/module-HTMLParser.html).read()) 定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象。然后,就可以使用urllib.urlopen(url)打开HTML文档并读取该HTML文件的内容了。 为了解析HTML文件的内容并显示包含其中的文本,我们可以使用feed(data)函数将数据传递给HTMLParser对象。HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析。要注意的是,如果传给HTMLParser的feed()函数的数据不完整的话,那么不完整的标签会保存下来,并在下一次调用feed()函数时进行解析。当HTML文件很大,需要分段发送给解析器的时候,这个功能就会有用武之地了。下面是一个具体的代码示例: importHTMLParser importurllib urlText=[] #定义HTML解析器 classparseText(HTMLParser.HTMLParser): defhandle_data(self,data): ifdata!=' ': urlText.append(data) #创建HTML解析器的实例 lParser= |parseText() #把HTML文件传给解析器 lParser.feed(urllib.urlopen( “http://docs.python.org/lib/module-HTMLParser.html” ).read()) lParser.close() foriteminurlText: printitem 上面代码的运行输出过长,在此略过四、从HTML文档中提取Cookies 很多时候,我们都需要处理Cookie,幸运的是Python语言的cookielib模块为我们提供了许多自动处理在HTML中的HTTPCookie的类。当处理要求为客户端设置Cookie的HTML文档的时候,这些类对我们非常有用。 importurllib2 importcookielib fromurllib2importurlopen,Request cJar=cookielib.LWPCookieJar() opener=urllib2.build_opener( urllib2.HTTPCookieProcessor(cJar)) urllib2.install_opener(opener) r=Request(testURL) h=urlopen(r) forind,cookieinenumerate(cJar): print"%d-%s"%(ind, |cookie) cJar.save(cookieFile) 为了从HTML文档提取cookies,首先得使用cookielib模块的LWPCookieJar()函数创建一个cookiejar的实例。LWPCookieJar()函数将返回一个对象,该对象可以从硬盘加载Cookie,同时还能向硬盘存放Cookie。 接下来,使用urllib2模块的build_opener([handler,...])函数创建一个opener对象,当HTML文件打开时该对象将处理cookies。函数build_opener可以接收零个或多个处理程序(这些程序将按照它们被指定的顺序连接在一起)作为参数并返回一个。 注意,如果想让urlopen()使用opener对象来打开HTML文件的话,可以调用install_opener(opener)函数,并将opener对象传给它。否则,请使用opener对象的open(url)函数来打开HTML文件。 一旦已经创建并安装了opener对象,就可以使用urllib2模块中的Request(url)函数来创建一个Request对象,然后就能使用urlopen(Request)函数来打开HTML文件了。 打开HTML页面后,该页面的所有Cookie将被存放到LWPCookieJar对象中,之后,您可以使用LWPCookieJar对象的save(filename)函数了。 importos importurllib2 importcookielib fromurllib2importurlopen,Request cookieFile="cookies.dat" testURL='http://maps.google.com/' #为cookiejar创建实例 cJar=cookielib.LWPCookieJar() #创建HTTPCookieProcessor的opener对象 opener=urllib2.build_opener( | urllib2.HTTPCookieProcessor(cJar)) #安装HTTPCookieProcessor的opener urllib2.install_opener(opener) #创建一个Request对象 r=Request(testURL) #打开HTML文件 h=urlopen(r) print"页面的头部 ======================" printh.info() print"页面的Cookies ======================" forind,cookieinenumerate(cJar): print"%d-%s"%(ind,cookie) #保存cookies cJar.save(cookieFile) 上述代码的运行结果如下所示: 页面的头部 ====================== Cache-Control:private Content-Type:text/html;charset=ISO-8859-1 Set-Cookie:PREF=ID=5d9692b55f029733:NW=1:TM=1246015608:LM=1246015608:S=frfx--b3xt73TaEA;expires=Sun,26-Jun-201111:26:48GMT;path=/;domain=.google.com Date:Fri,26Jun200911:26:48GMT Server: |mfe Expires:Fri,26Jun200911:26:48GMT Transfer-Encoding:chunked Connection:close 页面的Cookies ====================== 0-五、为HTML文档中的属性值添加引号 前面我们讨论了如果根据HTML解析器中的某种处理程序来解析HTML文件,可是有时候我们却需要使用所有的处理程序来处理HTML文档。值得庆幸的是,使用HTMLParser模块解析HTML文件的所有要素并不比处理链接或者图像难多少。 importHTMLParser importurllib classparseAttrs(HTMLParser.HTMLParser): defhandle_starttag(self,tag,attrs): ... attrParser=parseAttrs() attrParser.init_parser() attrParser.feed(urllib.urlopen("test2.html").read()) 这里,我们将讨论如何使用HTMLParser模块来解析HTML文件,从而为“裸奔”的属性值加上引号。首先,我们要定义一个新的HTMLParser类,以覆盖下面所有的处理程序来为属性值添加引号。 handle_starttag(tag, |attrs) handle_charref(name) handle_endtag(tag) handle_entityref(ref) handle_data(text) handle_comment(text) handle_pi(text) handle_decl(text) handle_startendtag(tag,attrs) 我们还需要在parser类中定义一个函数来初始化用于存储解析好的数据的变量,同时还要定义另外一个函数来返回解析好的数据。 定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象。使用我们创建的init函数初始化该解析器,这样,我们就可以使用urllib.urlopen(url)打开HTML文档并读取该HTML文件的内容了。 为了解析HTML文件的内容并给属性值添加引号,可以使用feed(data)函数将数据传递给HTMLParser对象。HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析。下面是一个具体的示例代码: importHTMLParser importurllib importsys #定义HTML解析器 classparseAttrs(HTMLParser.HTMLParser): definit_parser(self): self.pieces=[] defhandle_starttag(self,tag,attrs): fixedAttrs="" #forname,valueinattrs: forname,valuein |attrs: fixedAttrs+="%s="%s""%(name,value) self.pieces.append("<%s%s>"%(tag,fixedAttrs)) defhandle_charref(self,name): self.pieces.append("%s;"%(name)) defhandle_endtag(self,tag): self.pieces.append(""%(tag)) defhandle_entityref(self,ref): self.pieces.append("&%s"%(ref)) defhandle_data(self,text): self.pieces.append(text) defhandle_comment(self,text): self.pieces.append(""%(text)) defhandle_pi(self,text): self.pieces.append(""%(text)) defhandle_decl(self,text): self.pieces.append(""%(text)) defparsed(self): return"".join(self.pieces) #创建HTML解析器的实例 attrParser=parseAttrs() #初始化解析器数据 | attrParser.init_parser() #把HTML文件传给解析器 attrParser.feed(urllib.urlopen("test2.html").read()) #显示原来的文件内容 print"原来的文件 ========================" printopen("test2.html").read() #显示解析后的文件 print"解析后的文件 ========================" printattrParser.parsed() attrParser.close() 我们还需要建立一个测试文件,名为test2.html,该文件内容可以从上述代码的运行结果看到,具体如下所示:原来的文件========================Web页面Web页面清单
Python网站本地页面解析后的文件========================Web页面Web页面清单
Python网站本地页面 六、小结对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文将详细介绍了如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图像和Cookie等。同时,我们还给出了一个规范HTML文件的格式标签的例子,希望本文对您会有所帮助。Python读取网页并保存代码如下:importsysimporturllib2importosprint("Parametercount:",len(sys.argv))iflen(sys.argv)<3: print("Parameterrequired:") print("SavingHttpPageTool.exe[WebPageAddress][savingPath]") exit(0)name=sys.argv[2]ifos.path.exists(name): print("removefile:"+name) os.remove(name)print("getpage:"+sys.argv[1])req=urllib2.Request(sys.argv[1])res=urllib2.urlopen(req)##headers=str(res.info())##print(headers)html=res.read() |print("writefile:"+name)writeFile=file(name,'w')writeFile.write(html)writeFile.close()print("finished")python正则小试读取网页内容2个月前坛子里有道友问的shell问题,当时用python草草写下一个简单的脚本,今天无意中翻出贴出来已做备用#!/usr/bin/envpython#-*-coding:UTF-8-*-#Author:wanghaoyu-wanghaoyu1625@gmail.com#QQ:42030925#Lastmodified:2010-04-1914:04#Filename:web.py#Description:importos,urllib,urllib2importre,sysurl="http://jt.sz.bendibao.com/bus/linesearch.aspx?line=615&x=0&y=0"page=urllib.urlopen(url).read()pat=re.compile(r'