基于python里selenium库的信息盒爬取

1.以百度百科为信息来源爬取信息盒

百度百科爬取信息是根据输入name,然后点击进入词条按钮,实现对目标内容的爬取,所以可以将所要查找的内容name先写入一个文本文件,然后遍历文件,实现对每一个name的搜索。搜索到内容后,找到信息盒节点的元素,对信息盒内容进行爬取,最后将爬取的内容写入文本文件保存。
在这里插入图片描述
如图便是一个信息盒的内容。我所做的就是爬取这个内容,然后将内容按顺序输出。

1.1建立所要爬取的信息目录文本文件

将自己所要搜索的东西先写入文本文件,然后实现遍历
在这里插入图片描述
如上图所示,之所以竖着写是为了可以使用linecache对每一行进行遍历,遍历代码段如下:

import linecache
file=open(r"C:/Users/Administrator/Desktop/数据爬取/程序语言目录.txt",'rb')
txtfile=file.readlines()
for i in range(len(txtfile)):
    line=linecache.getline(r"C:/Users/Administrator/Desktop/数据爬取/程序语言目录.txt",i+1)

这样可以实现txt文件的逐行输出内容。

1.2找到输入信息栏的节点元素,进入词条的节点元素

这里就是将鼠标点击输入栏框,然后右键点击检查,就可以查看该节点的元素,下面就是输入栏框和进入词条这部分的元素信息。第三行是输入框的部分,第五行是进入词条的部分。

<div class="form">
<form id="searchForm" action="/search/word" method="GET" target="_self">
<input id="query" nslog="normal" nslog-type="10080011" name="word" type="text" autocomplete="off" autocorrect="off" value="">
<button id="search" nslog="normal" nslog-type="10080008" type="button">进入词条</button>
<button id="searchLemma" nslog="normal" nslog-type="10080009" type="button">全站搜索</button>
<a class="help" href="/help" nslog="normal" nslog-type="10080010" target="_blank">帮助</a>
</form>

这里可以使用下面两行代码,分别找到相应的信息:

  elem=driver.find_element_by_xpath("//div[@class='form']/form/input")
  elem1=driver.find_element_by_xpath("//div[@class='form']/form/button")

找到输入栏的信息后就可以使用elem.send_keys()函数,将name写入输入框。

1.3找到信息盒的节点元素,爬取信息,写入文本文件

信息盒节点的元素可以用同样的方法找到:

<div class="basic-info cmn-clearfix">
<dl class="basicInfo-block basicInfo-left">
<dt class="basicInfo-item name">中文名</dt>
<dd class="basicInfo-item value">
百度百科
</dd>
<dt class="basicInfo-item name">外文名</dt>
<dd class="basicInfo-item value">
Baidu baike
</dd>
<dt class="basicInfo-item name">&nbsp;&nbsp;&nbsp;&nbsp;</dt>
<dd class="basicInfo-item value">
网络<a target="_blank" href="/item/%E7%99%BE%E7%A7%91%E5%85%A8%E4%B9%A6/113479" data-lemmaid="113479">百科全书</a>
</dd>
<dt class="basicInfo-item name">上线时间</dt>
<dd class="basicInfo-item value">
2006年4月20日
</dd>
</dl><dl class="basicInfo-block basicInfo-right">
<dt class="basicInfo-item name">使&nbsp;&nbsp;&nbsp;&nbsp;</dt>
<dd class="basicInfo-item value">
让人类平等地认知世界
</dd>
<dt class="basicInfo-item name">核心用户</dt>
<dd class="basicInfo-item value">
<a target="_blank" href="/item/%E7%99%BE%E7%A7%91%E8%9D%8C%E8%9A%AA%E5%9B%A2">百科蝌蚪团</a><a target="_blank" href="/item/%E7%99%BE%E7%A7%91%E7%83%AD%E8%AF%8D%E5%9B%A2%E9%98%9F/13571828" data-lemmaid="13571828">百科热词团队</a>
</dd>
<dt class="basicInfo-item name">粉丝用户</dt>
<dd class="basicInfo-item value">
<a target="_blank" href="/item/%E7%99%BE%E7%A7%91%E6%98%8E%E6%98%9F%E5%9B%A2">百科明星团</a>
</dd>
<dt class="basicInfo-item name">校园用户</dt>
<dd class="basicInfo-item value">
<a target="_blank" href="/item/%E7%99%BE%E7%A7%91%E6%A0%A1%E5%9B%AD/18698409" data-lemmaid="18698409">百科校园</a><a target="_blank" href="/item/%E7%99%BE%E7%A7%91%E6%A0%A1%E5%9B%AD%E4%B8%93%E9%A2%98%E5%9B%A2/17334524" data-lemmaid="17334524">百科校园专题团</a>
</dd>
<dt class="basicInfo-item name">&nbsp;&nbsp;&nbsp;&nbsp;</dt>
<dd class="basicInfo-item value">
全球最大的中文百科全书
</dd>
</dl></div>

