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

 前面我讲述过如何通过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.mzph.cn/news/116581.shtml

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

相关文章

Linux下的命令行参数和环境变量

命令行参数 什么是命令行参数 命令行参数是指在执行命令行程序时&#xff0c;给程序传递的额外参数。在Linux终端中&#xff0c;命令行参数通常通过在命令后面添加空格分隔的参数来传递。 Linux下以main函数举例说明 #include<stdio.h>int main(int argc char* argv[])…

C++入门(3):引用,内联函数

一、引用 1.1 引用特性 引用必须初始化 一个变量可以有多个引用 引用一旦引用一个实体&#xff0c;就不能引用其他实体 int main() {int a 10, C 20;int& b a;b c; // 赋值&#xff1f;还是b变成c的别名&#xff1f;return 0; }1.2 常引用 引用权限可以平移或缩小…

MySQL实践——分页查询优化

问题现象 一个客户业务系统带有分页查询功能&#xff0c;但是随着查询页数的增加&#xff0c;越往后查询性能越差&#xff0c;有时一个查询可能需要1分钟左右的时间。分页查询的写法类似于&#xff1a; select * from employees limit 250000,5000;这是最传统的一种分页查询写…

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

GB28181学习(十一)——控制(PTZ、镜头、光圈等控制)

要求 源设备向目标设备发送控制命令&#xff0c;控制命令类型包括&#xff1a; 摄像机云台控制远程启动录像控制报警布防/撤防报警复位强制关键帧拉框放大/缩小看守位控制PTZ精准控制存储卡格式化目标跟踪软件升级设备配置 设备配置的内容包括&#xff1a; 基本参数视频参数范…

React TypeScript安装npm第三方包时,些包并不是 TypeScript 编写的

npm install types/包名称 例如&#xff1a;npm install types/jquery 学习链接

QSPI介绍

0 Preface/Foreword 1 QSPI介绍

Python 编程语言的介绍

Python 是一种高级、动态类型的解释型语言。由 Guido van Rossum 于1989年底发明&#xff0c;并在1991年首次发布。Python 的设计哲学强调代码的可读性和简洁的语法&#xff0c;特别是使用缩进来表示代码块&#xff0c;这使得开发者能够用更少的代码表达想法。 基础概念: 语法…

shell_38.Linux读取脚本名

读取脚本名 (1)示例 $ cat positional0.sh #!/bin/bash # Handling the $0 command-line parameter # echo This script name is $0. exit $ $ bash positional0.sh This script name is positional0.sh. $ (2)如果使用另一个命令来运行 shell 脚本&#xff0c;则命令…

Win10下基于VS2015编译SQLite3源码

一、下载SQLite SQLite SQLite Download Page 下载红框部分的3个文件 提示&#xff1a;这里有个 sglite-autoconf-3420000.tar.gz 是免编译版&#xff0c;想省事就下载这个&#xff0c;但我自己用这个老是编译不过 所以我这里不推荐这个了 二、配置SQLite 打开vs 2015或者其他…

Android Kotlin 协程初探 | 京东物流技术团队

1 它是什么&#xff08;协程 和 Kotlin协程&#xff09; 1.1 协程是什么 维基百科&#xff1a;协程&#xff0c;英文Coroutine [kəru’tin] &#xff08;可入厅&#xff09;&#xff0c;是计算机程序的一类组件&#xff0c;推广了协作式多任务的子程序&#xff0c;允许执行被…

SqueezeNet 一维,二维网络复现 pytorch 小白易懂版

SqueezeNet 时隔一年我又开始复现神经网络的经典模型&#xff0c;这次主要复的是轻量级网络全家桶&#xff0c;轻量级神经网络旨在使用更小的参数量&#xff0c;无限的接近大模型的准确率&#xff0c;降低处理时间和运算量&#xff0c;这次要复现的是轻量级网络的非常经典的一…

【Node.js】暴露自定义响应头和预检请求的时机

1. 暴露自定义响应头 // server.js app.post(/api/user/hello, (req, res) > {res.setHeader(Access-Control-Allow-Origin, *)// 权限设置&#xff08;如果有个多&#xff0c;用 &#xff0c;隔开&#xff09;&#xff0c;暴露给前端res.setHeader(Access-Control-expose-…

muduo源码学习base——Atomic(原子操作与原子整数)

Atomic(原子操作与原子整数&#xff09; 前置知识AtomicIntegerTget()getAndAdd()getAndSet() 关于原子操作实现无锁队列(lock-free-queue) 前置知识 happens-before&#xff1a; 用来描述两个操作的内存可见性 如果操作 X happens-before 操作 Y&#xff0c;那么 X 的结果对于…

React hooks介绍及使用

介绍&#xff1a; React hooks 是 React 16.8 版本引入的新特性&#xff0c;它允许你在无需编写类组件的情况下&#xff0c;能够使用状态和其他 React 特性。它是基于函数组件的&#xff0c;使得函数组件也能够拥有类组件的状态和生命周期等特性&#xff0c;同时减少了处理一些…

有奖招募——2023年度清华社“荐书官”活动今日开始了!

又到“1024程序员节”了&#xff0c;维护网络世界稳定和平的程序员大大们&#xff0c;辛苦了&#xff01;生活难免有bug&#xff0c;来给彼此个hug~ 过完1024&#xff0c;这一年也快要结束了&#xff0c;岁末回顾又要提上日程。很多人都有整理年度书单的习惯&#xff0c;那么这…

架构风格区别-架构案例(五十九)

管道-过滤器和仓库的区别&#xff1f; 独立的数据仓库&#xff0c;处理流独立&#xff0c;处理数据用连接仓库工具数据与处理在一起&#xff0c;改动的话需要重启系统需要仓库工具与仓库连接&#xff0c;数据与处理分离&#xff0c;性能差可以支持并发连接访问仓库&#xff0c…

隐藏微信网页右上角的按钮、在微信网页中获取用户的网络状态,支付等

1.隐藏微信网页右上角按钮 <script type"text/javascript">document.addEventListener(WeixinJSBridgeReady,function onBridgeReady() {// 通过下面这个API隐藏右上角按钮WeixinJSBridge.call(hideOptionMenu); });document.addEventListener(WeixinJSBridge…

【经验分享】如何构建openGauss开发编译提交一体化环境

前文 本文适合对openGauss源代码有好奇心的爱好者&#xff0c;那么一个友好的openGauss源代码环境应该是怎么样的。openGauss的开发环境是如何设置的&#xff1f;openGauss的编译环境是如何构建的&#xff1f;如何向openGauss提交代码&#xff0c;笔者集合官方和几位博主实践提…

为什么要学习python?

Python是一种广泛使用的编程语言&#xff0c;它的简洁易读以及强大的功能使得它成为了许多人喜爱的编程语言之一。无论是初学者还是有经验的开发者&#xff0c;学习Python都是非常有价值的。在本篇博文中&#xff0c;我们将探讨学习Python的一些重要原因&#xff0c;并提供一些…