Selenium获取百度百科旅游景点的InfoBox消息盒

news2024/12/25 13:52:02

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

源代码

# coding=utf-8    
"""  
Created on 2015-09-04 @author: Eastmount   
"""    
    
import time            
import re            
import os    
import sys  
import codecs  
from selenium import webdriver        
from selenium.webdriver.common.keys import Keys        
import selenium.webdriver.support.ui as ui        
from selenium.webdriver.common.action_chains import ActionChains    
    
#Open PhantomJS    
driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")    
#driver = webdriver.Firefox()    
wait = ui.WebDriverWait(driver,10)  
global info #全局变量  
  
#Get the infobox of 5A tourist spots    
def getInfobox(name):    
    try:    
        #create paths and txt files  
        global info  
        basePathDirectory = "Tourist_spots_5A"    
        if not os.path.exists(basePathDirectory):    
            os.makedirs(basePathDirectory)    
        baiduFile = os.path.join(basePathDirectory,"BaiduSpider.txt")    
        if not os.path.exists(baiduFile):    
            info = codecs.open(baiduFile,'w','utf-8')    
        else:    
            info = codecs.open(baiduFile,'a','utf-8')    
        
        #locate input  notice: 1.visit url by unicode 2.write files    
        print name.rstrip('\n') #delete char '\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)  
        print driver.current_url  
        print driver.title  
    
        #load infobox basic-info cmn-clearfix  
        elem_name = driver.find_elements_by_xpath("//div[@class='basic-info cmn-clearfix']/dl/dt")    
        elem_value = driver.find_elements_by_xpath("//div[@class='basic-info cmn-clearfix']/dl/dd")  
        for e in elem_name:  
            print e.text  
        for e in elem_value:  
            print e.text  
  
    
        #create dictionary key-value  
        #字典是一种散列表结构,数据输入后按特征被散列,不记录原来的数据,顺序建议元组  
        elem_dic = dict(zip(elem_name,elem_value))   
        for key in elem_dic:    
            print key.text,elem_dic[key].text    
            info.writelines(key.text+" "+elem_dic[key].text+'\r\n')    
        time.sleep(5)    
            
    except Exception,e: #'utf8' codec can't decode byte    
        print "Error: ",e    
    finally:    
        print '\n'    
        info.write('\r\n')    
    
#Main function    
def main():  
    global info  
    #By function get information     
    source = open("Tourist_spots_5A_BD.txt",'r')    
    for name in source:    
        name = unicode(name,"utf-8")    
        if u'故宫' in name: #else add a '?'    
            name = u'北京故宫'    
        getInfobox(name)    
    print 'End Read Files!'    
    source.close()    
    info.close()    
    driver.close()    
    
main()  

​​​​​​

运行结果


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

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

对应源码


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


编码问题


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

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

import codecs  
  
#用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode  
if not os.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? 
       最后希望文章对你有所帮助,还有一篇基础介绍文章,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1120809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

邻接表存储图或者树

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。 介绍 每个顶点都作为头节点,并且存在一个一维数组中h[N]。树就是相当于一种有向图…

进阶高级,接口+接口自动化测试疑难解答,一篇带你策底打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、你们做接口测试…

MapReduce编程:join操作和聚合操作

文章目录 MapReduce 编程:join操作和聚合操作一、实验目标二、实验要求及注意事项三、实验内容及步骤 附:系列文章 MapReduce 编程:join操作和聚合操作 一、实验目标 理解MapReduce计算框架的分布式处理工作流程掌握用mapreduce计算框架实现…

python调用astra进行人脸检测(使用CascadeClassifier)

1、简述 方法:使用opecv中,CascadeClassifier 级联分类器实现人脸检测,CascadeClassifier就是opencv下objdetect模块中用来做目标检测的级联分类器的一个类,它可以帮助我们检测例如车牌、眼睛、人脸等物体。它的大概原理就是判别…

C++17中std::string_view的使用

为了解决std::string初始化(或拷贝)成本高昂的问题,C17引入了std::string_view。std::string_view提供对现有字符串(C风格字符串、std::string、或另一个std::string_view)的只读访问,而无需进行拷贝。当想要有效地处理和操作字符串而不修改它们时&#…

用python计算积分

先安装这个包 pip install scipy运行 import tkinter as tk from scipy.integrate import quad# 创建主窗口 root tk.Tk() root.title("积分计算器")# 定义计算积分的函数 def calculate_integral():# 获取用户输入的函数表达式function function_entry.get()# 获…

