前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(InfoBox),这也是毕业设计实体对齐和属性的对齐的语料库前期准备工作。希望文章对你有所帮助~

源代码

#coding=utf-8"""Createdon2015-09-04@author:Eastmount"""importtimeimportreimportosimportsysimportcodecsfromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysimportselenium.webdriver.support.uiasuifromselenium.webdriver.common.action_chainsimportActionChains#OpenPhantomJSdriver=webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")#driver=webdriver.Firefox()wait=ui.WebDriverWait(driver,10)globalinfo#全局变量#Gettheinfoboxof5AtouristspotsdefgetInfobox(name):try:#createpathsandtxtfilesglobalinfobasePathDirectory="Tourist_spots_5A"ifnotos.path.exists(basePathDirectory):os.makedirs(basePathDirectory)baiduFile=os.path.join(basePathDirectory,"BaiduSpider.txt")ifnotos.path.exists(baiduFile):info=codecs.open(baiduFile,'w','utf-8')else:info=codecs.open(baiduFile,'a','utf-8')#locateinputnotice:1.visiturlbyunicode2.writefilesprintname.rstrip('\n')#deletechar'\n'driver.get("http://baike.baidu.com/")elem_inp=driver.find_element_by_xpath("//form[@id='searchForm']/input")elem_inp.send_keys(name)elem_inp.send_keys(Keys.RETURN)info.write(name.rstrip('\n')+'\r\n')#codecs不支持'\n'换行time.sleep(2)printdriver.current_urlprintdriver.title#loadinfoboxbasic-infocmn-clearfixelem_name=driver.find_elements_by_xpath("//div[@class='basic-infocmn-clearfix']/dl/dt")elem_value=driver.find_elements_by_xpath("//div[@class='basic-infocmn-clearfix']/dl/dd")foreinelem_name:printe.textforeinelem_value:printe.text#createdictionarykey-value#字典是一种散列表结构,数据输入后按特征被散列,不记录原来的数据,顺序建议元组elem_dic=dict(zip(elem_name,elem_value))forkeyinelem_dic:printkey.text,elem_dic[key].textinfo.writelines(key.text+""+elem_dic[key].text+'\r\n')time.sleep(5)exceptException,e:#'utf8'codeccan'tdecodebyteprint"Error:",efinally:print'\n'info.write('\r\n')#Mainfunctiondefmain():globalinfo#Byfunctiongetinformationsource=open("Tourist_spots_5A_BD.txt",'r')fornameinsource:name=unicode(name,"utf-8")ifu'故宫'inname:#elseadda'?'name=u'北京故宫'getInfobox(name)print'EndReadFiles!'source.close()info.close()driver.close()main()

​​​​​​

运行结果

主要通过从F盘中txt文件中读取国家5A级景区的名字,再调用Phantomjs.exe浏览器依次访问获取InfoBox值。同时如果存在编码问题“’ascii’ codec can’t encode characters”则可通过下面代码设置编译器utf-8编码,代码如下:

#设置编码utf-8importsysreload(sys)sys.setdefaultencoding('utf-8')#显示当前默认编码方式printsys.getdefaultencoding()

对应源码

其中对应的百度百科InfoBox源代码如下图,代码中基础知识可以参考我前面的博文或我的Python爬虫专利,Selenium不仅仅擅长做自动测试,同样适合做简单的爬虫。

编码问题

此时你仍然可能遇到“’ascii’ codec can’t encode characters”编码问题。

它是因为你创建txt文件时默认是ascii格式,此时你的文字确实’utf-8’格式,所以需要转换通过如下方法。

importcodecs#用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicodeifnotos.path.exists(baiduFile):info=codecs.open(baiduFile,'w','utf-8')else:info=codecs.open(baiduFile,'a','utf-8')#该方法不是io故换行是'\r\n'info.writelines(key.text+":"+elem_dic[key].text+'\r\n')

总结

你可以代码中学习基本的自动化爬虫方法、同时可以学会如何通过for循环显示key-value键值对,对应的就是显示的属性和属性值,通过如下代码实现:

elem_dic = dict(zip(elem_name,elem_value))

但最后的输出结果不是infobox中的顺序,why” />最后希望文章对你有所帮助,还有一篇基础介绍文章,