[Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

2023-11-17

        前面我讲述过如何通过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? 
       最后希望文章对你有所帮助,还有一篇基础介绍文章,但是发表时总会引发CSDN敏感系统自动锁定,而且不知道哪里引起的触发。推荐你可以阅读~
         [python爬虫] Selenium常见元素定位方法和操作的学习介绍
      (By:Eastmount 2015-9-6 深夜2点半    http://blog.csdn.net/eastmount/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒 的相关文章

随机推荐

  • C语言写网络爬虫总体思路

    使用C语言编写爬虫可以实现网络数据的快速获取和处理 适用于需要高效处理海量数据的场景 与其他编程语言相比 C语言具有较高的性能和灵活性 可以进行底层操作和内存管理 适合处理较复杂的网络请求和数据处理任务 但是 使用C语言编写爬虫也存在一些挑
  • 2个不错的通配符比较函数

    近日在和朋友讨论 MaskMatch 时偶得2个不错的算法 函数1 只支持 模糊匹配 速度比采用递归算法的快近2倍 比TMask方法快很多 函数2 完全支持正规表达式 速度于之前的相同 不会正规表达式的朋友慎用 Funtion 1 Chec
  • mysql error1215

    You have a foreign key constraint operating in both directions When you re creating the tables the first to be created w
  • 基于STM32单片机的智能鱼缸的设计

    一 任务简介 本次以STM32F103单片机为核心 设计了一款智能鱼缸 能够实现智能温控 智能换水 智能供氧 智能喂食等功能 利用单片机作为主控制器 使用Keil软件进行程序开发 除STM32F103C8T6最小系统外 系统还包含温度传感
  • 【满分】【华为OD机试真题2023 JS】货币单位换算

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 货币单位换算 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 记账本上记录了若干条多国货币金额 需要转换成人民币分 fen 汇总后输出 每行记录一条金额 金额带有
  • 数仓虚拟化技术:PieCloudDB Database 通过中国信通院 2023 「可信数据库」性能评测的强力支撑...

    可信数据库 是国内首个数据库的评测体系 被业界广泛认可为产品能力重要的衡量标准之一 PieCloudDB Database在该评测中展现出卓越的数据处理速度 稳定性和可扩展性 为用户提供了强大的数据分析和查询能力 6 月 15 16 日 中
  • EF Core Migration 报错:An error occurred using the connection to database ‘‘ on server ‘10.28.253.2‘

    EF Core Migration update database的时候 An error occurred using the connection to database on server 10 28 253 2 问题 在做EF Co
  • 嵌入式Linux构建yaffs根文件系统

    嵌入式Linux构建yaffs根文件系统 开发环境说明 ubuntu1404 i686 天嵌光盘里的交叉编译链 版本4 4 3 busybox 1 13 0 下载地址 https busybox net downloads 一 编译busy
  • TQ2440移植u-boot2016.11全过程记录-【1】单板建立并启动

    TQ2440移植u boot2016 11 单板建立并启动 移植说明 u boot2016 11是S3C2440最后一版的uboot支持 所以选择了此版本进行移植 交叉编译器使用的是天嵌官方的交叉编译器 版本为4 4 3 使用的ubuntu
  • rsync随机启动脚本

    服务端 1 bin sh 2 chkconfig 2345 21 60 3 description Saves and restores system entropy pool for 4 create by xiaohu 5 2014 0
  • Dev-c++怎么设置背景色

    我们在使用Dev c 这个软件的时候 遇到夜晚等的条件下 希望使用一种暗一点的颜色 而默认的是白色的背景十分亮眼 如何进行设置呢 在教程的开始先附上设置后的效果图 显然这种背景更加适合晚上开发 话不多说 直接开始设置步骤 设置步骤 1 菜单
  • opencv-图片矫正

    转载 https www jianshu com p a1838972d1da 对于倾斜的图片通过矫正可以得到水平的图片 一般有如下几种基于opencv的组合方式进行图片矫正 1 傅里叶变换 霍夫变换 直线 角度 旋转 2 边缘检测 霍夫变
  • 英国程序员的工资

    我在英国做程序员工作将近2年了 接触到他们当地的一些的程序员 他们的大概工资如下 一个刚刚从学校毕业的计算机系大学生 月工资水平大概是2000到3000英镑左右 约合人民币3万至4 5万元 这是税前收入 英国是一个高税收高福利的国家 如果你
  • Windows上如何使用SWIG (c++ android 示例)

    SWIG介绍 SWIG Simplified Wrapper and Interface Generator 即简化包以及接口生成器 为脚本语言 tcl perl python等 提供了C和C 的接口 SWIG在1995年在Los Alam
  • 获取nan只能用numpy,不能用pandas

    a pd Series a b pd nan d AttributeError module pandas has no attribute nan a pd Series a b np nan d print a 0 a 1 b 2 Na
  • c语言输入并判断成绩等级

    输入并判断成绩等级 include
  • 华为OD机试 - 总最快检测效率(Java)

    题目描述 在系统 网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查 每名采样员的效率不同 采样效率为N人 小时 由于外界变化 采样员的效率会以M人 小时为粒度发生变化 M为采样效率浮动粒度 M N 10 输入保证N 10 的结
  • 数据结构与算法 各类数图概念集合

    拓扑排序 有向无环图才能进行拓扑排序 理解 就是在大学期间所有的课程 你只有先学完计算机基础 才能学更加高深的课程 从一个入度为0的点出发 找下一个一直到最后就是拓扑排序 前 中 后序排序 前 根左右 中 左中右 后 左右中 要确定一颗二叉
  • <毕业设计>最适合大学生的12个Java系统项目(附源码)

    就业 毕业设计 Java项目合集 小编给大家整理了12个Java系统项目 附源码 白嫖到底 最合适大学生学习的Java毕业设计教程合集 合集视频教程链接 https www bilibili com video BV1pB4y1h7Pr s
  • [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒 同样可以通过Spider获取网站内容 最近学习了Selenium Phantomjs后 准备利用它们获取百度百科的旅游景点消息盒 InfoBox 这也是毕业设计实体对齐和属