可以看到信息盒左边的内容在dt下,右边的内容在dd下,而他们全部在div/dl下,所以可以用下面的代码对其进行提取:

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")

这里爬取时需要特别注意,我们爬取到的内容要是那种字典的形式,用下面这部分形成:

 elem_dict=dict(zip(elem_name,elem_value))
    dict_1={}
    for key in elem_dict:
        print(key.text,elem_dict[key].text)
        dict_1.update({key.text:elem_dict[key].text})

使用dict(zip())函数实现对上面的elem_name,elem_value的一一对应,简单理解就是用这种方式,将他们与字典里的name和value对应。在最开始定义一个空字典,然后用update函数对字典添加内容,这样就可以实现将爬取的名称和内容转化为字典的格式。下面我们只需要使用items函数,对字典的各个内容进行输出就可以了。代码段如下:

    for itme in dict_1.items():
        # print(itme[0])
        str1=itme[0]
        # print(str1)
        infofile.write(str1 + ":")
        str2=itme[1]
        # print(str2)
        infofile.write(str2+"\r\n")

items是dict自带的函数,大致意思就是可以使键值对成对输出。由于一个键值对包含两个元素,所以item后面跟的索引值只能取0或1,先将str1写入文本文件并且加上’:’,然后将str2写入,并且加上换行符,这样就可以形成如下的输出:
在这里插入图片描述
至此整个爬取过程可以说结束了,有兴趣也可以爬取介绍这部分内容,只需改变一下元素位置即可。

2.完整代码

import time
from selenium import webdriver
import codecs
import linecache
file=open(r"C:/Users/Administrator/Desktop/数据爬取/程序语言目录.txt",'rb')
txtfile=file.readlines()
for i in range(len(txtfile)):#因为range是从0开始,所以后面应该使用i+1
    line=linecache.getline(r"C:/Users/Administrator/Desktop/数据爬取/程序语言目录.txt",i+1)
    driver = webdriver.Chrome("C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chromedriver.exe")
    driver.get("https://baike.baidu.com/")
    time.sleep(2)#给网站缓冲时间,避免频繁操作
    elem=driver.find_element_by_xpath("//div[@class='form']/form/input")
    # print(elem)
    elem.send_keys(str(line))#必须将结果转化为字符串的形式,才能正常使用该函数
    time.sleep(3)
    elem1=driver.find_element_by_xpath("//div[@class='form']/form/button").click()#实现点击
    time.sleep(3)
    elem_name=driver.find_elements_by_xpath("//div[@class='basic-info cmn-clearfix']/dl/dt")
    #for e in elem_name:
        #pass
        # print(e.text)
    elem_value=driver.find_elements_by_xpath("//div[@class='basic-info cmn-clearfix']/dl/dd")
    #for e1 in elem_value:
       # pass
        # print(e1.text)
    infofile=codecs.open("C:/Users/Administrator/Desktop/数据爬取/程序语言信息.txt",'a','utf-8')
    elem_dict=dict(zip(elem_name,elem_value))
    dict_1={}
    for key in elem_dict:
        print(key.text,elem_dict[key].text)
        dict_1.update({key.text:elem_dict[key].text})
    for itme in dict_1.items():
        # print(itme[0])
        str1=itme[0]
        # print(str1)
        infofile.write(str1 + ":")
        str2=itme[1]
        # print(str2)
        infofile.write(str2+"\r\n")
    infofile.write("\r\n\r\n")
    print('')
    time.sleep(3)
    driver.close()
infofile.close()

pycharm输出结果如下:
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值