用BeautifulSoup抓站的总结与思考

来源:互联网 发布:域名注册需要身份证 编辑:程序博客网 时间:2024/05/22 15:08

   Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间;它是用Python语言写的一个HTML/XML的解析器,可以很好的处理不规范标记并生成剖析树(parse tree)。它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。

本文主要是记录一下笔者最近的一个项目:做一个211大学的搜索引擎,而做搜索引擎最关键的环节之一(我认为是最关键的)是建立索引,而建索引最关键的是要有数据。于是我们采用的是BeautifulSoup来抓取211大学相关的信息,211大学的名单时必须要抓的,抓取数据就要对目标网站就行url和html源码的分析,在此啰嗦一句,用开发者工具可以非常方便且快捷的进行这一步,用谷歌浏览器会是一个不错的选择。根据url和html的规律,方便用循环一次就抓下所有有用的数据,以下代码段是笔者的小组抓取各个大学在所有省市从2005年到2013年的所有录取分数线信息的核心代码:

#coding=gbkfrom __future__ import print_functionimport urllib2import sysfrom bs4 import BeautifulSoupreload(sys)sys.setdefaultencoding( "gbk" )strFile = 'book1' + '.txt'f = open(strFile, 'w')kbs=['34','35']dxs=['31','1217','46','140','38','144','832','48','591','831','556','557','43','49','52','39','53','566','569','45','866','143','47','30','558','40','830','1006','2775','59',     '110','116','86','113','117','112','77','118','115','114','63','66','67','102','103','108','126','1219','61','1457','120','62','42','414','127','128','121','417','420','123',     '60','78','41','1218','139','32','138','134','33','50','122','142','129','419','34','124','137','132','73','125','75','133','131','136','130','76','936','111','109',     '44','58','939','104','105','106','98','96','504','119','934','99','51','661','101','100','935','35','364','330','36','57','332','334','107','937','97','367','544','74','199']for daxue in dxs: if(daxue=='31'):dx='北京大学' elif(daxue=='1217'):dx='北京大学医学部' elif(daxue=='46'):dx='中国民族大学' elif(daxue=='140'):dx='清华大学' elif(daxue=='38'):dx='北京交通大学' elif(daxue=='144'):dx='北京科技大学' elif(daxue=='832'):dx='中国石油大学(北京)' elif(daxue=='48'):dx='北京邮电大学' elif(daxue=='591'):dx='华北电力大学保定校区' elif(daxue=='831'):dx='华北电力大学' elif(daxue=='556'):dx='北京化工大学' elif(daxue=='557'):dx='中国农业大学' elif(daxue=='43'):dx='北京林业大学' elif(daxue=='49'):dx='北京中医药大学' elif(daxue=='52'):dx='北京师范大学' elif(daxue=='39'):dx='北京外国语大学' elif(daxue=='53'):dx='对外经济贸易大学' elif(daxue=='566'):dx='中央财经大学' elif(daxue=='569'):dx='中国政法大学' elif(daxue=='45'):dx='中央民族大学' elif(daxue=='866'):dx='北京体育大学' elif(daxue=='143'):dx='北京理工大学' elif(daxue=='47'):dx='北京航空航天大学' elif(daxue=='30'):dx='北京工业大学' elif(daxue=='558'):dx='中国传媒大学' elif(daxue=='40'):dx='中央音乐大学' elif(daxue=='830'):dx='中国地质大学' elif(daxue=='1006'):dx='中国矿业大学(北京)' elif(daxue=='2775'):dx='中国人民财政金融学院' elif(daxue=='59'):dx='南开大学' elif(daxue=='110'):dx='中国矿业大学' elif(daxue=='116'):dx='河海大学' elif(daxue=='86'):dx='江南大学' elif(daxue=='113'):dx='南京农业大学' elif(daxue=='117'):dx='中国药科大学' elif(daxue=='112'):dx='南京理工大学' elif(daxue=='77'):dx='南京航空航天大学' elif(daxue=='118'):dx='苏州大学' elif(daxue=='115'):dx='南京师范大学' elif(daxue=='114'):dx='浙江大学' elif(daxue=='63'):dx='合肥工业大学' elif(daxue=='66'):dx='中国科学技术大学' elif(daxue=='67'):dx='安徽大学' elif(daxue=='102'):dx='厦门大学' elif(daxue=='103'):dx='福州大学' elif(daxue=='108'):dx='南昌大学' elif(daxue=='126'):dx='山东大学' elif(daxue=='1219'):dx='山东大学威海分校' elif(daxue=='61'):dx='中国海洋大学' elif(daxue=='1457'):dx='哈尔滨工业大学(威海)' elif(daxue=='120'):dx='中国石油大学' elif(daxue=='62'):dx='郑州大学' elif(daxue=='42'):dx='武汉大学' elif(daxue=='414'):dx='中南财经政法大学' elif(daxue=='127'):dx='华中科技大学' elif(daxue=='128'):dx='武汉理工大学' elif(daxue=='121'):dx='中国地质大学' elif(daxue=='417'):dx='华中农业大学' elif(daxue=='420'):dx='华中师范大学' elif(daxue=='123'):dx='中南大学' elif(daxue=='60'):dx='天津大学' elif(daxue=='78'):dx='天津医科大学' elif(daxue=='41'):dx='河北工业大学' elif(daxue=='1218'):dx='东北大学秦皇岛分校' elif(daxue=='139'):dx='太原理工大学' elif(daxue=='32'):dx='内蒙古大学' elif(daxue=='138'):dx='大连理工大学' elif(daxue=='134'):dx='东北大学' elif(daxue=='33'):dx='大连海事大学' elif(daxue=='50'):dx='辽宁大学' elif(daxue=='122'):dx='吉林大学' elif(daxue=='142'):dx='东北师范大学' elif(daxue=='129'):dx='延边大学' elif(daxue=='419'):dx='东北林业大学' elif(daxue=='34'):dx='哈尔滨工业大学' elif(daxue=='124'):dx='哈尔滨工程大学' elif(daxue=='137'):dx='东北农业大学' elif(daxue=='132'):dx='复旦大学' elif(daxue=='73'):dx='同济大学' elif(daxue=='125'):dx='上海交通大学' elif(daxue=='75'):dx='上海交通大学医学院' elif(daxue=='133'):dx='东华大学' elif(daxue=='131'):dx='华东师范大学' elif(daxue=='136'):dx='上海外国语大学' elif(daxue=='130'):dx='上海财经大学' elif(daxue=='76'):dx='上海大学' elif(daxue=='936'):dx='解放军第二军医大学' elif(daxue=='111'):dx='南京大学' elif(daxue=='109'):dx='东南大学' elif(daxue=='44'):dx='湖南大学' elif(daxue=='58'):dx='湖南师范大学' elif(daxue=='939'):dx='中国人民解放军国防科学技术大学' elif(daxue=='104'):dx='中山大学' elif(daxue=='105'):dx='华南理工大学' elif(daxue=='106'):dx='暨南大学' elif(daxue=='98'):dx='华南师范大学' elif(daxue=='96'):dx='广西大学' elif(daxue=='504'):dx='海南大学' elif(daxue=='119'):dx='重庆大学' elif(daxue=='934'):dx='西南大学' elif(daxue=='99'):dx='四川大学' elif(daxue=='52'):dx='西南交通大学' elif(daxue=='661'):dx='电子科技大学' elif(daxue=='101'):dx='西南财经大学' elif(daxue=='100'):dx='四川农业大学' elif(daxue=='935'):dx='贵州大学' elif(daxue=='35'):dx='云南大学' elif(daxue=='364'):dx='西藏大学' elif(daxue=='330'):dx='西安交通大学' elif(daxue=='36'):dx='长安大学' elif(daxue=='57'):dx='西安电子科技大学' elif(daxue=='332'):dx='西北农林科技大学' elif(daxue=='334'):dx='陕西师范大学' elif(daxue=='107'):dx='西北工业大学' elif(daxue=='937'):dx='解放军第四军医大学' elif(daxue=='97'):dx='兰州大学' elif(daxue=='367'):dx='青海大学' elif(daxue=='544'):dx='宁夏大学' elif(daxue=='74'):dx='新疆大学' elif(daxue=='199'):dx='石河子大学'# f.write(dx+'\n') for area in range(0,32):   if(area<10):     strarea='0'+str(area)   else:     strarea=str(area)   if(area==0):an='上海'   elif(area==1):an='云南'   elif(area==2):an='内蒙古'   elif(area==3):an='北京'   elif(area==4):an='吉林'   elif(area==5):an='四川'   elif(area==6):an='天津'   elif(area==7):an='宁夏'   elif(area==8):an='安徽'   elif(area==9):an='山东'   elif(area==10):an='山西'   elif(area==11):an='广东'   elif(area==12):an='广西'   elif(area==13):an='新疆'   elif(area==14):an='江苏'   elif(area==15):an='江西'   elif(area==16):an='河北'   elif(area==17):an='河南'   elif(area==18):an='浙江'   elif(area==19):an='海南'   elif(area==20):an='香港'   elif(area==21):an='湖北'   elif(area==22):an='湖南'   elif(area==23):an='甘肃'   elif(area==24):an='福建'   elif(area==25):an='西藏'   elif(area==26):an='贵州'   elif(area==27):an='辽宁'   elif(area==28):an='重庆'   elif(area==29):an='陕西'   elif(area==30):an='青海'   elif(area==31):an='黑龙江'  # f.write(','+an+'\n')。。。。。
 抓此类的信息,根本不需要什么技术上的要求,而我们小组也是得益于此。而诸如某些需要登录和填写表单的网站对技术要求就很高,因为没有接触到,于是在此不涉及。

