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">属 性</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">使 命</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">定 位</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输出结果如下: