还剩114页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
python中如何提取网页正文啊谢谢importurllib.request url=http://google.cn/ response=urllib.request.urlopenurl page=response.read python提取网页中的文本
1.importossysdatetime
2.importhttpliburllibre
3.fromsgmllibimportSGMLParser
4.
5.importtypes
6.
7.classHtml2___SGMLParser:
8. defresetself:
9. self.text=
10. self.inbody=True
11. SGMLParser.resetself
12. defhandle_dataselftext:
13. ifself.inbody:
14. self.text+=text
15.
16. defstart_headselftext:
17. self.inbody=False
18. defend_headself:
19. self.inbody=True
20.
21.
22.if__name__==____in__:
23. parser=Html2___
24. parser.feedurllib.urlopenhttp://icode.csdn.net.read
25. parser.close
26. printparser.text.strip python下载网页importhttplib conn=httplib.HTTPConnection___.baidu.comhttp://___.baidu.com/conn.requestGET/index.htmlr1=conn.getresponseprintr
1.statusr
1.reasondata=r
1.readprintdataconn.close用python下载网页,超级简单!fromurllibimporturlopenwebdata=urlopen.readprintwebdata深入python里面有python 下载网页内容用python的pycurl模块实现
1.用python下载网页内容还是很不错的,之前是使用urllib模块实验的,但听说有pycurl这个模块,而且比urllib好,所以尝试下,废话不说,以下是代码
2.
3.
4.#!/usr/bin/envpython
5.#-*-coding:utf-8-*-
6.importStringIO
7.importpycurl
8.
9.defwritefilefstrxfilename: f=openxfilenamew f.writefstr f.close
10.
1.html=StringIO.StringIO
2.c=pycurl.Curl
3.myurl=http://___.pp__henshan.comhttp://___.pp__henshan.com/
4.
5.c.setoptpycurl.URLmyurl
6.
7.#写的回调
8.c.setoptpycurl.WRITEFUNCTIONhtml.write
9.
10.c.setoptpycurl.FOLLOWLOCATION
111.
12.#最大重定向次数可以预防重定向陷阱
13.c.setoptpycurl.__XREDIRS
514.
15.#连接超时设置
16.c.setoptpycurl.CONNECTTIMEOUT
6017.c.setoptpycurl.TIMEOUT
30018.
19.#模拟浏览器
20.c.setoptpycurl.USERAGENTMozilla/
4.0compatible;MSIE
6.0;WindowsNT
5.1;SV1;.NETCLR
1.
1.
432221.
22.
23.
24.#访问阻塞到访问结束
25.c.perform
26.
27.#打印出200HTTP状态码,可以不需要
28.printc.getinfopycurl.HTTP_CODE
29.
30.#输出网页的内容
31.printhtml.getvalue
32.#保存成down.___文件
33.writefilehtml.getvaluedown.___pythonhttp://___.lpfrx.com/archives/category/python/的pycurl模块的__可以到http://pycurl.sour__forge.net/download/这里去找.不同系统使用不同版本,自己看看总结下,Python下载网页的几种方法1fd=urllib
2.urlopenurl_linkdata=fd.read这是最简洁的一种,当然也是Get的方法2通过GET的方法defGetHtmlSour__url:try:htmSour__=req=urllib
2.Requesturlfd=urllib
2.urlopenreqwhile1:data=fd.read1024ifnotlendata:breakhtmSour__+=datafd.closedelfddelreqhtmSour__=htmSour__.decodecp936htmSour__=for__tStrhtmSour__returnhtmSour__ex__ptsocket.errorerr:str_err=%s%errreturn3通过GET的方法defGetHtmlSour___Gethtmurl:htmSour__=try:urlx=httplib.urlsplithtmurlconn=httplib.HTTPConnectionurlx.netlocconn.connectconn.putrequestGEThtmurlNoneconn.putheaderContent-Length0conn.putheaderConnectioncloseconn.endheadersres=conn.getresponsehtmSour__=res.readex__ptEx__ptionerr:trackback.print_execconn.closereturnhtmSour__通过POST的方法defGetHtmlSour___PostgetString:htmSour__=try:url=httplib.urlsplithttp://app.sipo.gov.cn:8080conn=httplib.HTTPConnectionurl.netlocconn.connectconn.putrequestPOST/sipo/zljs/hyjs-jieguo.jspconn.putheaderContent-LengthlengetStringconn.putheaderContent-Typeapplication/x-___-form-urlencodedconn.putheaderConnectionKeep-Aliveconn.endheadersconn.sendgetStringf=conn.getresponseifnotf:raisesocket.errortimedouthtmSour__=f.readf.closeconn.closereturnhtmSour__ex__ptEx__ptionerr:trackback.print_execconn.closereturnhtmSour__本文来自CSDN__,转载请标明出处http://blog.csdn.net/sding/archive/2010/04/29/
5538065.aspxhttp://blog.csdn.net/sding/archive/2010/04/29/
5538065.aspxDjango+python+BeautifulSoup组合的垂直搜索爬虫使用python+BeautifulSoup完成爬虫抓取特定数据的工作,并使用Django搭建一个管理平台,用来协调抓取工作因为自己很喜欢Djangoadmin后台,所以这次用这个后台对抓取到的链接进行管理,使我的爬虫可以应对各种后期的需求比如分时段抓取,定期的对已经抓取的地址重新抓取数据库是用python自带的sqlite3,所以很方便这几天正好在做一个电影推荐系统,需要些电影数据本文的例子是对豆瓣电影抓取特定的数据第一步建立Django模型模仿nutch的爬虫思路,这里简化了每次抓取任务开始先从数据库里找到未保存的is_s__e=False的链接,放到抓取链表里你也可以根据自己的需求去过滤链接python代码viewplaincopytoclipboardprint
01.classCrawl_URLmodels.Model:
02.url=models.URLField抓取地址__x_length=100unique=True
03.weight=models.__allIntegerField抓取深度default=0#抓取深度起始
104.is_s__e=models.BooleanField是否已保存default=False#
05.date=models.DateTimeField保存时间auto_now_add=Trueblank=Truenull=True
06.def__unicode__self:
07.returnself.urlclassCrawl_URLmodels.Model:url=models.URLField抓取地址__x_length=100unique=Trueweight=models.__allIntegerField抓取深度default=0#抓取深度起始1is_s__e=models.BooleanField是否已保存default=False#date=models.DateTimeField保存时间auto_now_add=Trueblank=Truenull=Truedef__unicode__self:returnself.url然后生成相应的表还需要一个admin管理后台viewplaincopytoclipboardprint
01.classCrawl_URLAdminadmin.ModelAdmin:
02.list_display=urlweightis_s__edate
03.ordering=-id
04.list_filter=is_s__eweightdate
05.fields=urlweightis_s__e
06.admin.site.registerCrawl_URLCrawl_URLAdminclassCrawl_URLAdminadmin.ModelAdmin:list_display=urlweightis_s__edateordering=-idlist_filter=is_s__eweightdatefields=urlweightis_s__eadmin.site.registerCrawl_URLCrawl_URLAdmin第二步,编写爬虫代码爬虫是单线程,并且每次抓取后都有相应的暂定,豆瓣网会禁止一定强度抓取的爬虫爬虫根据深度来控制,每次都是先生成链接,然后抓取,并解析出更多的链接,最后将抓取过的链接is_s__e=true,并把新链接存入数据库中每次一个深度抓取完后都需要花比较长的时候把链接导入数据库因为需要判断链接是否已存入数据库这个只对满足正则表达式http://movie.douban.com/su__ect/\d+/的地址进行数据解析并且直接忽略掉不是电影模块的链接第一次抓取需要在后台加个链接,比如http://movie.douban.com/chart,这是个排行榜的页面,电影比较受欢迎python代码#这段代码不能格式化发#coding=UTF-8importurllib2fromBeautifulSoupimport*fromurlparseimporturljoinfrompysqlite2importdbapi2assqlitefrommovie.modelsimport*fromdjango.contrib.auth.modelsimportUserfromtimeimportsleepi__ge_path=C:/Users/soul/djcodetest/picture/user=User.o__ects.getid=1defcrawldepth=10:foriinrange1depth:print开始抓取for%d....%ipages=Crawl_URL.o__ects.filteris_s__e=Falsenewurls={}forcrawl_pageinpages:page=crawl_page.urltry:c=urllib
2.urlopenpageex__pt:continuetry:#解析元数据和urlsoup=BeautifulSoupc.read#解析电影页面ifre.searchr^http://movie.douban.com/su__ect/\d+/$page:read_htmlsoup#解析出有效的链接,放入newurlslinks=soupaforlinkinlinks:ifhrefindictlink.attrs:url=urljoinpagelink[href]ifurl.find!=-1:continueiflenurl60:continueurl=url.split#
[0]#removielocationportionifre.searchr^http://movie.douban.comurl:newurls[url]=crawl_page.weight+1#连接有效存入字典中try:printaddurl:ex__pt:passex__ptEx__ption.args:try:printCouldnotparse:%s%argsex__pt:pass#newurls存入数据库is_s__e=Falseweight=icrawl_page.is_s__e=Truecrawl_page.s__e#休眠
2.5秒sleep
2.5s__e_urlnewurls#保存url,放到数据库里defs__e_urlnewurls:forurlweightinnewurls.items:url=Crawl_URLurl=urlweight=weighttry:url.s__eex__pt:try:printurl重复:ex__pt:passreturnTrue第三步,用BeautifulSoup解析页面抽取出电影标题,__,剧情介绍,主演,标签,地区关于BeautifulSoup的使用可以看这里BeautifulSoup技术文档viewplaincopytoclipboardprint
01.#抓取数据
02.defread_htmlsoup:
03.#解析出标题
04.html_title=soup.html.head.title.string
05.title=html_title[:lenhtml_title-5]
06.#解析出电影介绍
07.try:
08.intro=soup.findspanattrs={class:allhidden}.text
09.ex__pt:
10.try:
11.node=soup.finddivattrs={class:blank20}.previousSibling
12.intro=node.contents
[0]+node.contents
[2]
13.ex__pt:
14.try:
15.contents=soup.finddivattrs={class:blank20}.previousSibling.previousSibling.text
16.intro=contents[:lencontents-22]
17.ex__pt:
18.intro=u暂无
19.
20.#取得__
21.html_i__ge=soupahref=re.compiledouban.com/lpic
[0][href]
22.data=urllib
2.urlopenhtml_i__ge.read
23.i__ge=201003/+html_i__ge[html_i__ge.rfind/+1:]
24.f=filei__ge_path+i__gewb
25.f.writedata
26.f.close
27.
28.
29.#解析出地区
30.try:
31.soup_obmo=soup.finddivattrs={class:obmo}.findAllspan
32.html_area=soup_obmo
[0].nextSibling.split/
33.area=html_area
[0].lstrip
34.ex__pt:
35.area=
36.
37.#time=soup_obmo
[1].nextSibling.split
[1]
38.#time=time.strptimehtml_time%Y-%m-%d
39.
40.#生成电影对象
41.new_movie=Movietitle=titleintro=introarea=areaversion=暂无upload_user=useri__ge=i__ge
42.new_movie.s__e
43.try:
44.actors=soup.finddivattrs={id:info}.findAllspan
[5].nextSibling.nextSibling.string.split
[0]
45.actors_list=Actor.o__ects.filtername=actors
46.iflenactors_list==1:
47.actor=actors_list
[0]
48.new_movie.actors.addactor
49.else:
50.actor=Actorname=actors
51.actor.s__e
52.new_movie.actors.addactor
53.ex__pt:
54.pass
55.
56.#tag
57.tags=soup.finddivattrs={class:blank20}.findAlla
58.fortag_htmlintags:
59.tag_str=tag_html.string
60.iflentag_str4:
61.continue
62.tag_list=Tag.o__ects.filtername=tag_str
63.iflentag_list==1:
64.tag=tag_list
[0]
65.
66.new_movie.tags.addtag
67.else:
68.tag=Tagname=tag_str
69.tag.s__e
70.new_movie.tags.addtag
71.#try:
72.
73.#ex__ptEx__ption.args:
74.#printCouldnotdownload:%s%args
75.printrdownloadsuc__ss
76.#抓取数据defread_htmlsoup:#解析出标题html_title=soup.html.head.title.stringtitle=html_title[:lenhtml_title-5]#解析出电影介绍try:intro=soup.findspanattrs={class:allhidden}.textex__pt:try:node=soup.finddivattrs={class:blank20}.previousSiblingintro=node.contents
[0]+node.contents
[2]ex__pt:try:contents=soup.finddivattrs={class:blank20}.previousSibling.previousSibling.textintro=contents[:lencontents-22]ex__pt:intro=u暂无#取得__html_i__ge=soupahref=re.compiledouban.com/lpic
[0][href]data=urllib
2.urlopenhtml_i__ge.readi__ge=201003/+html_i__ge[html_i__ge.rfind/+1:]f=filei__ge_path+i__gewbf.writedataf.close#解析出地区try:soup_obmo=soup.finddivattrs={class:obmo}.findAllspanhtml_area=soup_obmo
[0].nextSibling.split/area=html_area
[0].lstripex__pt:area=#time=soup_obmo
[1].nextSibling.split
[1]#time=time.strptimehtml_time%Y-%m-%d#生成电影对象new_movie=Movietitle=titleintro=introarea=areaversion=暂无upload_user=useri__ge=i__genew_movie.s__etry:actors=soup.finddivattrs={id:info}.findAllspan
[5].nextSibling.nextSibling.string.split
[0]actors_list=Actor.o__ects.filtername=actorsiflenactors_list==1:actor=actors_list
[0]new_movie.actors.addactorelse:actor=Actorname=actorsactor.s__enew_movie.actors.addactorex__pt:pass#tagtags=soup.finddivattrs={class:blank20}.findAllafortag_htmlintags:tag_str=tag_html.stringiflentag_str4:continuetag_list=Tag.o__ects.filtername=tag_striflentag_list==1:tag=tag_list
[0]new_movie.tags.addtagelse:tag=Tagname=tag_strtag.s__enew_movie.tags.addtag#try:#ex__ptEx__ption.args:#printCouldnotdownload:%s%argsprintrdownloadsuc__ss豆瓣的电影页面并不是很对称,所以有时候抓取的结果可能会有点出入本文来自CSDN__,转载请标明出处http://blog.csdn.net/J__a2King/archive/2010/03/15/537__
51.aspxhttp://blog.csdn.net/J__a2King/archive/2010/03/15/537__
51.aspx爬Google的查询页最近没有没有GoogleAPIkey了,因此只能自己将查询对应的URL准备好,然后通过脚本将该链接对应的网页爬下来我们假定,我们要爬这样一个页面http://___.google.com/searchq=IBM我们可以直接在浏览器输入上面的URL,可以看到,是Google对应IBM这个查询的返回页我们现在的目的是通过python程序把这个返回页download下来,存在本地,为后面的工作准备数据一下就是我的代码importurllib2urlparsegzipfromStringIOimportStringIOUSER_AGENT=Mozilla/
4.0compatible;MSIE
6.0;WindowsNT
5.1;SV1;.NETCLR
2.
0.50727;CIBA;InfoPath.2;360SEclass__artRedirectHandlerurllib
2.HTTPRedirectHandler:defhttp_error_301selfreqfpcodemsgheaders:result=urllib
2.HTTPRedirectHandler.http_error_301selfreqfpcodemsgheadersresult.status=codereturnresultdefhttp_error_302selfreqfpcodemsgheaders:result=urllib
2.HTTPRedirectHandler.http_error_302selfreqfpcodemsgheadersresult.status=codereturnresultclassDefaultErrorHandlerurllib
2.HTTPDefaultErrorHandler:defhttp_error_defaultselfreqfpcodemsgheaders:result=urllib
2.HTTPErrorreq.get_full_urlcodemsgheadersfpresult.status=codereturnresultdefopenAnythingsour__etag=Nonelastmodified=Noneagent=USER_AGENT:ifhasattrsour__read:returnsour__ifsour__==-:returnsys.stdinifurlparse.urlparsesour__
[0]==http:request=urllib
2.Requestsour__request.add_headerUSER-AGENTagentrequest.add_headerCookiePREF=ID=5e8d1d15fe369be8:U=95d9eb627acc6c79:LD=en:NW=1:CR=2:TM=1270616770:LM=1270616914:S=FAiBW5rEW2azKJXk;NID=33=rXimIAwO_TvEyFlE4lBRkxr1x3TTVh36__im2Cn0gk__3SAbtn79qkAtgIli18d382TnTCFMOXjzgqxQF__WLHEbnyf-MtVwfa4-pYmX__kUMPYqDi61ZmmqyPcBbwzPifetag:request.add_headerIf-None-__tchetagiflastmodified:request.add_headerIf-Modified-Sin__lastmodified#request.add_headerAc__pt-encodinggzip#request.add_headerConnectionKeep-Aliveopener=urllib
2.build_opener__artRedirectHandlerDefaultErrorHandlerreturnopener.openrequesttry:returnopensour__ex__ptIOErrorOSError:passreturnStringIOstrsour__sdeffetchsour__etag=Nonelast_modified=Noneagent=USER_AGENT:result={}f=openAnythingsour__etaglast_modifiedagentresult[data]=f.readifhasattrfheaders:result[etag]=f.headers.getETagresult[lastmodified]=f.headers.getLast-Modifiediff.headers.getcontent-encoding==gzip:result[date]=gzip.GzipFilefileo__=StringIOresult[data].readifhasattrfurl:result[url]=f.urlresult[status]=200ifhasattrfstatus:result[status]=f.statusf.closereturnresultif__name__==____in__:result=fetchhttp://___.google.com/searchq=IBMprintresult[data]printresult[url]printresult[status]要注意一下几点
2、如果不想被重定向到Google中国,哦,NO,是Google__,那么要记得在自己的cookie中找到对应的cookie加上去
3、这种东西要多抓包,一个字节一个字节的比对,要相信,浏览器也是程序写的,浏览器能做到的程序也能做到本文来自CSDN__,转载请标明出处http://blog.csdn.net/caiyi____bupt/archive/2010/04/08/
5459497.aspxhttp://blog.csdn.net/caiyi____bupt/archive/2010/04/08/
5459497.aspx下载糗事百科的内容_python版
1.#coding:utf-
82.
3.importurllib.request
4.importxml.dom.minidom
5.importsqlite
36.importthreading
7.importtime
8.
9.classloggero__ect:
10.deflogself*msg:
11.foriinmsg:
12.printi
13.
14.Log=logger
15.Log.log测试下
16.
17.classdownloadero__ect:
18.
19.def__init__selfurl:
20.self.url=url
21.
22.defdownloadself:
23.Log.log开始下载self.url
24.try:
25.content=urllib.request.urlopenself.url.read
26.#req=urllib.request.Requesturl
27.#response=urllib.request.urlopenreq
28.#content=response.read
29.Log.log下载完毕
30.returncontent
31.ex__pt:
32.Log.log下载出错
33.returnNone
34.
35.
36.classparsero__ect:
37.
38.def__init__selfcontent:
39.#获得根节点
40.self.html=xml.dom.minidom.parseStringcontent
41.
42.defparseself:
43.Log.log开始提取数据
44.contents={content:url:[]}
45.#获得div节点
46.divs=self.html.getElement__yTagNamediv
47.#获得content节点
48.fordivindivs:
49.ifdiv.hasAttributeclassand\
50.div.getAttributeclass==content:
51.#获得糗事百科的内容
52.textNode=div.childNodes
[0]
53.qContent=textNode.data
54.#数据填充
55.contents[content]=qContent
56.
57.#获得上一糗事、下一糗事节点
58.spans=self.html.getElement__yTagNamespan
59.forspaninspans:
60.pspan=span.parentNode
61.ifpspan.tagName==a:
62.#pspan为对应的链接此时需要将对应的地址加入数据库
63.url=pspan.getAttributehref
64.qid=url[10:][:-4]
65.#数据填充
66.contents[url].appendqid
67.Log.log提取数据完毕
68.returncontents
69.
70.defdownloadPageqiddb:
71.url=http://___.qiushibaike.com/articles/+strqid+.htm
72.content=downloaderurl.download
73.ifcontent:
74.contents=parsercontent.parse
75.ifcontents[content]:
76.db.updateContentqidcontents[content]
77.foriincontents[url]:
78.db.addQIDi
79.iflencontents[url]==2:
80.db.updateStatusqid
281.
82.#下载池,表示同时允许下载的链接个数
83.classdownloaderPoolo__ect:
84.def__init__self__xLength=15:
85.self.downloaders=[None]*__xLength
86.self.downloadList=[]
87.self.db=None
88.__.defsetDownloadListselfdownloadList:
90.self.downloadList=listsetself.downloadList+downloadList
91.
92.defsetdbselfdb:
93.self.db=db
94.
95.defdaemonself:
96.#每隔一秒查询线程的状态,为非活动线程则设置为None
97.Log.log设置守护进程
98.forindexdownloaderinenumerateself.downloaders:
99.ifdownloader:
100.ifnotdownloader.isAlive:
101.Log.log将下载器置空index
102.self.downloaders[index]=None
103.
104.#检查线程池状态
105.forindexdownloaderinenumerateself.downloaders:
106.ifnotdownloader:
107.qid=self.getQID
108.ifqid:
109.#创建线程
110.t=threading.Threadtarget=downloadPageargs=qidself.db
111.self.downloaders[index]=t
112.t.start
113.t.join___.Log.log设置下载器index
115.#间隔一秒执行一次
116.time.sleep
1117.
118.defgetQIDself:
119.try:
120.tmp=self.downloadList
[0]
121.delself.downloadList
[0]
122.returntmp
123.ex__pt:
124.returnNone
125.
126.defbeginDownloadself:
127.#创建守护线程
128.daemon=threading.Threadtarget=self.daemon
129.daemon.setDaemonTrue
130.daemon.start
131.daemon.join
132.
133.defgetDownloaderself:
134.forindexdownloaderinenumerateself.downloaders:
135.ifnotdownloader:
136.returnindex
137.returnNone
138.
139.
140.ADD_Q_ID=insertintoqiushibaikeidsuc__ssvalues
141.UPDATE_Q_CONTENT=updateqiushibaikesetcontent=whereid=
142.UPDATE_Q_STATUS=updateqiushibaikesetsuc__ss=whereid=
143.Q_LIST=selectidfromqiushibaikewheresuc__ss=
144.Q_LIST_BY_ID=selectcount*fromqiushibaikewhereid=
145.classdbConnecto__ect:
146.
147.createtableqiushibaike
148.idInteger
149.contentVarchar
150.suc__ssInterger
151.
152.#id表示糗事的ID
153.#content表示糗事的内容
154.#suc__ss表示是否下载成功,当该糗事内容下载完成,且获得上一页、下一页ID时表示下载完成
155.1表示未完成
156.2表示完成
157.
158.def__init__selfdbpath=db.sqlite:
159.self.dbpath=dbpath
160.
161.defaddQIDselfqid:
162.Log.log插入糗事百科qid
163.#获得连接
164.cn=sqlite
3.connectself.dbpath
165.c=cn.cursor
166.
167.try:
168.#添加内容并提交
169.c.executeADD_Q_IDqid
1170.cn.commit
171.ex__pt:
172.Log.log添加ID出错qid
173.
174.#关闭连接
175.c.close
176.
177.cn.close
178.Log.log插入成功
179.
180.defupdateContentselfqidcontent:
181.Log.log更新糗事百科qidcontent
182.#获得连接
183.cn=sqlite
3.connectself.dbpath
184.c=cn.cursor
185.#添加内容并提交
186.c.executeUPDATE_Q_CONTENTcontentqid
187.cn.commit
188.#关闭连接1__.c.close
190.cn.close
191.Log.log更新成功
192.
193.defupdateStatusselfqidflag:
194.Log.log更新状态qidflag
195.#获得连接
196.cn=sqlite
3.connectself.dbpath
197.c=cn.cursor
198.#添加内容并提交
199.c.executeUPDATE_Q_STATUSflagqid
200.cn.commit
201.#关闭连接
202.c.close
203.cn.close
204.Log.log更新状态成功
205.
206.defgetListselfunDonloaded=1:
207.Log.log获得列表
208.l=[]
209.#获得连接
210.cn=sqlite
3.connectself.dbpath
211.c=cn.cursor
212.#获得数据
213.c.executeQ_LISTunDonloaded
214.rows=c.fetchall
215.
216.foriinrows:
217.l.appendi
[0]
218.#关闭连接
219.c.close
220.cn.close
221.
222.Log.log获得列表成功
223.returnl
224.
225.classsingleDownloadero__ect:
226.def__init__self:
227.self.downloadList=[]
228.
229.defsetdbselfdb:
230.self.db=db
231.
232.defsetDownloadListselfdownloadList:
233.self.downloadList=listsetself.downloadList+downloadList
234.
235.defbeginDownloadself:
236.foriinself.downloadList:
237.downloadPageiself.db
238.
239.def__in:
240.db=dbConnectdb.sqlite
241.#dp=downloaderPool
242.#dp.setdbdb
243.sp=singleDownloader
244.sp.setdbdb
245.
246.dp=sp
247.
248.unDownloadedList=db.getList
249.#当还有未下载的糗事时就要继续下载
250.whilelenunDownloadedList:
251.#使用该列表填充下载池
252.dp.setDownloadListunDownloadedList
253.
254.dp.beginDownload
255.
256.time.sleep
1257.#重置参数
258.unDownloadedList=db.getList
259.
260.if__name__==____in__:
261.__in代码是没问题的,可以正常运行,但是希望做到以下2方面
1、多线程下载
2、代码分离度更高,跟面向对象各位看家有什么好想法,贴出来看看本文来自CSDN__,转载请标明出处http://blog.csdn.net/jj_liuxin/archive/2008/12/08/
3466701.aspxhttp://blog.csdn.net/jj_liuxin/archive/2008/12/08/
3466701.aspx用python把xml和xsl转换为html前些天用python处理xml的转换的一个小程序,用来把xmlxsl转换成html用的libxml2,所以还要先__了libxml2模块才能使用#-*-coding:mbcs-*-#!/usr/bin/pythonimportlibxml2libxsltclasscompoundXML:def__init__self:self._result=Noneself._xsl=Noneself._xml=Nonedefdoselfxml_file_namexsl_file_name:self._xml=libxml
2.parseFilexml_file_nameifself._xml==None:return0styledoc=libxml
2.parseFilexsl_file_nameifstyledoc==None:return0self._xsl=libxslt.parseStylesheetDocstyledocifself._xsl==None:return0self._result=self._xsl.applyStylesheetself._xmlNonedefget_xml_docself:returnself._resultdefget_translatedself:returnself._result.serializeUTF-8defs__e_translatedselffile_name:self._xsl.s__eResultToFilenamefile_nameself._result0defreleaseself:thisfunctionmustbecalledintheend.self._xsl.freeStylesheetself._xml.freeDocself._result.freeDocself._xsl=Noneself._xml=Noneself._result=Noneif__name__==____in__:test=compoundXMLtest.dotest/testxmlutil.xmltest/testxmlutil.xslprinttest.get_translatedtest.s__e_translatedtest/testxmlutil.htmtest.release本文来自CSDN__,转载请标明出处http://blog.csdn.net/zhaoweikid/archive/2004/08/14/
74837.aspxhttp://blog.csdn.net/zhaoweikid/archive/2004/08/14/
74837.aspx用python下载网页,超级简单!fromurllibimporturlopenwebdata=urlopenhttp://___.pythonid.com.readprintwebdata够简单吧,哈哈我来补充点你那只能说是查看网页怎能说是下载呢总得如存吧importurllibwebfile=urllib.urlopenhttp://___.insenz.com.readfp=filerhf.htmla+#fp=openrhf.htmla+fp.writewebfilefp.close哦,___试___.insenz.comhttp://___.insenz.com/,我试的http://___.pythonid.comhttp://___.pythonid.com/最简单的下载网页的方法只有2句fromurllibimporturlretrieveurlretrievehttp://___.python.orgf:\\python_webpage.html用python下载网页,超级简单!查看fromurllibimporturlopenwebdata=urlopenhttp://___.pythonid.com.readprintwebdata---------------下载并保存importurllibwebfile=urllib.urlopenhttp://___.insenz.com.readfp=filerhf.htmla+#fp=openrhf.htmla+fp.writewebfilefp.close------------------下载南方周末最新网页并保存成一个___文件列表里有个牛人做的啄木鸟社区收录了.地址http://wiki.woodpecker.org.cn/moin/MicroProj/2007-07-06http://wiki.woodpecker.org.cn/moin/MicroProj/2007-07-06#downhtmlfromzmands__ehtmlto___# -*-coding:utf-8-*-importhtmllibfor__tterurllibrewebsite=http://___.nanfangdaily.com.cn/zm/f=urllib.urlopenwebsitehtml=f.read.loweri=html.findurl=j=html.find/i+4date=html[i+4:j]website+=datef=urllib.urlopenwebsitep=htmllib.HTMLParserfor__tter.NullFor__tterp.feedf.readp.closeseen=setforurlinp.anchorlist:ifurl[-3::]==asp: ifurlinseen:continue seen.addurlurls=listseenk=lenurlsdoc=openu南方周末.encodegb18030+date+.___aforlurlinenumerateurls:f=urllib.urlopenwebsite+url[1:]html=f.readi=html.find#ff0000i=html.findi+7j=html.findi+1doc.writehtml[i+1:j]i=html.findcontent01j+1i=html.findi+9j=html.find/fonti+1content=html[i+1:j]reo__=re.compiler/[a-z][a-z0-9]*[^]*re.IGNORECASEdoc.writereo__.sub\ncontent+\n------------\nprintl+1--kdoc.closeprintu下载结束把百度空间的文章下载为html/*__:youstarhttp://___.youstar.org.ruhttp://___.youstar.org.ru/转载注明原创*/0x1 本文借鉴网上的代码加以修改实现了一个可以把百度空间的文章下载为html的功能,相对而言还有很多功能需要添加编程使用的语言是python,越来越喜欢这脚本了,感觉在处理很多事情上很方便,其中调用一些lib和函数,看代码的时候也学到了一些函数的使用0x2#!/usr/bin/envpython#coding=utf-8importurllib2importreimportsysimportospattern=reg_tail=username=defdownURLurlfilename: printDownload%ss__eas%s%urlfilename try: fp=urllib
2.urlopenurl ex__pt: printdownloadex__ption return0 paths=os.get__d+username+/+filename op=openpathswb while1: s=fp.read ifnots: break op.writes fp.close op.close return1defgetURLurl: printParsing%s%url try: fp=urllib
2.urlopenurl contents=fp.readlines ex__pt: printex__ption return[] item_list=[] forsincontents: urls=pattern.findalls ifurls: item_list.extendurls fp.close returnitem_listdefCreateDirectory: ifnotos.path.existsos.get__d+username: os.mkdiros.get__d+username printstep2:CreateDirectorySuc__ss! else: printstep2:Directoryhasexisted!defreptilebase_url: Downloadallarticlesfrombase_url. Arguments: -`base_url`:Urlofwebsite. page_list=[] base_page=base_url.rstrip/+/blog/index/ sign_tail=u尾页 tail= total_page=10 globalusername printstep3:Numberofindex try: fp=urllib
2.urlopenbase_page+0 ex__pt: print%s:Notsuchurl%page printsys.exc_info else: forsinfp.readlines: ifsign_tailins.decodegbk: tail=s.decodegbk break fp.close iftail: pos=tail.rfindu尾页 total_page=inttail[:pos-3].split/[-1] output_list=[] foridxinrangetotal_page+1: item_page=%s%d%base_pageidx item_list=getURLitem_page ifitem_list: output_list.extenditem_list printstep4:Downpages! item_list=listsetoutput_list foriteminitem_list: down_url=item.repla__/%s%username http://hi.baidu.com/%s%usernamehttp://hi.baidu.com/%25s local_file=down_url.split/[-1] ret=downURLdown_urllocal_file printstep5:Total:%darticles.%lenitem_list printCongratulations passif__name__==____in__: iflensys.argv!=2: printUsage:%surlofbaiduspa__%sys.argv
[0] printSuchas:%shttp://hi.baidu.com/Usernamehttp://hi.baidu.com/Username sys.exit1 base_url=sys.argv
[1] ifnotbase_url.startswithhttp://hi.baidu.com/http://hi.baidu.com/: printWrongTypeofURLItworksonBaiduSpa__only. sys.exit1username=base_url.rstrip/.split/[-1] printstep1:+username CreateDirectory reg_tail=re.compileu%s.*尾页%username pattern=re.compile/%s/blog/item/.*\.html%username reptilebase_url0x3 实现界面0x4 link: http://hi.baidu.com/yangyin__hao/blog/item/25d74f1ed9ec11f91ad5767d.htmlhttp://hi.baidu.com/yangyin__hao/blog/item/25d74f1ed9ec11f91ad5767d.html http://zh-cn.w3support.net/index.phpdb=soid=273192http://zh-cn.w3support.net/index.phpdb=soid=273192用Python进行网页分析实现批量下载(finalversion)转自:http://___.builder.com.cn/2008/0517/
867087.shtmlhttp://___.builder.com.cn/2008/0517/
867087.shtmlstart.bat //__kethedirforfilesandruntheproject mkdirfiles pythonCustomParser.pyCustomParser.pyfromsgmllibimportSGMLParserfromstringimportfindrepla__rjustfromthreadingimportThreadimporturllib__author__=ChenPengpeng.ch@hot__il.com__ilto:peng.ch@hot__il.com__version__=$Revision:
1.0$__date__=$Date:2006/03/03$__copyright__=Copyrightc2006ChenPeng__li__nse__=Python__all__=[Gif_163_Parser]classPDownloadThreadThread: Downloadthefilesinthedictands__ethemtolocalfileswiththegivenname def__init__selfDictListi: Thread.__init__self self.DictList=DictList self.pageno=stri; defrunself: forkinself.DictList.keys: try: printDownload+self.DictList[k]+...... uFile=urllib.urlretrieveself.DictList[k].files+k+.+self.DictList[k].split.[self.DictList[k].split..__len__-1] ex__pt: logfile=openerror.loga logfile.writeself.pageno++self.DictList[k]+ +k+n logfile.close printS__etofile+k classGif_163_ParserSGMLParser: 任务:下载163彩图 原理:http://mms.
163.com/new_web/cm_lv2_pic.jspcatID=ord=dDatepage=2type=1key= 从1到415页(共6637)分析得到如下路径“/fgwx/hhsj/1_060302175613_186/128x
128.gif” eg:scriptshowPic229301/fgwx/hhsj/1_060302175613_186/128x
128.gif1编号22930n名字:因为有你n人气:100;/script 下载路径:http://mmsimg.
163.com/new_web/loaditem.jsp/type=1/path=/fgwx/llfj/1_060302175612_995/176x
176.gif defresetself: SGMLParser.resetself self.headURL=http://mmsimg.
163.com/new_web/loaditem.jsp/type=1/path= self.SubURL=[] self.Links={} defstart_scriptselfattrs: #self.SubURL.extend[%s=%s%keyvalueforkeyvalueinattrs] pass defend_scriptself: pass defhandle_dataselftext: iffindtextshowPic!=-1: self.Links[repla__text.splitn
[1]xc3xfbxd7xd6:]=self.headURL+repla__text.split
[2]; defExecuteself: foriinrange1415: self.Links.clear; try: usock=urllib.urlopenhttp://mms.
163.com/new_web/cm_lv2_pic.jspcatID=ord=dDatepage=+stri+type=1key= self.feedusock.read usock.close TestThread=PDownloadThreadself.Linksi TestThread.start self.close ex__ptIOError: pass #print[%s=%sn%kself.Links[k]forkinself.Links.keys] #printself.Linksif__name__==____in__: #Gif_163_Parser.Execute; testtask=Gif_163_Parser testtask.Execute python下载天涯__http://octoberken.blogbus.com/logs/
46055962.htmlhttp://octoberken.blogbus.com/logs/
46055962.html高喊学python好多天就是没作出过什么东西前几天看见同事用j__a写了个下载天涯__的程序,于是也用python写了一个练练手 #-*-coding:gbk-*-Createdon2009-9-7@author:Kenimport urllibimporturllib2importrandomimportosfromsgmllibimportSGMLParserclassURLListerSGMLParser:获取html中的__地址\url地址,装入list中defresetself:SGMLParser.resetselfself.img=[]self.urls=[]defstart_imgselfattrs:img=[vforkvinattrsifk==src]ifimg:self.img.extendimgdefstart_aselfattrs:href=[vforkvinattrsifk==href]ifhref:self.urls.extendhrefdefget_documurl:url=url+//sock=urllib.urlopenurlfile=sock.readsock.closereturnfiledefis_imgurl:globalimglenthrequest=urllib
2.Requesturlopener=urllib
2.build_openertry:con=opener.openrequestType=con.headers.dict[content-type][:5]#判断链接返回的content-type是不是__Length=intcon.headers.dict[content-length]#判断__大小ifLengthimglenth:returnTypeelse:return0ex__pt:print该__无法在服务器找到或者__地址无法识别!printurldefget_file_nameospathimgname:name=P+strrandom.randint_____00099999999filepath=%s%s.%s%ospathnameimgname.split.[-1]returnfilepath defget_imgrq:parser=URLLister; doc=get_documrq; parser.feeddoc; img=parser.imgparser.closeforiinrange0lenimg:ifimg[i][0:4]!=http:#处理绝对路径img[i]=rq+img[i]returnimgdefget_urlrq:parser=URLLister; doc=get_documrq; parser.feeddoc; urls=parser.urlsparser.closeforiinrange0lenurls:ifurls[i][0:4]!=http:#处理绝对路径urls[i]=rq+urls[i]returnurlsdefdepthurldepospath:三个参数分别是url需要下载的__地址dep需要遍历的深度ospath__下载的本地文件夹 globalnumifdep=0:return0else:img=get_imgurlforjinrange0lenimg:ifis_imgimg[j]==i__ge:i___ist=True;whilei___ist:#判断文件是否已经存在filepath=get_file_nameospathimg[j];ifnotos.path.existsfilepath:i___ist=False;try:urllib.urlretrieveimg[j]filepathprint已经下载好第%d张__%num+1num+=1ex__pt:print该__无法下载或者__地址无法识别!printimg[j]else:passurls=get_urlurliflenurls0:forurlinurls:depthurldep-1ospathelse:return0return1if__name__==____in__:imglenth=1 #设置需要下载的__大小num=0depthhttp://___.tudou.com/2E:\img\\ print********************************我爬完了!!******************************************Python用HTMLParser解析HTML文件HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析本文主要简单讲一下HTMLParser的用法.使用时需要定义一个从类HTMLParser继承的类,重定义函数handle_starttagtagattrshandle_startendtagtagattrshandle_endtagtag来实现自己需要的功能tag是的html标签,attrs是属性,值元组tuple的列表list.HTMLParser自动将tag和attrs都转为小写下面给出的例子抽取了html中的所有链接fromHTMLParserimportHTMLParser classMyHTMLParserHTMLParser:def__init__self:HTMLParser.__init__selfself.links=[] defhandle_starttagselftagattrs:#printEncounteredthebeginningofa%stag%tagiftag==a:iflenattrs==0:passelse:forvariablevalueinattrs:ifvariable==href:self.links.appendvalue if__name__==____in__:html_code=ahref=___.google.comgoogle.com/aAHref=___.pythonclub.orgPythonClub/aAHREF=___.sina.com.cnSina/ahp=MyHTMLParserhp.feedhtml_codehp.closeprinthp.links输出为[___.google.com___.pythonclub.org___.sina.com.cn]如果想抽取图形链接imgsrc=http://___.google.com/intl/zh-CN_ALL/i__ges/logo.gif/就要重定义handle_startendtagtagattrs函数从HTML文件中抽取正文的简单方案zz____http://ai-depot.com/articles/the-easy-way-to-extract-useful-text-from-arbitrary-html/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文件,for__tter模块可用以输出格式化的文本嗯,实现的顶层函数如下defextract_texthtml:#Derivefromfor__tter.AbstractWritertostoreparagraphs.writer=LineWriter#Defaultfor__ttersendscom__ndstoourwriter.for__tter=AbstractFor__tterwriter#Derivefromhtmllib.HTMLParsertotrackparsedbytes.parser=TrackingParserwriterfor__tter#GivetheparsertherawHTMLdata.parser.feedhtmlparser.close#Filtertheparagraphsstoredandoutputthem.returnwriter.outputTrackingParserhttp://___.pythonclub.org/python-files/trackingparser覆盖了解析标签开始和结束时调用的回调函数,用以给缓冲对象传递当前解析的索引通常你不得不这样,除非你使用不被推荐的方法——深入调用堆栈去获取执行帧这个类看起来是这样的classTrackingParserhtmllib.HTMLParser:Trytokeepaccuratepointerofparsinglocation.def__init__selfwriter*args:htmllib.HTMLParser.__init__self*argsself.writer=writerdefparse_starttagselfi:index=htmllib.HTMLParser.parse_starttagselfiself.writer.index=indexreturnindexdefparse_endtagselfi:self.writer.index=ireturnhtmllib.HTMLParser.parse_endtagselfiLinWriterhttp://___.pythonclub.org/python-files/linwriter的大部分工作都通过调用for__tter来完成如果你要改进或者修改程序,大部分时候其实就是在修改它我们将在后面讲述怎么为它加上机器学习代码但你也可以保持它的简单实现,仍然可以得到一个好结果具体的代码如下classParagraph:def__init__self:self.text=self.bytes=0self.density=
0.0classLineWriterfor__tter.AbstractWriter:def__init__self*args:self.last_index=0self.lines=[Paragraph]for__tter.AbstractWriter.__init__selfdefsend_flowing_dataselfdata:#Workoutthelengthofthistextchunk.t=lendata#Weveparsedmoretextsoincrementindex.self.index+=t#Calculatethenumberofbytessin__lasttime.b=self.index-self.last_indexself.last_index=self.index#Accumulatethisinfor__tionincurrentline.l=self.lines[-1]l.text+=datal.bytes+=bdefsend_paragraphselfblankline:Createanewparagraphifne__ssary.ifself.lines[-1].text==:returnself.lines[-1].text+=n*blankline+1self.lines[-1].bytes+=2*blankline+1self.lines.appendWriter.Paragraphdefsend_literal_dataselfdata:self.send_flowing_datadatadefsend_line_breakself:self.send_paragraph0这里代码还没有做输出部分,它只是聚合数据现在我们有一系列的文字段(用数组保存),以及它们的长度和生成它们所需要的HTML的大概字节数现在让我们来看看统计学带来了什么数据分析幸运的是,数据里总是存在一些模式从下面的原始输出你可以发现有些文本需要大量的HTML来编码,特别是标题、侧边栏、页眉和页脚虽然HTML字节数的峰值多次出现,但大部分仍然低于平均值;我们也可以看到在大部分低HTML字节数的字段中,文本输出却相当高通过计算文本与HTML字节数的比率(即密度)可以让我们更容易明白它们之间的关系密度值图更加清晰地表达了正文的密度更高,这是我们的工作的事实依据过滤文本行过滤文本行的最简单方法是通过与一个阈值(如50%或者平均值)比较密度值下面来完成LineWriterhttp://___.pythonclub.org/python-files/linewriter类defcompute_densityself:Calculatethedensityforeachlineandthe__erage.total=
0.0forlinself.lines:l.density=lenl.text/floatl.bytestotal+=l.density#Storeforoptionalusebytheneuralnetwork.self.__erage=total/floatlenself.linesdefoutputself:Returnastringwiththeuselesslinesfilteredout.self.compute_densityoutput=StringIO.StringIOforlinself.lines:#Checkdensityagainstthreshold.#Customfilterextensionsgohere.ifl.density
0.5:output.writel.text监督式机器学习这是一个标识文本行是否为正文的接口界面所谓的监督式学习就是为算法提供学习的例子在这个案例中,我们给定一系列已经由人标识好的文档——我们知道哪一行必须输出或者过滤掉我们用使用一个简单的神经网络作为感知器,它接受浮点输入并通过“神经元”间的加权连接过滤信息,然后输后另一个浮点数大体来说,神经元数量和层数将影响获取最优解的能力我们的原型将分别使用单层感知器(SLP)和多层感知器(MLP)模型我们需要找些数据来供机器学习之前的LineWriterhttp://___.pythonclub.org/python-files/linewriter.output函数正好派上用场,它使我们能够一次处理所有文本行并作出决定哪些文本行应该输出的全局结策从直觉和经验中我们发现下面的几条原则可用于决定如何过滤文本行当前行的密度当前行的HTML字节数当前行的输出文本长度前一行的这三个值后一行的这三个值我们可以利用FANN的Python接口来实现,FANN是FastArtificialNeuralNetWorkhttp://___.pythonclub.org/python-files/network库的简称基本的学习代码如下frompyfannimportfannlibfann#Thiscreatesanewsingle-layerper__ptronwith1outputand3inputs.o__=libfann.fann_create_standard_array231ann=fann.fann_classo__#Loadthedatawedescribedabove.patterns=fann.read_train_from_filetraining.___ann.train_on_datapatterns
100010.0#Thentestitwithdifferentdata.fordatindatoutinvalidation_data:result=ann.rundatinprintGot:resultExpected:datout尝试不同的数据和不同的网络结构是比较机械的过程不要使用太多的神经元和使用太好的文本__来训练(过拟合),相反地应当尝试解决足够多的问题使用不同的行数(1L-3L)和每一行不同的属性(1A-3A)得到的结果如下有趣的是作为一个猜测的固定阈值,
0.5的表现非常好(看第一列)学习算法并不能仅仅通过比较密度来找出更佳的方案(第二列)使用三个属性,下一个SLP比前两都好,但它引入了更多的假阴性使用多行文本也增进了性能(第四列),最后使用更复杂的神经网络结构比所有的结果都要更好,在文本行过滤中减少了80%错误注意你能够调整误差计算,以给假阳性比假阴性更多的惩罚(宁缺勿滥的策略)结论从任意HTML文件中抽取正文无需编写针对文件编写特定的抽取程序,使用统计学就能获得令人惊讶的效果,而机器学习能让它做得更好通过调整阈值,你能够避免出现鱼目混珠的情况它的表现相当好,因为在神经网络判断错误的地方,甚至人类也难以判定它是否为正文现在需要思考的问题是用这些“干净”的正文内容做什么应用好呢?解析网页内容的好代码http://___.cnitblog.com/donne/archive/2007/12/02/
37194.htmlfrom sgmllib import SGMLParserimport urllibclass URLListerSGMLParser: def resetself: SGMLParser.resetself self.urls = [] def start_aself attrs: href = [v for k v in attrs if k ==href] if href: self.urls.extendhrefif __name__ == ____in__: usock = urllib.urlopen___.xxx.com parser = URLLister parser.feedusock.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处理开始标签,比如xxhandle_endtag处理结束标签,比如/xxhandle_charref处理特殊字符串,就是以#开头的,一般是内码表示的字符handle_entityref处理一些特殊字符,以开头的,比如nbsp;handle_data处理数据,就是xxdata/xx中间的那些数据handle_comment处理注释handle_decl处理!开头的,比如!DOCTYPEhtmlPUBLIC-//W3C//DTDHTML
4.01Transitional//ENhandle_pi处理形如instruction的东西这里我以从网页中获取到url为例,介绍一下要想获取到url,肯定是要分析a标签,然后取到它的href属性的值下面是代码#-*-encoding:gb2312-*-importHTMLParserclassMyParserHTMLParser.HTMLParser:def__init__self:HTMLParser.HTMLParser.__init__selfdefhandle_starttagselftagattrs:#这里重新定义了处理开始标签的函数iftag==a:#判断标签a的属性fornamevalueinattrs:ifname==href:printvalueif__name__==____in__:a=htmlheadtitletest/titlebodyahref=http://___.
163.com链接到163/a/body/htmlmy=MyParser#传入要分析的数据,是html的my.feeda本文来自CSDN__,转载请标明出处http://blog.csdn.net/zhaoweikid/archive/2007/06/13/
1649997.aspxhttp://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://___.google.com/search hl=enq=urlparsebtnG=Google+Search unparsedURL=urlparse.urlunparseURLscheme\ URLlocationURLpath newURL=urlparse.urljoinunparsedURL /module-urllib2/request-o__ects.html 函数urlparseurlstring[default_scheme[allow_fragments]]的作用是将URL分解成不同的组成部分,它从urlstring中取得URL,并返回元组schemenetlocpathparametersqueryfragment注意,返回的这个元组非常有用,例如可以用来确定网络协议HTTP、FTP等等、服务器地址、文件路径,等等 函数urlunparsetuple的作用是将URL的组件装配成一个URL,它接收元组schemenetlocpathparametersqueryfragment后,会重新组成一个具有正确格式的URL,以便供Python的其他HTML解析模块使用 函数urljoinbaseurl[allow_fragments]的作用是拼接URL,它以第一个参数作为其__址,然后与第二个参数中的相对地址相结合组成一个绝对URL地址函数urljoin在通过为URL__址附加新的文件名的方式来处理同一位置处的若干文件的时候格外有用需要注意的是,如果__址并非以字符/结尾的话,那么URL__址最右边部分就会被这个相对路径所替换比如,URL的__址为Http://___.testpage.com/pub,URL的相对地址为test.html,那么两者将合并成http://___.testpage.com/test.html,而非http://___.testpage.com/pub/test.html如果希望在该路径中保留末端目录,应确保URL__址以字符/结尾 下面是上面几个函数的详细一点的用法举例importurlparse URLscheme=http URLlocation=___.python.org URLpath=lib/module-urlparse.html modList=urlliburllib2\ httplibcgilib #将地址解析成组件 print用Google搜索python时地址栏中URL的解析结果 parsedTuple=urlparse.urlparse http://___.google.com/search hl=enq=pythonbtnG=Google+Search printparsedTuple #将组件反解析成URL print\反解析python文档页面的URL unparsedURL=urlparse.urlunparse\ URLschemeURLlocationURLpath print\t+unparsedURL #将路径和新文件组成一个新的URL print\n利用拼接方式添加更多python文档页面的URL formodinmodList: newURL=urlparse.urljoinunparsedURL\ module-%s.html%mod print\t+newURL #通过为路径添加一个子路径来组成一个新的URL print\n通过拼接子路径来生成Python文档页面的URL newURL=urlparse.urljoinunparsedURL module-urllib2/request-o__ects.html print\t+newURL上述代码的执行结果如下所示 用Google搜索python时地址栏中URL的解析结果 http___.google.com/search hl=enq=pythonbtnG=Google+Search 反解析python文档页面的URL http://___.python.org/lib/module-urlparse.html 利用拼接方式添加更多python文档页面的URL http://___.python.org/lib/module-urllib.html http://___.python.org/lib/module-urllib
2.html http://___.python.org/lib/module-httplib.html http://___.python.org/lib/module-cgilib.html 通过拼接子路径来生成Python文档页面的URL http://___.python.org/lib/module-urllib2/request-o__ects.html
二、打开HTML文档 上面介绍了如何解析页面的URL,现在开始讲解如何通过URL打开一个网页实际上,Python所带的urllib和urllib2这两个模块为我们提供了从URL打开并获取数据的功能,当然,这包括HTML文档 importurllib u=urllib.urlopenwebURL u=urllib.urlopenlocalURL buffer=u.read printu.info print从%s读取了%d字节数据.\n%u.geturllenbuffer 若要通过urllib模块中的urlopenurl[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://___.python.org localURL=index.html #通过URL打开远程页面 u=urllib.urlopenwebURL buffer=u.read printu.info print从%s读取了%d字节数据.\n%u.geturllenbuffer #通过URL打开本地页面 u=urllib.urlopenlocalURL buffer=u.read printu.info print从%s读取了%d字节数据.\n%u.geturllenbuffer 上面代码的运行结果如下所示 Date:Fri26Jun200910:22:11GMT Server:Apache/
2.
2.9DebianD__/2SVN/
1.
5.1mod_ssl/
2.
2.9OpenSSL/
0.
9.8gmod_wsgi/
2.3Python/
2.
5.2 Last-Modified:Thu25Jun200909:44:54GMT ETag:105800d-46e7-46d29136f7180 Ac__pt-Ranges:bytes Content-Length:18151 Connection:close Content-Type:text/html 从http://___.python.org读取了18151字节数据. Content-Type:text/html Content-Length:865 Last-modified:Fri26Jun200910: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 classparseLinksHTMLParser.HTMLParser: defhandle_starttagselftagattrs: iftag==a: fornamevalueinattrs: ifname==href: printvalue printself.get_starttag_text lParser=parseLinks lParser.feedurllib.urlopenhttp://___.python.org/index.html.read 处理HTML文档的时候,我们常常需要从其中提取出所有的链接使用HTMLParser模块后,这项任务将变得易如反掌首先,我们需要定义一个新的HTMLParser类,以覆盖handle_starttag方法,我们将使用这个方法来显示所有标签的HRef属性值 定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象然后,就可以使用urllib.urlopenurl打开HTML文档并读取该HTML文件的内容了 为了解析HTML文件的内容并显示包含其中的链接,可以使用read函数将数据传递给HTMLParser对象HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析需要注意,如果传给HTMLParser的feed函数的数据不完整的话,那么不完整的标签会保存下来,并在下一次调用feed函数时进行解析当HTML文件很大,需要分段发送给解析器的时候,这个功能就会有用武之地了下面是一个具体的例子 importHTMLParser importurllib importsys #定义HTML解析器 classparseLinksHTMLParser.HTMLParser: defhandle_starttagselftagattrs: iftag==a: fornamevalueinattrs: ifname==href: printvalue printself.get_starttag_text #创建HTML解析器的实例 lParser=parseLinks #打开HTML文件 lParser.feedurllib.urlopen\ http://___.python.org/index.html.read lParser.close 上述代码的运行结果太长,在此省略,您可以自己运行代码试试
二、从HTML文档中提取图像 处理HTML文档的时候,我们常常需要从其中提取出所有的图像使用HTMLParser模块后,这项任务将变得易如反掌首先,我们需要定义一个新的HTMLParser类,以覆盖handle_starttag方法,该方法的作用是查找img标签,并保存src属性值所指的文件 importHTMLParser importurllib defgetI__geaddr: u=urllib.urlopenaddr data=u.read classparseI__gesHTMLParser.HTMLParser: defhandle_starttagselftagattrs: iftag==img: fornamevalueinattrs: ifname==src: getI__geurlString+/+value u=urllib.urlopenurlString lParser.feedu.read 定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象然后,就可以使用urllib.urlopenurl打开HTML文档并读取该HTML文件的内容了 为了解析HTML文件的内容并显示包含其中的图像,可以使用feeddata函数将数据发送至HTMLParser对象HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析下面是一个具体的示例 importHTMLParser importurllib importsys urlString=http://___.python.org #把图像文件保存至硬盘 defgetI__geaddr: u=urllib.urlopenaddr data=u.read splitPath=addr.split/ fName=splitPath.pop printS__ing%s%fName f=openfNamewb f.writedata f.close #定义HTML解析器 classparseI__gesHTMLParser.HTMLParser: defhandle_starttagselftagattrs: iftag==img: fornamevalueinattrs: ifname==src: getI__geurlString+/+value #创建HTML解析器的实例 lParser=parseI__ges #打开HTML文件 u=urllib.urlopenurlString printOpeningURL\n==================== printu.info #把HTML文件传给解析器 lParser.feedu.read lParser.close 上述代码的运行结果如下所示 OpeningURL ==================== Date:Fri26Jun200910:54:49GMT Server:Apache/
2.
2.9DebianD__/2SVN/
1.
5.1mod_ssl/
2.
2.9OpenSSL/
0.
9.8gmod_wsgi/
2.3Python/
2.
5.2 Last-Modified:Thu25Jun200909:44:54GMT ETag:105800d-46e7-46d29136f7180 Ac__pt-Ranges:bytes Content-Length:18151 Connection:close Content-Type:text/html S__ingpython-logo.gif S__ingtrans.gif S__ingtrans.gif S__ingafnic.fr.png
三、从HTML文档中提取文本 处理HTML文档的时候,我们常常需要从其中提取出所有的文本使用HTMLParser模块后,这项任务将变得非常简单了首先,我们需要定义一个新的HTMLParser类,以覆盖handle_data方法,该方法是用来解析并文本数据的 importHTMLParser importurllib classparseTextHTMLParser.HTMLParser: defhandle_dataselfdata: ifdata!=\n: urlText.appenddata lParser=parseText lParser.feedurllib.urlopen\ http://docs.python.org/lib/module-HTMLParser.html.read 定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象然后,就可以使用urllib.urlopenurl打开HTML文档并读取该HTML文件的内容了 为了解析HTML文件的内容并显示包含其中的文本,我们可以使用feeddata函数将数据传递给HTMLParser对象HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析要注意的是,如果传给HTMLParser的feed函数的数据不完整的话,那么不完整的标签会保存下来,并在下一次调用feed函数时进行解析当HTML文件很大,需要分段发送给解析器的时候,这个功能就会有用武之地了下面是一个具体的代码示例 importHTMLParser importurllib urlText=[] #定义HTML解析器 classparseTextHTMLParser.HTMLParser: defhandle_dataselfdata: ifdata!=\n: urlText.appenddata #创建HTML解析器的实例 lParser=parseText #把HTML文件传给解析器 lParser.feedurllib.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 fromurllib2importurlopenRequest cJar=cookielib.LWPCookieJar opener=urllib
2.build_opener\ urllib
2.HTTPCookiePro__ssorcJar urllib
2.install_openeropener r=RequesttestURL h=urlopenr forindcookieinenumeratecJar: print%d-%s%indcookie cJar.s__ecookieFile 为了从HTML文档提取cookies,首先得使用cookielib模块的LWPCookieJar函数创建一个cookiejar的实例LWPCookieJar函数将返回一个对象,该对象可以从硬盘加载Cookie,同时还能向硬盘存放Cookie 接下来,使用urllib2模块的build_opener[handler...]函数创建一个opener对象,当HTML文件打开时该对象将处理cookies函数build_opener可以接收零个或多个处理程序这些程序将按照它们被指定的顺序连接在一起作为参数并返回一个 注意,如果想让urlopen使用opener对象来打开HTML文件的话,可以调用install_openeropener函数,并将opener对象传给它否则,请使用opener对象的openurl函数来打开HTML文件 一旦已经创建并__了opener对象,就可以使用urllib2模块中的Requesturl函数来创建一个Request对象,然后就能使用urlopenRequest函数来打开HTML文件了 打开HTML页面后,该页面的所有Cookie将被存放到LWPCookieJar对象中,之后,您可以使用LWPCookieJar对象的s__efilename函数了 importos importurllib2 importcookielib fromurllib2importurlopenRequest cookieFile=cookies.dat testURL=http://__ps.google.com/ #为cookiejar创建实例 cJar=cookielib.LWPCookieJar #创建HTTPCookiePro__ssor的opener对象 opener=urllib
2.build_opener\ urllib
2.HTTPCookiePro__ssorcJar #__HTTPCookiePro__ssor的opener urllib
2.install_openeropener #创建一个Request对象 r=RequesttestURL #打开HTML文件 h=urlopenr print页面的头部\n====================== printh.info print页面的Cookies\n====================== forindcookieinenumeratecJar: print%d-%s%indcookie #保存cookies cJar.s__ecookieFile 上述代码的运行结果如下所示 页面的头部 ====================== 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=Sun26-Jun-201111:26:48GMT;path=/;do__in=.google.com Date:Fri26Jun200911:26:48GMT Server:mfe Expires:Fri26Jun200911:26:48GMT Transfer-Encoding:chunked Connection:close 页面的Cookies ====================== 0-
五、为HTML文档中的属性值添加引号 前面我们讨论了如果根据HTML解析器中的某种处理程序来解析HTML文件,可是有时候我们却需要使用所有的处理程序来处理HTML文档值得庆幸的是,使用HTMLParser模块解析HTML文件的所有要素并不比处理链接或者图像难多少 importHTMLParser importurllib classparseAttrsHTMLParser.HTMLParser: defhandle_starttagselftagattrs: ... attrParser=parseAttrs attrParser.init_parser attrParser.feedurllib.urlopentest
2.html.read 这里,我们将讨论如何使用HTMLParser模块来解析HTML文件,从而为“裸奔”的属性值加上引号首先,我们要定义一个新的HTMLParser类,以覆盖下面所有的处理程序来为属性值添加引号 handle_starttagtagattrs handle_charrefname handle_endtagtag handle_entityrefref handle_datatext handle_commenttext handle_pitext handle_decltext handle_startendtagtagattrs 我们还需要在parser类中定义一个函数来初始化用于存储解析好的数据的变量,同时还要定义另外一个函数来返回解析好的数据 定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象使用我们创建的init函数初始化该解析器,这样,我们就可以使用urllib.urlopenurl打开HTML文档并读取该HTML文件的内容了 为了解析HTML文件的内容并给属性值添加引号,可以使用feeddata函数将数据传递给HTMLParser对象HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析下面是一个具体的示例代码 importHTMLParser importurllib importsys #定义HTML解析器 classparseAttrsHTMLParser.HTMLParser: definit_parserself: self.pie__s=[] defhandle_starttagselftagattrs: fixedAttrs= #fornamevalueinattrs: fornamevalueinattrs: fixedAttrs+=%s=\%s\%namevalue self.pie__s.append%s%s%tagfixedAttrs defhandle_charrefselfname: self.pie__s.append#%s;%name defhandle_endtagselftag: self.pie__s.append%tag defhandle_entityrefselfref: self.pie__s.append%s%ref defhandle_dataselftext: self.pie__s.appendtext defhandle_commentselftext: self.pie__s.append%text defhandle_piselftext: self.pie__s.append%text defhandle_declselftext: self.pie__s.append%text defparsedself: return.joinself.pie__s #创建HTML解析器的实例 attrParser=parseAttrs #初始化解析器数据 attrParser.init_parser #把HTML文件传给解析器 attrParser.feedurllib.urlopentest
2.html.read #显示原来的文件内容 print原来的文件\n======================== printopentest
2.html.read #显示解析后的文件 print解析后的文件\n======================== printattrParser.parsed attrParser.close 我们还需要建立一个测试文件,名为test
2.html,该文件内容可以从上述代码的运行结果看到,具体如下所示原来的文件========================htmlheadmetacontent=text/html;charset=utf-8http-equiv=content-type/titleWeb页面/title/headbodyH1Web页面清单/H1ahref=http://___.python.orgPython__/aahref=test.html本地页面/aimgSRC=test.jpg/body/html解析后的文件========================htmlheadmetacontent=text/html;charset=utf-8http-equiv=content-type/metatitleWeb页面/title/headbodyh1Web页面清单/h1ahref=http://___.python.orgPython__/aahref=test.html本地页面/aimgsrc=test.jpg/body/html
六、小结对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页即HTML文件的解析处理事实上,通过Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档本文将详细介绍了如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图像和Cookie等同时,我们还给出了一个规范HTML文件的格式标签的例子,希望本文对您会有所帮助Python读取网页并保存代码如下importsysimporturllib2importosprintParametercount:lensys.argviflensys.argv3: printParameterrequired: printS__ingHttpPageTool.exe[WebPageAddress][s__ingPath] exit0name=sys.argv
[2]ifos.path.existsname: printremovefile:+name os.removenameprintgetpage:+sys.argv
[1]req=urllib
2.Requestsys.argv
[1]res=urllib
2.urlopenreq##headers=strres.info##printheadershtml=res.readprintwritefile:+namewriteFile=filenamewwriteFile.writehtmlwriteFile.closeprintfinishedpython正则小试读取网页内容2个月前坛子里有道友问的shell问题当时用python草草写下一个简单的脚本今天无意中翻出贴出来已做备用#!/usr/bin/envpython#-*-coding:UTF-8-*-#Author:wanghaoyu-wanghaoyu1625@g__il.com#__:42030925#Lastmodified:2010-04-1914:04#Filename:web.py#Description:importosurlliburllib2importresysurl=http://jt.sz.bendibao.com/bus/linesearch.aspxline=615x=0y=0page=urllib.urlopenurl.readpat=re.compilerdivclass=line/div.*divclass=pad8lrlh24blue_06cflags=20cont=pat.searchpage.group1cont=re.subr.*contprintcont输出结果是 运营时间5:50-21:20 票价上车2元全程7元 往程七十二区总站-金威啤酒厂-新福市场-宝城__市场-宝安海关大厦-宝安党校-新安影剧院-恒丰商场-沁园公园-教育培训中心-恒丰中心-宝安税务局-宝安海雅百货-冠利达大厦-建安新村-北方公司-西乡路口-臣田-固戍-劲力集团-三围路口-中华商贸城- 鹤洲路口-钟屋-翠湖花园-机场路口-下十围-白石厦-福永工业区-__工业区-福永汽车站__分站-上南油站-沙井电子城-上寮市场-上南酒店-上寮市场-沙井天虹商场-万丰派出所-万丰工业区-马鞍山市场-茭塘工业区-大王山-三洋马达厂-沙一村-海欣花园-安托山科技园-海上田园风光-国富康总站 返程国富康总站-海上田园风光-安托山科技园-海欣花园-沙一村-三洋马达厂-大王山-茭塘工业区-马鞍山市场-万丰工业区- 万丰派出所-沙井天虹商场-上寮市场-沙井电子城-上南油站-福永汽车站__分站-__工业区-福永工业区-白石厦-下十围-机场路口-翠湖花园-钟屋-鹤洲路口-中华商贸城-三围路口-劲力集团-固戍-臣田-西乡路口-北方公司-建安新村-冠利达大厦-宝安海雅百货-宝安税务局-恒丰中心-教育培训中心-沁园公园-恒丰商场-新安影剧院-宝安党校-宝安海关大厦-宝城__市场-新福市场-金威啤酒厂-七十二区总站抓取網頁的最佳語言:Python最初最早我用C/C++語言慢慢寫抓網頁的用它來抓網頁真的是程式,一開始甚至打算自己寫抓取網頁的函式庫,想說當做練習,可是HTTP協定雖然不難,可是煩,要處理的細節太多了,後來受不了,轉而使用現成的Library:cUrlhttp://curl.haxx.se/,但是C/C++語言開發這類東西的效率實在太慢了,我的程式不停的修改、不停的修改,光是編譯的時間就吃掉了不知道多少,字串的處理C/C++沒有內建正規表示法或一些好用的字串函數之類的,處理起來也礙手礙腳,當時,我想將我寫好的函數庫寫成能讓Lua呼叫的形式,或著甚是C/C++來呼叫Lua,因為C/C++有很多細節要處理,Memoryleak有的沒有的雜事,我想要的只是專注在寫抓取網頁的程式,因此用Lua包裝似乎是不錯的選擇,但是開發時間太久了,事情一直沒有變好直到我下了一個結論,C/C++不適合寫抓取網頁的程式,我開始思考我需要什麼,我想我既然要包裝成其它語言將細節藏起來,為何不直接使用script語言我最早一直擔心的是效率的問題,但是到後來想想反正真正沒效率的部份包給C/C++去做事實上沒有太大的差別,而且又有動態語言的彈性、除錯上的方便等等好處,何樂不為於是我開始尋找一款合適的語言Perl如何很早以前我有用Perl寫過一些CGI程式、留言版、網站管理系統、文章管理系統等等,有人說Perl是只能寫一次的語言,它有很多很簡短的符號所構成的表示法,可讀性不是很好,模組化設計也沒有非常好的支援,OO也是一樣,新版的Perl遲遲沒有推出,似乎已經有點變成遺產的感覺,或許是上面的理由還是偏見,總而言之我不喜歡PerlPHP做為一個以網頁為主要用途的語言,拿來當做其它用途總有種不太合適的感覺,從它的語法來看,很明顯是參考C語言、Perl等等而來的,但是卻沒有加以改進,我個人認為它可能沒有預料到PHP居然會紅成這樣,變成網頁程式設計的主流語言,後來有很多缺點就變得顯而易見,不夠嚴僅的語法、不夠好的模組化設計、不良的OO支援、容易寫出安全性有問題的程式等等,命名空間也是它一大缺點之一,光是看到一大堆前綴字開頭的函數就有種倒胃口的感覺,有人說PHPistheBASICofthe21st__ntury在這個影片http://ia
301129.us.archive.org/3/items/SeanKellyRecoveryfro__ddiction/Recovery_from_Addiction.mov裡,總合種種理由,做為抓取網頁的用途,PHP出局Luahttp://___.lua.org/Lua做為輕量級的語言相當的優秀,可是你不會想用Lua來寫大型的程式,我也不會想這麼做,它語言的設計都是以速度為優先考量,寫起來並不怎麼順手的感覺,再加上目前的資源不多,可能很多東西都得自行包裝,這樣就和我原先想做的事是一樣的,因此不考慮LuaJ__aJ__a是和網路一起成長的程式語言,做為抓取網頁的用途,它絕對有能力勝任,但是…,我嫌它太囉唆了,還有太癡肥,當一款語言太囉唆和太癡肥往往會令人討厭,歐!想到J__a我就想起eclipse在我那台只有256扣掉分給顯示記憶體的筆電上執行的情況,讓我想把電腦砸掉,不好意思,我不喜歡J__a在前面的影片http://ia
301129.us.archive.org/3/items/SeanKellyRecoveryfro__ddiction/Recovery_from_Addiction.mov裡的老兄一樣也有提到,有興趣可以看看J__aistheCOBOLofthe21st__nturyPythonhttp://ez2learn.com/python-tutorial/what-is-python最後,我在PTT的程式設計討論版上描述了我的需求,有人推文說Python,我抓了抓頭髮,PythonWTF這是什麼我從來沒有聽過這款語言,於是上網找了一下資料,和問了一些問題,發現這款語言正是我想要的,它很容易被擴充,因此效能不足可以用C/C++補強,你想得到的函式庫幾乎都已經有人寫好了,光從下載網頁這件工作來看,它的標準函式庫已經有了這樣的功能,你覺得不夠好還有其它很多的選擇,開箱即用的哲學,讓安裝函式庫非常簡單,不像C/C++的編譯惡夢讓你抓光頭髮,而它最優秀的地方之一就是它的可讀性,寫起來相當順手、優雅,讀起來也一樣順眼,重要的是很有趣,那麼開發大型的程式呢script語言常見的問題就是對於開發大型程式來說很不適合,但是Python卻不是如此,良好的OO、模組化等等它都有良好的支援,再加上Google也是Python的愛用者,_______也是用Python開發的,有了這些大咖背書,證明這款語言的確是相當優秀,在決定使用Python之後我就立刻訂購了一本LearningPythonhttp://___.books.com.tw/exep/assp.php/victorlin/exep/prod/booksfile.phpitem=F011223401,開始學習Python愛上PythonPython並沒有讓我失望,能用Python寫的東西都不太想用C/C++去寫,開發效率非常高、寫起來很順手、豐富的資源,讓我覺得這真的是優秀的語言,它的確很適合拿來抓取網頁,不過抓取網頁還有更多東西要考慮Twistedhttp://ez2learn.com/python-tutorial/third-_____/twisted-tutorial/what-is-twisted用Python抓取網頁的HTML只是小菜一盤,用Python標準函數庫就辦得到,但不是那麼好用,最後我發現了Twisted,就改用Twisted來抓網頁,它有優秀的非同步__驅動的架構,常見的協定都已經有實做,包括HTTP、__TP等等,用它來抓網頁真的是再容易不過了getPagehttp://___.google.com.addCallbackprintPage是的,一行就可以抓網頁,夠簡單吧,而且你想要傳POST或GET等參數,或是修改HTTP的header都沒有問題BeautifulSouphttp://___.crummy.com/software/BeautifulSoup/抓網頁事實上不是什麼難事,解析HTML要來得更麻煩,最初使用Python的標準函式庫內建的HTMLParser來解析網頁,但是功能太陽春,加上最頭痛的問題是,大部份的網頁都沒有完全尊照標準來寫,各種莫明奇妙的錯誤令人想要找出那個寫網頁的人痛打他一頓,為了解決容錯的問題,一開始我使用BeautifulSoup來抓取網頁,它是以容錯著名的HTMLParser,但是,它的效率很差,又或著說,找到目標HTML標籤的方式很沒效率,一般都用find等方式來找到所要的標籤soup.finddivdictid=content它真的很沒效率,當你抓取大一點的網頁時,多塞幾個一起抓和解析,你就會看見你的CPU使用率永遠是滿的狀態,原本我預計抓網頁的瓶頸都會落在網路IO上面,但是用它來抓取網頁卻超出我預料,沒想到它會這麼吃重,於是沒辦法,我開始尋找更好的選擇lxmlhttp://codespeak.net/lxml/我找到一個Blog的文章:PythonHTMLParserPerfor__n__http://blog.ianbicking.org/2008/03/30/python-html-parser-perfor__n__/,介紹了Python各種Parser的效能,效能最亮眼的,就是lxml,我最初擔心的是找到資料標籤會不會很困難,但是我發現它支援xpath,就試著改寫原本BeautifulSoup用find等等函數寫的尋找標籤程式,發現xpath遠比那種方式來得好用太多了,而且效率好太多了,BeautifulSoup的find極度的沒有效率,大部份的CPU時間都耗在一堆find函數走訪HTML樹上,而xpath篩選標籤的方式來得有效率多了,以下舉幾個我實際用在抓取網頁的案子中的例子defgetNextPageLinkselftree:Getnextpagelink @paramtree:treetogetlink@return:ReturnurlofnextpageifthereisnonextpagereturnNonepaging=tree.xpath//span[@class=paging]ifpaging:links=paging
[0].xpath./a[text%s]%self.localText[next]iflinks:returnstrlinks
[0].gethrefreturnNonelistPri__=tree.xpath//*[@class=pri__BlockLabel]/following-sibling::*iflistPri__:detail[listPri__]=self.stripMoneylistPri__
[0].text原本使用BeautifulSoup在尋找標籤遇到麻煩的走訪羅輯上的問題還得寫程式解決,xpath本身就有豐富的語法可以提供各種篩選的條件,羅輯從程式碼被移到了xpath語法上,有了這樣的語法,尋找目標標籤輕鬆了許多,而且效率也很好,從此我就和BeautifulSoup說再見,改用lxml來找標籤配合FireFox的工具如果有一些工具可以幫助寫解析網頁的程式該有多好,這也是我希望能有的,使用了xpath之後,我找到了FireFox的插件,XPathchecker等xpath的工具,可以先用它來確定抓到的元素是正確的,然後FireBug在檢視網頁結構上也有很大的幫助FireFox插件XPathchecker畫面使用FireBug檢視網頁元素結論就目前一路走過來的經驗來看,抓取網頁Python的確是最佳的選擇,不過我們到目前為止我們都只討論到工具,事實上還有設計上的問題要解決,留在下一次寫Python读取网页并保存(转)http://houzhengqing.blog.
163.com/blog/static/22754987200982813739833/http://houzhengqing.blog.
163.com/blog/static/22754987200982813739833/代码如下importsysimporturllib2importosprintParametercount:lensys.argviflensys.argv3: printParameterrequired: printS__ingHttpPageTool.exe[WebPageAddress][s__ingPath] exit0name=sys.argv
[2]ifos.path.existsname: printremovefile:+name os.removenameprintgetpage:+sys.argv
[1]req=urllib
2.Requestsys.argv
[1]res=urllib
2.urlopenreq##headers=strres.info##printheadershtml=res.readprintwritefile:+namewriteFile=filenamewwriteFile.writehtmlwriteFile.closeprintfinished用Python读取网页最近__处理与机器翻译课要交作业,其中一项是网页采集器,又称spider爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列直到满足系统的一定停止条件Python很适合这类与网络有关的工作下了个Phthon
2.5,居然自带Python__nuals,连借书都免了只看__nuals大概就明白了因为有好多功能健全的lib,用Python抓取网页是如此简单 importurllib urlItem=urllib.urlopenhttp://___.baidu.com htmSour__=urlItem.read urlItem.close显示网页的内容 printhtmSour__显示的是html文件内容我在VC里用这个来实现的CInternetSessionsession这是MFC封装的CInternetSessionsession;//建立一个Internet会话CInternetFile*file=NULL;CStringm_buffer;try{file=CInternetFile*session.OpenURLurl;}catchCInternetEx__ption*pEx{file=NULL;pEx-Delete;}iffile{CStringline;forinti=0;file-ReadStringline;i++{m_buffer+=line+\r\n;}file-Close;deletefile;}python访问网页(摘自刘鑫的__)简单的抓取网页:import urllib.request url=http://google.cn/ response=urllib.request.urlopenurl #返回文件对象page=response.read 有个办法直接将URL保存为本地文件import urllib.request url=http://___.xxxx.com/
1.jpghttp://___.xxxx.com/
1.jpgurllib.request.urlretrieveurlrd:\temp\
1.jpg 网页抓取实际上分为2步:第一步是发出请求第二步接收服务器返回的数据在Python中也是这么做的.POST方式
01.importurllib.parse
02.importurllib.request
03.
04.url=http://liuxin-blog.appspot.com/messageboard/addhttp://liuxin-blog.appspot.com/messageboard/add
05.
06.values={content:命令行发出网页请求测试}
07.data=urllib.parse.urlencodevalues
08.
09.#创建请求对象
10.req=urllib.request.Requesturldata
11.#获得服务器返回的数据
12.response=urllib.request.urlopenreq
13.#处理数据
14.page=response.read GET方式
01.importurllib.parse
02.importurllib.request
03.
04.url=http://___.google.cn/webhphttp://___.google.cn/webhp
05.
06.values={rls:ig}
07.data=urllib.parse.urlencodevalues
08.
09.theurl=url++data
10.#创建请求对象
11.req=urllib.request.Requesttheurl
12.#获得服务器返回的数据
13.response=urllib.request.urlopenreq
14.#处理数据
15.page=response.read 有2个常用的方法geturlinfogeturl的设置是为了辨别是否有服务器端的网址重定向而info则包含了一系列的信息中文问题的处理,会用到encode编码dencode解码[python]用urllib2设置代理访问网页#!/usr/bin/envpythonimporturllib2#changefollowingsbeforeuseuser=foopasswd=barproxyserver=
1.
2.
3.4:5url =http://___.google.com/defproxy1: #work proxy=http://%s:%s@%s%userpasswdproxyserver opener=urllib
2.build_openerurllib
2.ProxyHandler{http:proxy} urllib
2.install_openeropener sContent=urllib
2.urlopenurl printsContent.readdefproxy2: #workforsomeonebutnotforme pas__gr=urllib
2.HTTPPasswordMgrWithDefaultRealm pas__gr.add_passwordrealmproxyserveruserpasswd authinfo=urllib
2.ProxyBasicAuthHandlerpas__gr proxy=http://%s%proxyserver opener=urllib
2.build_openerurllib
2.ProxyHandler{http:proxy}authinfo urllib
2.install_openeropener sContent=urllib
2.urlopenurl printsContent.readdefproxy3: #workforsomeonebutnotforme authinfo=urllib
2.HTTPBasicAuthHandler authinfo.add_passwordrealmproxyserveruserpasswd proxy=http://%s%proxyserver opener=urllib
2.build_openerurllib
2.ProxyHandler{http:proxy}authinfo urllib
2.install_openeropener sContent=urllib
2.urlopenurl printsContent.read 在linux系统中,如果urllib2设置的代理不好用可以试试环境变量exporthttp_proxy=protocol://user:passwd@proxyserver:portexporthttps_proxy=protocol://user:passwd@proxyserver:port 比如通过代理上传appengine文件,其SDK中的rpc不提供代理设置,就可以用这招python访问网页带cookie问题我现在要用python访问一个__的网页,取得一些信息但是__要求先登录,然后才能继续访问,登录过程就是写了个cookie请问下python访问网页怎么保持住cookie呢?我用的是python
3.1,只有urllib和http两个库了网上找了一些代码,都是python
2.x版本的哪位好心的兄弟写几句python
3.1的代码,感激不尽在httpheader中加入Cookie即可,参考下列代码Pythoncodeheaders=[Cookiecookiestr]request=urllib
2.Requestself.urlopener=urllib
2.build_openeropener.addheaders=headersstream=opener.openrequesthtml=stream.read---------------------这个简单Pythoncode#coding:UTF-8importurllib2httpliburllibsyscookielibif__name__==____in__:cj=cookielib.CookieJarbody=staffNomop用户名passwordmop__opener=urllib
2.build_openerurllib
2.HTTPCookiePro__ssorcjopener.addheaders=[User-agentMozilla/
4.0compatible;MSIE
6.0;WindowsNT
5.1]urllib
2.install_openeropenerreq=urllib
2.Requesturlurllib.urlencodebodyu=urllib
2.urlopenreq#printu.read.decodeutf-
8.encodegbkurl=http://app.mop.com/tycoon/u=urllib
2.urlopenurlu=urllib
2.urlopenhttp://app.mop.com/tycoon/myEmpire.do;printu.read.decodeutf-
8.encodegbk编写Python程序访问需要cookie的网页importurllib2cookieliburllibhttplibrecookie=cookielib.CookieJaropener=urllib
2.build_openerurllib
2.HTTPCookiePro__ssorcookieurllib
2.install_openeropenerstr=e__il=******password=****origURL=%2FSysHome.dosubmit=%E7%99%BB%E5%BD%95rexp=re.compilerahref=http://xiaonei.com/getuser.do\id=[0-9]+frquene=[]login=urllib
2.urlopenhttp://___.xiaonei.com/Login.dostrres=login.read#printrescond=Truei=0whilecond: cond=False frlist_url=http://xiaonei.com/myfriendlist.docurpage=%duniv=%i print!!frlist_url i=i+1 frlist=urllib
2.urlopenfrlist_url res=frlist.read print!!res lines=res.split\n forlineinlines: a=rexp.searchline ifa: cond=True frquene.appenda.groups
[0] forfrinfrquene: printfr用Python写点东西,模拟post访问网页#加个这个东东看看能不能好importurllibimporthttp.clientheaders={Ac__pt-Language:zh-cnAc__pt-Charset:gb18030utf-8Ac__pt-Encoding:gzipdeflatebzip2sdchUser-Agent:Mozilla/
5.0Windows;U;WindowsNT
5.1Connection:Keep-Alive}params={querytype:1offset:0select:北京}#所需要的参数conn=http.client.HTTPConnection___.shpost.com.cnconn.requestpost/customer/customer_chaxunjieguo.phpparamsheadersres=conn.getresponsedata=res.readfiled:\\a.htmlwb.writedata报错FileD:/MyDocuments/妗岄潰/url_o.pyline10inmoduleFileD:\ProgramFiles\Python\lib\http\client.pyline862inrequest self._send_requestmethodurlbodyheadersFileD:\ProgramFiles\Python\lib\http\client.pyline908in_send_request self.sendbodyFileD:\ProgramFiles\Python\lib\http\client.pyline6__insend self.sock.sendallstrTypeError:sendallargument1mustbebytesorbuffernotdict更新今天过来写了点新东东,看到这,也更新下吧,前段时候就解决了,因为我用的是Python
3.0,urllib进行了大量的修改以及增强,在
3.0的Python中没有urllib2这个库了,能用的都增强到urllib中了,现在的写法很简单了importurllib.parseimporturllib.requesturl=http://___.shpost.com.cn/customer/customer_chaxunjieguo.phpvalues={querytype:1offset:0}data=urllib.parse.urlencodevalues+select=+urllib.parse.quote北京.encodegb2312#创建请求对象req=urllib.request.Requesturldata{User-Agent:Mozilla/
5.0Windows;U;WindowsNT
5.1;zh-CN;Ac__pt-Language:zh-cnzhAc__pt-Charset:gb2312utf-8}#获得服务器返回的数据response=urllib.request.urlopenreq#处理数据page=response.readopend:\\a.htmlwb.writepage就这些,呵呵,简单很多了,代码少了不少,想想当初没有解决这问题的原因,应该是资料少的问题使用python访问__---urllibTkinterimporturlliburl=http://___.baidu.com/page=urllib.urlopenurl #打开__,一般需要等待一段时间时间长短依赖于__内容data=page.readprintdatahtmlheadmetahttp-equiv=Content-Typecontent=text/html;charset=gb2312title百度一下,你就知道...例子#!/usr/bin/envpython#coding=utf-8#file:httpurl.py#importTkinterimporturllibclassWindow: def__init__selfroot: self.root=root self.entryUrl=Tkinter.Entryroot self.entryUrl.pla__x=5y=15 self.get=Tkinter.Buttonroot text=下载页面 com__nd=self.Get self.get.pla__x=120y=15 self.edit=Tkinter.Textroot self.edit.pla__y=50 defGetself: url=self.entryUrl.get page=urllib.urlopenurl data=page.read self.edit.insertTkinter.ENDdata page.closeroot=Tkinter.Tkwindow=Windowrootroot.minsize600480root.__inloop自编例子#-*_coding:utf-8-*-#file:AutoCaphttpuurl.py#importsysimportosimporturllibimporttimeErrLimt=1000defWeb____ysisWebPage=: passdefGenerateName: currenttime=time.time TimeString=time.ctimecurrenttime TimeString=TimeString.repla__ TimeString=TimeString.repla__:_# printTimeString FileName=TimeString+.htm returnFileNamedeflistDirectorydirectory: getlistoffileinfoo__ectsforfilesofparticularextensions# ParaTableList={} #S__eallparametertable{ParaTableName::0}# FileList=[] #S__eOpenFilename printPleaseinputthefirsthttplink! printFor__tas:http://___.hao
123.com/ WXDownLoadLink=raw_input #Recordthelinknamewaitingforparase. printPleaseinputthesecondhttplink! printFor__tas:http://___.hao
123.com/ THDownLoadLink=raw_input #Recordthelinknamewaitingforparase. data= ErrorCnt=0 whileTrue: try: page=urllib.urlopenWXDownLoadLink data=page.read ex__pt: printWebLinkOpen/ReadErroroccuredat%s%time.ctimetime.time ErrorCnt+=1 ifErrorCnt=ErrLimt: printErrorCnt=%sex__edlimt%s%ErrorCntErrLimt break time.sleep10 continue FileName=GenerateName FileName=WX+FileName printFileName FileName=os.path.joindirectoryFileName try: file=openFileNamewb file.writedata file.close page.close ex__pt: printFileOpen/writeErroroccuredat%s%time.ctimetime.time pass Web____ysisdata data= try: page=urllib.urlopenTHDownLoadLink data=page.read ex__pt: printWebLinkOpen/ReadErroroccuredat%s%time.ctimetime.time ErrorCnt+=1 ifErrorCnt=ErrLimt: printErrorCnt=%sex__edlimt%s%ErrorCntErrLimt break time.sleep10 continue FileName=GenerateName FileName=KO+FileName printFileName FileName=os.path.joindirectoryFileName try: file=openFileNamewb file.writedata file.close page.close ex__pt: printFileOpen/writeErroroccuredat%s%time.ctimetime.time pass Web____ysisdata data=# break time.sleep60*60 #GetWebfileeveryonehour. return0if__name__==____in__: result=0printPleaseinputtheDirectoryoftheLog! printWindlowsFor__tas:E:\DeskTop\ADG\LogsText\Crockett printLinuxFor__tas:/home/merlin/DlWeb Filedir=raw_input result=listDirectoryFiledir ifresult: printThereissomethingerroroccured!python抓网页的编码问题小弟刚接触python抓第一个网页就过不去编码这个坎`请高手赐教代码如下:#coding=gb2312importurllib2fromBeautifulSoupimportBeautifulSoupoutfile=openlsxk.___wforiinrange12:#第一页url=http://bbs.scu.edu.cn/wForum/disparticle.phphttp://bbs.scu.edu.cn/wForum/disparticle.phpboardName=SCUExpressID=1735295349pos=-1page=%d%idoc=urllib
2.urlopenurl.readsoup=BeautifulSoupdocfromEncoding=gb2312printoutfiledoc#输出到文本outfile.close抓到___中的内容是中文但使用beautifulSoup后就乱码了`BS的文档说使用soup=BeautifulSoupdocfromEncoding=gb2312还是不能正确编码.print出来报错是gb2312和utf-8不能编码网页中的某些字符.单独使用编码也不能解决:importcodecsprintopenlsxk.___.read.decodeutf-8可能说的不是很清楚`以上是我遇到的问题们还请高手帮帮忙不甚感谢!最佳答案BeautifulSoup版本有问题,使用
3.03就可以了importurllib2fromBeautifulSoupimportBeautifulSoupf=urllib.urlopenhttp://___.baidu.comhttp://___.baidu.com/html=f.readf.closesoup=BeautifulSoupsoup.feedhtmlprintsoupPython抓取网页__相关代码编写方法利用Python编程语言进行网页内容的抓取是一个比较常用的编程技术那么,今天我们将会为大家详细介绍一下有关Python抓取网页__的操作方法,以方便大家在实际应用中获得一些帮助Python抓取网页__代码示例
1.ImgDownloader
2.import win32com.clienttimewin32inetwin32fileos
3.class ImgDownloader:
4.def __init__selfurldir:
5.self.__dir=dir
6.self.__ie=win32com.client.DispatchInternetExplorer.Application
7.self.__ie.N__igateurl
8.self.__wait__
9.def __wait__self:
10.while self.__ie.Busy:
11.time.sleep
0.1
12.def startself:
13.self.__wait__
14.imgs=self.__ie.Document.getElement__yTagNameimg
15.for i in rangeimgs.length:
16.try:
17.cachInfo=win32inet.GetUrlCacheEntryInfoimgs[i].src
18.if cachInfo:
19.path=cachInfo[LocalFileName]
20.pathpathinfo=path.split\\
21.pathinfo.reverse
22.filename=[%d] % i + pathinfo
[0]
23.win32file.CopyFilepathos.path.joinself.__dirfilenameTrue
24.ex__pt:
25.pass
26.def closeself:
27.self.__ie.Quit
28.if __name__==____in__:
29.d=ImgDownloaderhttp://i__ge.baidu.com/ict=201326592cl=2lm=-1tn=baidui__gepv=word=boyz=0c:\\temp\\
30.d.start
31.d.close 原理在Python使用com接口运行IE浏览器,然后打开网页,获取网页所有__的URL,最后利用win32api函数GetUrlCacheEntryInfo找出__相应的本地缓存文件__到指定目录以上就是我们为大家介绍的Python抓取网页__的应用方式BeautifulSoupPython抓网页小例子收藏viewplaincopytoclipboardprint
01.#-*-coding:utf-8-*-
02.importurllib
203.fromBeautifulSoupimportBeautifulSoupTag
04.importre
05.page=urllib
2.urlopenhttp://__.ganji.com/____/zz_%E5%8C%97%E4%BA%AC-%E5%8D%97%E6%98%8C/20100210/
06.soup=BeautifulSouppage
07.#ss=soup.findAllahref=re.compiler^/____/
100.
08.ss=soup.findAllattrs={class:list_____}
09.fp=openc:\\Python25\\web.htmlw
10.doc=htmlxmlns=http://___.w
3.org/1999/xhtml
11.head
12.metahttp-equiv=Content-Typecontent=text/html;charset=utf-8/
13.titlekeyunqtickets/title
14.metahttp-equiv=refreshcontent=5/
15.linkhref=http://s
1.ganjistatic
1.com/css/base.__1265015655__.cssm___href=http://s
1.ganjistatic
1.com/css/base.__1265015655__.cssrel=stylesheettype=text/css/
16.linkhref=http://s
1.ganjistatic
1.com/css/train.__1264669543__.cssm___href=http://s
1.ganjistatic
1.com/css/train.__1264669543__.cssrel=stylesheettype=text/css/
17.m__:style!--
18..list_____dt{float:left;width:40%;line-height:24px;font-size:14px;text-indent:5px;padding:5px0;}
19.--/m__:stylestylem___bogus=
1.list_____dt{float:left;width:40%;line-height:24px;font-size:14px;text-indent:5px;padding:5px0;}/style
20./head
21.body
22.fp.write%s\n%doc
23.foriinss:
24.i.dt[class]=list______time
25.tmp=i.a[href]
26.i.a[href]=http://__.ganji.com+tmp
27.phonepage=urllib
2.urlopeni.a[href]
28.phonesoup=BeautifulSoupphonepage
29.phone=phonesoup.findAllattrs={class:phoneNum}
30.tmp=phone
[0].img[src]
31.phone
[0].img[src]=http://__.ganji.com+tmp
32.tag1=Tagsoupdd
33.tag1[class]=list______mj
34.i.insert8tag
135.text=strphone
[0].img
36.tag
1.insert1text
37.printi
38.#i.dd.insert0strphone
[0].img
39.fp.write%s\n%i
40.doc=/body
41./html
42.fp.write%s\n%doc
43.fp.close#-*-coding:utf-8-*-importurllib2fromBeautifulSoupimportBeautifulSoupTagimportrepage=urllib
2.urlopenhttp://__.ganji.com/____/zz_%E5%8C%97%E4%BA%AC-%E5%8D%97%E6%98%8C/20100210/soup=BeautifulSouppage#ss=soup.findAllahref=re.compiler^/____/
100.ss=soup.findAllattrs={class:list_____}fp=openc:\\Python25\\web.htmlwdoc=htmlxmlns=http://___.w
3.org/1999/xhtmlheadmetahttp-equiv=Content-Typecontent=text/html;charset=utf-8/titlekeyunqtickets/titlemetahttp-equiv=refreshcontent=5/linkhref=http://s
1.ganjistatic
1.com/css/base.__1265015655__.cssm___href=http://s
1.ganjistatic
1.com/css/base.__1265015655__.cssrel=stylesheettype=text/css/linkhref=http://s
1.ganjistatic
1.com/css/train.__1264669543__.cssm___href=http://s
1.ganjistatic
1.com/css/train.__1264669543__.cssrel=stylesheettype=text/css/m__:style!--.list_____dt{float:left;width:40%;line-height:24px;font-size:14px;text-indent:5px;padding:5px0;}--/m__:stylestylem___bogus=
1.list_____dt{float:left;width:40%;line-height:24px;font-size:14px;text-indent:5px;padding:5px0;}/style/headbodyfp.write%s\n%docforiinss:i.dt[class]=list______timetmp=i.a[href]i.a[href]=http://__.ganji.com+tmpphonepage=urllib
2.urlopeni.a[href]phonesoup=BeautifulSoupphonepagephone=phonesoup.findAllattrs={class:phoneNum}tmp=phone
[0].img[src]phone
[0].img[src]=http://__.ganji.com+tmptag1=Tagsoupddtag1[class]=list______mji.insert8tag1text=strphone
[0].imgtag
1.insert1textprinti#i.dd.insert0strphone
[0].imgfp.write%s\n%idoc=/body/htmlfp.write%s\n%docfp.closeBeautifulSoup是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树parsetree它提供简单又常用的导航(n__igating),搜索以及修改剖析树的操作它可以大大节省你的编程时间BeautifulSoup中文文档地址本文来自CSDN__,转载请标明出处http://blog.csdn.net/keyunq/archive/2010/02/02/
5282174.aspxhttp://blog.csdn.net/keyunq/archive/2010/02/02/
5282174.aspxPython抓网页内容用Python语言写搜索引擎蜘蛛的脚本非常简单、轻松给大家__两种抓网页内容的方法
一、用urllib2/sgmllib包,将目标网页的所有URL列出importurllib2fromsgmllibimportSGMLParserclassURLListerSGMLParser: defresetself: SGMLParser.resetself self.urls=[] defstart_aselfattrs: href=[vforkvinattrsifk==href] ifhref: self.urls.extendhreff=urllib
2.urlopenhttp://___.donews.com/iff.code==200: parser=URLLister parser.feedf.read f.close forurlinparser.urls:printurl
二、用python调用IE抓取目标网页(Requirewin32compythoncom)的所有图像的url和大小importwin32com.clientpythoncomimporttimeie=win32com.client.DispatchExInternetExplorer.Application.1ie.Visible=1ie.N__igatehttp://news.sina.com.cnwhileie.Busy: time.sleep
0.05doc=ie.Documentforiindoc.i__ges: printi.srci.widthi.height这种方法可以利用IE本身的J__ascript.DHTML的支持,来做自动提交Form和处理J__ascript有关样例可以参考http://win32com.dehttp://win32com.de/Python爬虫1Python版简单网络爬虫URLLister类,负责从HTML文本中根据href标签提取URL,但也会提取一些垃圾URL,有待改进fromsgmllibimportSGMLParserclassURLListerSGMLParser:defresetself:SGMLParser.resetselfself.urls=[]defstart_aselfattrs:href=[vforkvinattrsifk==href]ifhref:self.urls.extendhrefgetURLurl用来将HTML中的url放入urls列表中importurlliburllisterdefgetURLurl:try:usock=urllib.urlopenurlex__pt:printgeturlex__ptonreturn[]parser=urllister.URLListerparser.feedusock.readusock.closeparser.closeurls=parser.urlsreturnurlsspiderstartURLdepth递归调用getURLurl,startURL为起始URL,depth为递归次数,及遍历的深度defspiderstartURLdepth:i=0globalnum#num为全局变量,用来记录打印的url的数目ifdepth=i:return0else:urls=getURLstartURLiflenurls0:forurlinurls:printurlnumnum=num+1spiderurldepth-1else:return0return1调用spidernum=0spiderhttp://___.xjtu.edu.cn/2运行结果得到962个url,不过其中有一些不符合URL格式的“假货”,比如“n__.phptype=2944”“http://gs.xjtu.edu.cn/zhaos/upload/files/462498fcd3d
35.doc285”等而且每次到.doc这里都会很费时间,可见这个“假货”处理速度很慢用正则表达式可以判断URL的合法性,待续……2小小的爬虫程序Python有一个urllib的库,可以很方便的从给定的url抓取网页,以下这段程序实现了抓取一个url并存到指定文件的功能 爬虫工作的基本原理就是,给定一个初始的url,下载这个url的网页,然后找出网页上所有满足下载要求的链接,然后把这些链接对应的url下载下来,然后再找下载下来的这些网页的url,我们可以用广度优先搜索实现这个算法,不过,首先得有一个函数找出网页上所有的满足要求的url,下面这个例子用正则表达式找出url. 最后就是广度优先搜索了,这个实现起来也很简单 __用上面的算法,感觉速度还行,1小时可以抓_____多网页,可以满足小型系统的要求3小爬虫
1.0----Spider.py--------#!/usr/local/bin/pythonfrommySpiderimport*def__in:mySpider=miniHTMLParserSite=mySpider.site_findforsinSite:mySpider.search_keyword=strs.contents
[27].contents
[0].stripdo__in=strs.contents
[1].contents
[0].striproot_url=strs.contents
[3].contents
[0].stripvariable_url=strs.contents
[5].contents
[0].stripi__ge_s__e_location=strs.contents
[7].contents
[0].stripi__ge_name_len=s.contents
[9].contents
[0]i__ge_name_len=inti__ge_name_len.striphtml_file=strs.contents
[11].contents
[0].stripxml_file=strs.contents
[25].contents
[0].stripdescription_index=strs.contents
[13].contents
[0].stripdescription_keyword=strs.contents
[15].contents
[0].stripname_index=strs.contents
[17].contents
[0].stripname_keyword=strs.contents
[19].contents
[0].stripi__ge_index=strs.contents
[21].contents
[0].stripi__ge_keyword=strs.contents
[23].contents
[0].striplink=root_url+variable_urlxmlist=[]#whilelink!=:whilelink!=root_url:print\nCheckinglinkdo__in+linkraw_html=mySpider.gethtmlfiledo__inlinkmySpider.raw_html=raw_htmlmySpider.encode=utf-8cleaned_html=mySpider.html_feed#GetContentclean_theater_name=mySpider.clean_htmlname_indexname_keywordclean_theater_description=mySpider.clean_htmldescription_indexdescription_keyword#S__eI__getry:i__ge_html_sour__=mySpider.soup_find_from_sour__i__ge_indexi__ge_keywordi__ge_url=mySpider.soup_find_img_srcdo__ini__ge_html_sour__i__ge_name=link[i__ge_name_len:].repla__=0i__ge_name=i__ge_name.repla__/i__ge_local=i__ge_s__e_location+do__in+i__ge_url[-4:]mySpider.s__e_i__gei__ge_namedo__ini__ge_urlex__pt:i__ge_url=Nonei__ge_local=Nonexmlist.appendtheater[nameclean_theater_namedescriptionclean_theater_descriptioni__ge_remotei__ge_urli__ge_locali__ge_local]mySpider.s__e_htmlhtml_filecleaned_htmlmySpider.feedcleaned_htmlnext_link=mySpider.get_next_linkifnext_link[0:1]!=/:next_link=root_url+next_linklink=next_linkmySpider.closeprint\ndone\nxml_input=Spider[Contentxmlist]mySpider.s__e_xmlxml_filexml_inputif__name__==____in__:__in---mySpider.py----#!/usr/local/bin/pythonimporthttplibimportsysimportrefrompyfoimportpyfoimporturllib2fromBeautifulSoupimportBeautifulSoupSoupStrainerBeautifulStoneSoupfromHTMLParserimportHTMLParserclassminiHTMLParserHTMLParser:viewedQueue=[]instQueue=[]search_keyword=encode=utf-8raw_html=config=config.xmldefget_next_linkself:ifself.instQueue==[]:returnelse:returnself.instQueue.pop0defgethtmlfileselfsitepage:try:httpconn=httplib.HTTPConnectionsitehttpconn.requestGETpageresp=httpconn.getresponseresppage=resp.readex__pt:resppage=returnresppagedefhandle_starttagselftagattrs:iftag==a:newstr=strattrs
[0]
[1]ifre.searchhttpnewstr==None:ifre.search__iltonewstr==None:ifre.searchself.search_keywordnewstr!=None:ifnewstrinself.viewedQueue==False:printaddingnewstrself.instQueue.appendnewstrself.viewedQueue.appendnewstrelse:printignoringnewstrelse:printignoringnewstrelse:printignoringnewstrdefclean_htmlselfindexkeyword:soup=self.get_souphtml_sour__=strsoup.findAllattrs={index:re.compilekeyword+$}clean_html_sour__=re.sub!:a\s|/a|![^]*html_sour__clean_html_sour__=clean_html_sour__.repla__\nclean_html_sour__=clean_html_sour__.repla__[clean_html_sour__=clean_html_sour__.repla__]clean_html_sour__=clean_html_sour__.stripreturnclean_html_sour__defclean_description_listselfindexkeyword:clean_description_list=[]clean_html_sour__=self.clean_htmlindexkeywordt=clean_html_sour__.split:forgint:g=g.strips=g.splitfortagins:iftag!=:tag=tag.striptag=tag[0:10]iftag!=ahref=/:description_list.appendtagreturnclean_description_listdefsoup_find_from_sour__selfindexkeyword:soup=self.get_souphtml_sour__=strsoup.findAllattrs={index:re.compilekeyword+$}returnhtml_sour__defsoup_find_img_srcselfdo__ini__ge_html_sour__:links=SoupStrainerimgi__ge_tag=BeautifulSoupi__ge_html_sour__parseOnlyThese=linksi__ge_link=i__ge_tag.contents
[0].attrs
[0]
[1]ifi__ge_link[0:4]!=http:i__ge_link=http://+do__in+i__ge_linkreturni__ge_linkdefs__e_xmlselfxml_filexml_input:xml_result=pyfoxml_inputpretty=Trueprolog=Trueencoding=utf-8xml=openxml_filewxml.writexml_result+\nxml.closedefs__e_htmlselfhtml_filehtml_input:html=openhtml_fileahtml.writehtml_inputhtml.closedefs__e_i__geselfimge_namedo__ini__ge_link:try:i__ge_connection=urllib
2.build_openeri__ge=i__ge_connection.openi__ge_linki__ge_sour__=i__ge.readfinal_i__ge_name=i__ge/+do__in+-+imge_name+i__ge_link[-4:]fout=openfinal_i__ge_namewbfout.writei__ge_sour__fout.closerespond=okex__pt:respond=returnresponddefhtml_feedself:soup=self.get_soupcleaned_html=soup.prettifyreturncleaned_htmldefget_soupself:soup=BeautifulSoupself.raw_htmlsoup.__str__self.encodereturnsoupdefload_configself:config=openself.configrconfig_xml=config.readxmlSoup=BeautifulStoneSoupconfig_xmlreturnxmlSoupdefsite_findself:siteSoup=self.load_configxmlSite=siteSoup.findAllsitereturnxmlSite-----Config.XML--------xmlversion=
1.0encoding=utf-8spidersitedo__in___.example
1.com.cn/do__inroot_url/movie//root_urlvariable_urltheater.asp/variable_urli__ge_s__e_locationi__ge//i__ge_s__e_locationi__ge_name_len-2/i__ge_name_lenhtml_fileCrawlingPage/____.html/html_filedescription_indexb__olor/description_indexdescription_keyword#2B2B2B/description_keywordtheater_indexb__olor/theater_indextheater_keyword#4B4B4B/theater_keywordi__ge_indexwidth/i__ge_indexi__ge_keyword169/i__ge_keywordxml_fileCrawingContent/____.xml/xml_filesearch_keywordtheater.asp/search_keyword/sitesitedo__in___.example.com/do__inroot_url/theater/intro/Bei___g//root_urlvariable_urlCHANGHONG//variable_urli__ge_s__e_locationi__ge//i__ge_s__e_locationi__ge_name_len-5/i__ge_name_lenhtml_fileCrawlingPage/mvgod.html/html_filedescription_indexclass/description_indexdescription_keyword__in/description_keywordname_indexclass/name_indexname_keywordnamezi/name_keywordi__ge_indexstyle/i__ge_indexi__ge_keywordfloat:right;__rgin:4px/i__ge_keywordxml_fileCrawingContent/mvgod.xml/xml_filesearch_keyword/theater/intro/Bei___g//search_keyword/site/spider4用python编写网络爬虫刚刚开了一个《计算机网络》的课,觉得很有用正好师兄让我练习编写一个能下载__网页的程序,正好能用上课上的知识了为了想作一个效率不差的,而下载网页的性能瓶颈是在网络上,所有决定用Python编写代码刚学python没几天,学习一种语言的最好方法就是写code.下面的是我用的多线程实现的网络爬虫,并用py2exe生成了一个exe,自身觉得py2exe不太好,又不会更好的,只能......这是我这些天的成果希望有人能提出好的建议,先谢谢了!一共两个文件,一个是toolbox_insight.py,是一个工具文件另一个是test.py,是一个用到toolbox_insight.py中工具的测试文件#FileName:toolbox_insight.pyfromsgmllibimportSGMLParserimportthreadingimporttimeimporturllib2importStringIOimportgzipimportstringimportos#rewriteSGMLParserforstart_aclassBasegeturlsSGMLParser:#这个Basegeturls类作用是分析下载的网页,把网页中的所有链接放在self.url中defresetself:self.url=[]SGMLParser.resetselfdefstart_aselfattrs:href=[vforkvinattrsifk==href]ifhref:self.url.extendhref#forquicklyfindingclassNewlistlist:#这个类其实是一个添加了find方法的LIST当num变量在LIST中,返回True当不在LIST中,返回False并把num按二分法插入LIST中deffindselfnum:l=lenselffirst=0end=l-1mid=0ifl==0:self.insert0numreturnFalsewhilefirstend:mid=first+end/2ifnumself[mid]:first=mid+1elifnumself[mid]:end=mid-1else:breakiffirst==end:ifself[first]num:self.insertfirstnumreturnFalseelifself[first]num:self.insertfirst+1numreturnFalseelse:returnTrueeliffirstend:self.insertfirstnumreturnFalseelse:returnTrue#下面的reptile顾名思义是一个爬虫classreptilethreading.Thread:#Name:是爬虫是名字,queue是任务队列,所有的爬虫共用同一个任务队列#从中取出一个任务项进行运行,每个任务项是一个要下载网页的URL#result:也是一个队列,将下载的网页中包含的URL放入该队列中#inittime:在本程序中没有用,只是一个为了以后扩展用的#downloadway:是下载的网页存放的路径#configfile:是配置文件,存放网页的URL和下载下后的路径#__xnum:每个爬虫有个最大下载量,当下载了这么多网页后,爬虫deaddef__init__selfNamequeueresultFlcokinittime=
0.00001downloadway=D:\\bbs\\configfile=D:\\bbs\\conf._____xnum=_____:threading.Thread.__init__selfname=Nameself.queue=queueself.result=resultself.Flcok=Flcokself.inittime=inittimeself.__inway=downloadwayself.configfile=configfileself.num=0#已下载的网页个数self.__xnum=__xnumos.__kedirsdownloadway+self.getName#系统调用在存放网页的文件夹中创建一个以该爬虫name为名字的文件夹self.way=downloadway+self.getName+\\defrunself:opener=urllib
2.build_opener#创建一个开启器whileTrue:url=self.queue.get#从队列中取一个URLifurl==None:#当取得一个None后表示爬虫结束工作,用于外部方便控制爬虫的生命期breakparser=Basegeturls#创建一个网页分析器request=urllib
2.Requesturl#网页请求request.add_headerAc__pt-encodinggzip#下载的方式是gzip压缩后的网页,gzip是大多数服务器支持的一种格式try:#这样可以减轻网络压力page=opener.openrequest#发送请求报文ifpage.code==200:#当请求成功predata=page.read#下载gzip格式的网页pdata=StringIO.StringIOpredata#下面6行是实现解压缩gzipper=gzip.GzipFilefileo__=pdatatry:data=gzipper.readex__ptIOError:printunusedgzipdata=predata#当有的服务器不支持gzip格式,那么下载的就是网页本身try:parser.feeddata#分析网页ex__pt:printIamhere#有的网页分析不了,如整个网页就是一个__foriteminparser.url:self.result.putitem#分析后的URL放入队列中way=self.way+strself.num+.html#下面的是网页的保存,不多说了self.num+=1file=openwaywfile.writedatafile.closeself.Flcok.acquireconfile=openself.configfileaconfile.writeway++url+\nconfile.closeself.Flcok.releasepage.closeifself.num=self.__xnum:#达到最大量后退出breakex__pt:printenderror#和爬虫一样是个线程类作用是将爬虫中的result中存入的URL加以处理只要同一个服务器的网页classproinsightthreading.Thread:def__init__selfqueuelisthomepageinqueue:threading.Thread.__init__selfself.queue=queue#和爬虫中的result队列是同一个self.list=list#是上面Newlist的对象self.homepage=homepage#主页self.inqueue=inqueue#处理完后的URL的去处defrunself:length=lenself.homepagewhileTrue:item=self.queue.getifitem==None:breakifitem[0:4]==\r\n:item=item[4:]ifitem[-1]==/:item=item[:-1]iflenitem=lenhttp://anditem[0:7]==http://:iflenitem=lengthanditem[0:length]==self.homepage:ifself.list.finditem==False:self.inqueue.putitemelifitem[0:5]==/j__aoritem[0:4]==j__a:passelse:ifitem
[0]!=/:item=/+itemitem=self.homepage+itemifself.list.finditem==False:self.inqueue.putitem下面的是一个主函数过程我下载的__是http://bbs.hit.edu.cn开始网页是http://bbs.hit.edu.cn/__inpage.php#FileName:testfromtoolbox_insightimport*fromQueueimportQueueimportthreadingimportsysnum=intraw_inputEnterthenumberofthread:pnum=intraw_inputEnterthenumberofdownloadpages:__inpage=strraw_inputThe__inpage:startpage=strraw_inputStartpage:queue=Queuekey=Queueinqueue=Queuelist=Newlistthlist=[]Flock=threading.RLockforiinrangenum:th=reptileth+striqueuekeyFlockthlist.appendthpro=proinsightkeylist__inpageinqueuepro.startforiinthlist:i.startqueue.putstartpageforiinrangepnum:queue.putinqueue.getforiinrangenum:queue.putNone个人觉得用wxpython来实现用户界面和用数据库知识查找URL是更好的扩展方向用python编写分布式爬虫
1、网络连接需要持续连接(persistentconnection),DNS解析的瓶颈(先查本地DNS缓存)实现方法:基于pythonhttplib(对http
1.1完成对持续连接的支持python的httplib完全支持http
1.1,如果不是http
1.1那么可以使用urlopen对其进行一次连接)并对其socket对象进行控制关键是加入对读取DNS本地缓存在我的机制下这个根本就不是主要问题可以暂时忽略,以及有settimeoutIgloo搞定就用setdefaulttimeout的支持或者利用自己的DNS服务器进行优化处理以及对sock对象的settimeout进行设置防止长时间的等待一个有可能连接不上的web服务器.要测试一下连接模块和DNS解析模块在访问不存在url在默认情况下的时间消耗对站点的ip解析出来后就直接用ip进行连接而避免了重复调用DNS解析.例子:socket.gethostbyname___.
163.com网络连接下载模块非常重要,需要精心反复测试,因为有可能碰到一些不规范的web服务器,如果没有加以考虑会使整个线程崩溃
2、多线程:机器任务的分配及站点任务的分配实现方法(在某台机器上实现,在对本机内存cpu的消耗情况判断后对机器任务进行分配;在对和站点的连接情况进行判断后对站点任务进行分配)机器任务的分配对于机器负担的情况调整在一个机器开的线程的个数(在关闭线程时注意要先让线程完成当前运行任务)站点任务的分配就是某个机器对一个站点开的线程的个数的分配(同样是要注意关闭线程时先让其完成当前任务)
3、对web文件树遍历过程更好的控制,对web文件树在广度优先遍历时层次的判断(整个网络是一个图,而某个站点的模型更接近于一棵树)实现方法在每个地址进入队列时加一个层次号,那么要遍历第n层的话那么遍历到第一个n+1就停止读取
4、利用robotparser解析robots.___
5、单个机器spider的作用a同2多线程3文件树的遍历b将获取的外部url发回__控制器,并从__控制器取回新的外部url
6、__控制器的作用a观察各机器的状态包括cpu、内存、线程、站点、网络流量b观察对外整体网络流量和连接状况,可以根据网络状况来调节timeoutc接受各个机器发送过来的外部url并对每个url的重复数字计数然后分配到各个机器(分配时要用爬行策略控制器对外部url进行排序来分配,Igloo利用PageRank,我们可以使用最简单的重复越多重要系数就越高来进行排序)d分布式URL分配算法Igloo
1.2的二级哈希映射算法(集中式分配算法那个__控制器容易成为系统瓶颈)复习哈希算法,还有就是对url是否访问过的判断(Igloo使用的是URLTrie滞后合并策略)可以使用BerkeleyDB作为URLTrie的替代品两种实现方式的比较i.现在的想法(面向站点,信息颗粒大)外部链接只是保存主机名比如:___.
163.com站内访问用解析好的ip地址维持连接,用相对链接来得到各个页面,这样就要维护一个外部链接列表,几个站点的链接列表优点节省内存,对某个站点的信息获取全面,对站点的出现频率统计,排序,重要站点先取缺点对链接的获取的全面性得不到保证,而且不能获取更多的重要页面,每个站点的重要页面也不会很多ii.老方案(面向页面,信息颗粒小)所有连接一视同仁缺点浪费资源,对单一站点的获取不一定全面优点可以得到全面的链接图,可以使用PageRank对列表进行排序,页面更重要就在最前面
7、解析html(超级链接的提取)搞定(用python的sgmllib)缺点速度太慢(可能会造成瓶颈,要好好包装好,以后有机会换掉它)5多线程实例viewplaincopytoclipboardprint#-*-coding:utf-8-*-importurllibhttplibimportthreadimporttimefromQueueimportQueueEmptyFullHEADERS={Content-type:application/x-___-form-urlencodedAc__pt-Language:zh-cnUser-Agent:Mozilla/
4.0compatible;MSIE
6.0;WindowsNT
5.0Ac__pt:text/plain}UNEXPECTED_ERROR=-1POST=POSTGET=GETdefbase_logmsg:printmsgdefbase_fail_optaskstatuslog:logfailop.task=%sstatus=%d%strtaskstatusdefget_remote_datatasksresultsfail_op=base_fail_oplog=base_log:whileTrue:task=tasks.gettry:tid=task[id]hpt=task[conn_args]#hpt=host:porttimeoutex__ptKeyErrore:logstrecontinuelogthread_%sdoingtask%d%thread.get_identtid#loghpt=+strhptconn=httplib.HTTPConnection**hpttry:params=task[params]ex__ptKeyErrore:params={}params=urllib.urlencodeparams#logparams=+paramstry:method=task[method]ex__ptKeyError:method=GET#logmethod=+methodtry:url=task[url]ex__ptKeyError:url=/#logurl=+urlheaders=HEADERStry:tmp=task[headers]ex__ptKeyErrore:tmp={}headers.updatetmp#logheaders=+strheadersheaders[Content-Length]=lenparamstry:ifmethod==POST:conn.requestmethodurlparamsheaderselse:conn.requestmethodurl+paramsresponse=conn.getresponseex__ptEx__ptione:logrequestfailed.method=%surl=%sparams=%sheaders=%s%methodurlparamsheaderslogstrefail_optaskUNEXPECTED_ERRORlogcontinueifresponse.status!=httplib.OK:fail_optaskresponse.statuslogcontinuedata=response.readresults.puttiddataTrueclassHttpPoolo__ect:def__init__selfthreads_countfail_oplog:self._tasks=Queueself._results=Queueforiinxrangethreads_count:thread.start_new_threadget_remote_dataself._tasksself._resultsfail_oplogdefadd_taskselftidhosturlparamsheaders={}method=GETtimeout=None:task={id:tidconn_args:{host:host}iftimeoutisNoneelse{host:hosttimeout:timeout}headers:headersurl:urlparams:paramsmethod:method}try:self._tasks.put_nowaittaskex__ptFull:returnFalsereturnTruedefget_resultsself:results=[]whileTrue:try:res=self._results.get_nowaitex__ptEmpty:breakresults.appendresreturnresultsdeftest_googletask_countthreads_count:hp=HttpPoolthreads_countbase_fail_opbase_logforiinxrangetask_count:ifhp.add_taski___.google.cn/search{q:lai}#method=POST:printaddtasksuc__ssed.whileTrue:results=hp.get_resultsifnotresults:time.sleep
1.0*random.randomforiinresults:printi
[0]leni
[1]#printunicodei
[1]gb18030if__name__==____in__:importsysrandomtask_countthreads_count=intsys.argv
[1]intsys.argv
[2]test_googletask_countthreads_count本文来自CSDN__,转载请标明出处http://blog.csdn.net/b2b160/archive/2009/02/19/
3906174.aspxhttp://blog.csdn.net/b2b160/archive/2009/02/19/
3906174.aspxPython如何使用urllib2获取网络资源urllib2是Python的一个获取URLsUniformResour__Locators的组件他以urlopen函数的形式提供了一个非常简单的接口,这是具有利用不同协议获取URLs的能力,他同样提供了一个比较复杂的接口来处理一般情况,例如基础验证,cookies代理和其他它们通过handlers和openers的对象提供urllib2支持获取不同格式的URLs在URL的:前定义的字串例如ftp是ftp:python.ort/的前缀它们利用它们相关网络协议例如FTPHTTP进行获取这篇教程__最广泛的应用--HTTP对于简单的应用,urlopen是非常容易使用的但当你在打开HTTP的URLs时遇到错误或异常,你将需要一些超文本传输协议HTTP的理解最权威的HTTP文档当然是RFC2616http://rfc.net/rfc
2616.html这是一个技术文档,所以并不易于阅读这篇HOWTO教程的目的是展现如何使用urllib2并提供足够的HTTP细节来帮助你理解他并不是urllib2的文档说明,而是起一个辅助作用获取URLs最简单的使用urllib2将如下所示Pythoncodeimporturllib2response=urllib
2.urlopenhttp://python.org/html=response.readurllib2的很多应用就是那么简单记住,除了http:URL同样可以使用ftp:file:等等来替代但这篇文章是教授HTTP的更复杂的应用HTTP是基于请求和应答机制的--客户端提出请求,服务端提供应答urllib2用一个Request对象来映射你提出的HTTP请求在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.readPythoncodeimporturllib2req=urllib
2.Requesthttp://___.voidspa__.org.ukresponse=urllib
2.urlopenreqthe_page=response.read记得urllib2使用相同的接口处理所有的URL头例如你可以像下面那样创建一个ftp请求Pythoncodereq=urllib
2.Requestftp://example.com/在HTTP请求时,允许你做额外的两件事首先是你能够发送data表单数据,其次你能够传送额外的关于数据或发送本身的信息metadata到服务器,此数据作为HTTP的headers来发送接下来让我们看看这些如何发送的吧Data数据有时候你希望发送一些数据到URL通常URL与CGI[通用__接口]脚本,或其他WEB应用程序挂接在HTTP中这个经常使用熟知的POST请求发送这个通常在你提交一个HTML表单时由你的浏览器来做并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序一般的HTML表单,data需要编码成标准形式然后做为data参数传到Request对象编码工作使用urllib的函数而非urllib2Pythoncodeimporturllibimporturllib2url=http://___.someserver.com/cgi-bin/register.cgivalues={name:MichaelFoordlocation:Northamptonlanguage:Python}data=urllib.urlencodevaluesreq=urllib
2.Requesturldataresponse=urllib
2.urlopenreqthe_page=response.read记住有时需要别的编码例如从HTML上传文件--看http://___.w
3.org/TR/REC-html40/interact/forms.html#h-
17.13HTMLSpecificationFormSubmission的详细说明如ugoni没有传送data参数,urllib2使用GET方式的请求GET和POST请求的不同之处是POST请求通常有副作用,它们会由于某种途径改变系统状态例如提交成堆垃圾到你的门口尽管HTTP标准说的很清楚POSTs通常会产生副作用,GET请求不会产生副作用,但没有什么可以阻止GET请求产生副作用,同样POST请求也可能不产生副作用Data同样可以通过在Get请求的URL本身上面编码来传送可看如下例子Pythoncodeimporturllib2importurllibdata={}data[name]=SomebodyHeredata[location]=Northamptondata[language]=Pythonurl_values=urllib.urlencodedataprinturl_valuesname=Somebody+Herelanguage=Pythonlocation=Northamptonurl=http://___.example.com/example.cgifull_url=url++url_valuesdata=urllib
2.openfull_urlHeaders我们将在这里讨论特定的HTTP头,来说明怎样添加headers到你的HTTP请求有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器默认的urllib2把自己作为“Python-urllib/x.y”x和y是Python主版本和次版本号例如Python-urllib/
2.5,这个身份可能会让站点迷惑,或者干脆不工作浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典下面的例子发送跟上面一样的内容,但把自身模拟成InternetExplorerPythoncodeimporturllibimporturllib2url=http://___.someserver.com/cgi-bin/register.cgiuser_agent=Mozilla/
4.0compatible;MSIE
5.5;WindowsNTvalues={name:MichaelFoordlocation:Northamptonlanguage:Python}headers={User-Agent:user_agent}data=urllib.urlencodevaluesreq=urllib
2.Requesturldataheadersresponse=urllib
2.urlopenreqthe_page=response.readresponse应答对象同样有两个很有用的方法看下面的节infoandgeturl,我们将看到当发生错误时会发生什么HandleEx__pti____理异常当urlopen不能够处理一个response时,产生urlError(不过通常的PythonAPIs异常如ValueErrorTypeError等也会同时产生)HTTPError是urlError的子类,通常在特定HTTPURLs中产生URLError通常,URLError在没有网络连接没有路由到特定服务器或者服务器不存在的情况下产生这种情况下,异常同样会带有reason属性,它是一个tuple,包含了一个错误号和一个错误信息例如Pythoncodereq=urllib
2.Requesthttp://___.pretend_server.orgtry:urllib
2.urlopenreqex__ptURLErrore:printe.reason4getaddrinfofailedHTTPError服务器上每一个HTTP应答对象response包含一个数字状态码有时状态码指出服务器无法完成请求默认的处理器会为你处理一部分这种应答例如:假如response是一个重定向,需要客户端从别的地址获取文档,urllib2将为你处理其他不能处理的,urlopen会产生一个HTTPError典型的错误包含404页面无法找到,403请求禁止,和401带验证请求请看RFC2616第十节有所有的HTTP错误码HTTPError实例产生后会有一个整型code属性,是服务器发送的相关错误号ErrorCodes错误码因为默认的处理器处理了重定向300以外号码,并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码BaseHTTPServer.BaseHTTPRequestHandler.response是一个很有用的应答号码字典,显示了RFC2616使用的所有的应答号这里为了方便重新展示该字典(译者略)当一个错误号产生后,服务器返回一个HTTP错误号,和一个错误页面你可以使用HTTPError实例作为页面返回的应答对象response这表示和错误属性一样,它同样包含了readgeturl和info方法Pythoncodereq=urllib
2.Requesthttp://___.python.org/fish.htmltry:urllib
2.urlopenreqex__ptURLErrore:printe.codeprinte.read404!DOCTYPEhtmlPUBLIC-//W3C//DTDHTML
4.01Transitional//EN http://___.w
3.org/TR/html4/loose.dtdxml-stylesheethref=./css/ht2html.css type=text/csshtmlheadtitleError404:FileNotFound/title......etc...WrappingitUp包装所以如果你想为HTTPError或URLError做准备,将有两个基本的办法我则比较喜欢第二种第一个Pythoncodefromurllib2importRequesturlopenURLErrorHTTPErrorreq=Requestsomeurltry:response=urlopenreqex__ptHTTPErrore:printTheservercouldn\tfulfilltherequest.printErrorcode:e.codeex__ptURLErrore:printWefailedtoreachaserver.printReason:e.reasonelse:#everythingisfine注意ex__ptHTTPError必须在第一个,否则ex__ptURLError将同样接受到HTTPError第二个Pythoncodefromurllib2importRequesturlopenURLErrorreq=Requestsomeurltry:response=urlopenreqex__ptURLErrore:ifhasattrereason:printWefailedtoreachaserver.printReason:e.reasonelifhasattrecode:printTheservercouldn\tfulfilltherequest.printErrorcode:e.codeelse:#everythingisfineinfoandgeturlurlopen返回的应答对象response或者HTTPError实例有两个很有用的方法info和geturlgeturl--这个返回获取的真实的URL,这个很有用,因为urlopen或者opener对象使用的或许会有重定向获取的URL或许跟请求URL不同info--这个返回对象的字典对象,该字典描述了获取的页面情况通常是服务器发送的特定头headers目前是httplib.HTTPMessage实例经典的headers包含Content-length,Content-type,和其他查看QuickReferen__toHTTPHeadershttp://___.cs.tut.fi/~jkorpela/http.html获取有用的HTTP头列表,以及它们的解释意义Openers和Handlers当你获取一个URL你使用一个opener一个urllib
2.OpenerDirector的实例,urllib
2.OpenerDirector可能名字可能有点让人混淆正常情况下,我们使用默认opener--通过urlopen但你能够创建个性的openers,Openers使用处理器handlers,所有的“繁重”工作由handlers处理每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面,例如HTTP重定向或者HTTPcookies如果你希望用特定处理器获取URLs你会想创建一个openers,例如获取一个能处理cookie的opener,或者获取一个不重定向的opener要创建一个opener实例化一个OpenerDirector,然后调用不断调用.add_handlersome_handler_instan__.同样,可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况install_opener用来创建(全局)默认opener这个表示调用urlopen将使用你__的openerOpener对象有一个open方法,该方法可以像urlopen函数那样直接用来获取urls通常不必调用install_opener,除了为了方便#includestdio.h#includecurl/curl.h#includecurl/types.h/*newforv7*/#includecurl/easy.h/*newforv7*/////这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的//完成数据保存功能size_tmy_write_funcvoid*ptrsize_tsizesize_t__embFILE*stream{returnfwriteptrsize__embstream;}//这个函数是为了符合CURLOPT_READFUNCTION而构造的//数据上传时使用size_tmy_read_funcvoid*ptrsize_tsizesize_t__embFILE*stream{returnfreadptrsize__embstream;}//这个函数是为了符合CURLOPT_PROGRESSFUNCTION而构造的//显示文件传输进度,t代表文件大小,d代表传输已经完成部分intmy_progress_funcFILE*outdoublet/*dltotal*/doubled/*dlnow*/doubleultotaldoubleulnow{fprintfout%d/%d%d%%\nintdinttintd*
100.0/t;return0;}void*my_threadvoid*ptr{CURL*curl;CURLcoderes;FILE*outfile;char*url=ptr;curl=curl_easy_init;ifcurl{outfile=fopenbaidu.htmlw;curl_easy_setoptcurlCURLOPT_URLurl;curl_easy_setoptcurlCURLOPT_WRITEDATAoutfile;curl_easy_setoptcurlCURLOPT_WRITEFUNCTIONmy_write_func;curl_easy_setoptcurlCURLOPT_READFUNCTIONmy_read_func;curl_easy_setoptcurlCURLOPT_NOPROGRESS0L;curl_easy_setoptcurlCURLOPT_PROGRESSFUNCTIONmy_progress_func;curl_easy_setoptcurlCURLOPT_PROGRESSDATAstdout;res=curl_easy_performcurl;fcloseoutfile;/*alwayscleanup*/curl_easy_cleanupcurl;}returnNULL;}int__inintar__char**argv{my_thread___.baidu.com;return0;}。