以下代码片是为了抓取高考参考系统网站的大学名单:

#coding=gbkfrom __future__ import print_functionimport urllib2import sysfrom bs4 import BeautifulSoupreload(sys)sys.setdefaultencoding( "gbk" )strFile='dxmd'+'.csv'f=open(strFile,'w')for pa in range(1,14): url="http://gkcx.eol.cn/soudaxue/queryschool.html?schoolflag=211%E5%B7%A5%E7%A8%8B&page="+str(pa) page=urllib2.urlopen(url) soup=BeautifulSoup(page) md=soup.find(attrs={"class":"white_border","id":"queryschoolad"}) for trs in md.find_all('tr'):    tds=trs.find_all_next('td')    for link in tds[1].find_all('a'):     dxname=link['title']     lianjie=link['href']     diqu=tds[2].text     lb=tds[3]['title']     shx1=tds[7].text     duibilj=tds[7].a['href']     f.write(dxname+','+'gkcx.eol.cn'+lianjie+','+diqu+','+lb+','+shx1+','+'gkcx.eol.cn'+duibilj+'\n')print("done",end='')f.close()print("\nover")
  对于这些设计比较清楚,条理明了,结构清晰并且规律性强的网站来说,确实是一个不小的惊喜;而在具体的抓站过程中,不管网站的设计如何,都有一定的技巧和更加便捷的方法,比如对于大学名单这段代码来说,大学名的连接只有后面部分,而把前面相同的域名‘gkcx.eol.cn’给省略掉了,于是得自己在f.write('....')里面加上,要不然最后建立索引的时候会很麻烦。突然又想到网上关于BeautifulSoup的资料确实有限,要么就是不够基础,而学校偌大的图书馆也找不到一本关于beautifulsoup的书,虽然它只是python的一个小小的工具而已,不过它确实给了我们极大的帮助。

关于用beautifulsoup抓站的思考,其实最重要的一句就是:找到目标网站(根据项目要求)、多看看网站的url,分析源码、找到规律、最后分析一下用循环就万事大吉了。


1 0
原创粉丝点击