2023年最全的外贸建站新手教程

凡做外贸的,我相信在过去几年中通过亚马逊、速卖通等电商平台上都取得了一定的成功。然而,近年来电商平台上的竞争激烈,利润空间有限,流量获取困难和昂贵,这对许多外贸从业者造成了困扰。因此,为了减少对平…

分析概览 文章管理 草稿管理 图片管理 站点管理 主站 关于 登出 手写操作系统项目----进程

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。 这里记录了,手写操作系统项目中关于进程的部分。 进程四要素 首先进程有四要素。 …

golang 八股文整理

目录 进程、线程、协程Go 的垃圾回收机制GC 的触发条件GC 的调优GMP 调度和 CSP 模型Goroutine 的调度原理Goroutine 的切换时机Context 结构原理Context 工作原理Context 使用场景Golang 的内存分配机制竞态问题内存逃逸golang 内存对齐机制golang 中 new 和 make 的区别&…

数二思维导图

高数上 第一章:函数、极限、连续 函数 函数的单调性、周期性、奇偶性复合函数 极限 求直接代入型的极限求∞∞型的极限用等价无穷小代换求00型的极限用洛必达法则求00型或∞∞型的极限求∞•0型的极限求幂指函数的极限函数的左右极限及需要求左右极限的情形极限的…

还不知道光场相机吗?

1.什么是光场? 光场(light field):就是指光在每一个方向通过每一个点的光量。 从概念里,你至少可以得到两点信息: 光场包含光的方向光场包含一个点的光量 2.什么是光场相机 我们知道普通的相机拍照成像…

Parallels Client for Mac:改变您远程控制体验的革命性软件

在当今数字化的世界中,远程控制软件已经成为我们日常生活和工作中不可或缺的一部分。在众多远程控制软件中,Parallels Client for Mac以其独特的功能和出色的性能脱颖而出,让远程控制变得更加简单、高效和灵活。 Parallels Client for Mac是…

Redis的五种常用(基本)数据类型

目录 1、Redis简介 2、五种常用(基本)数据类型 2.1 String 数据结构 ⭐常用用法 举例(Linux版本) 2.2 List 数据结构 ⭐常用用法 举例(Linux版本) 2.3 Set 数据结构 ⭐常用用法 举例&#xf…

【未完待续】计算机组成与体系结构第三次试验:微程序控制器实验

计算机组成与体系结构第三次试验:微程序控制器实验 前言一、实验目的二、实验内容三、实验器件四、实验原理五、 实验步骤六、 实验结果七、思考题 前言 为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供…

机器学习中的核方法

一、说明 线性模型很棒,因为它们易于理解且易于优化。他们受苦是因为他们只能学习非常简单的决策边界。神经网络可以学习更复杂的决策边界,但失去了线性模型良好的凸性特性。 使线性模型表现出非线性的一种方法是转换输入。例如,通过添加特征…

BetaFlight飞控AOCODAF435V2MPU6500固件编译

BetaFlight飞控AOCODAF435V2MPU6500固件编译 1. 源由2. 准备2.1 板子2.2 代码2.3 工具 3. 配置修改4. 编译4.1 获取代码4.2 获取配置4.3 编译固件4.4 DFU烧录4.5 版本核对 5. 总结 1. 源由 刚拿到一块Aocoda F405V2 (MPU6500) AT32F435飞控板(替换主控芯片)。 Aocoda-RC F40…

unity中方向的两种表示:欧拉角和四元数

欧拉角:简单来说就是你可以选择 0度~360度 的范围 四元数:在计算机图像学中,四元数用于物体的旋转,是一种复杂,但效率较高的旋转方式 Quaternion结构体代表一个四元数,包含一个标量和一个三维向量&#x…

02、Python 字符串

目录 字符串的基础用法字符串包含引号字符串拼接获取用户输入长字符串原始字符串字节串字符串与字节串转换 字符串的基础用法 列字符串的内容几乎可以包含任何字符,英文字符也行,中文字符也行。 既可用单引号,也可用双引号 字符串包含引号…

函数和执行上下文

一.变量提升与函数提升 变量提升:通过var关键字定义(声明)的变量,在定义语句之前就可以访问到,只不过其值是undefined 函数提升:通过function声明的函数,在之前就可以调用,值是函数…