网络爬虫工具BeautifulSoup连载-3-爬网站生成树数据
本实例的需求是获取我们公司官方网站-知识天地 里的各个知识领域名字与该领域的所有文章名,并生成呈现其父子关系的树状图。
本实例用到BeautifulSoup和Selenium的webdriver,两者互相结合,边操作页面便边爬,非常实用,相信大家在其它地方肯定也用得到这种技术。
先给大家看下我们编写的程序生成的数据树状图:

知识天地
╠══ 面试笔试
║   ╚══ 2017-12-18
                    面试笔试-卷一                
╠══ 软件测试理论
║   ╚══ 2017-11-21
                    测试流程和工具                
╠══ 自动化测试技术
║   ╚══ 2018-03-05
                    sikuli自动化操作web页面并进行检查使用示例                
╠══ 性能测试技术
║   ╚══ 2018-03-05
                    Web服务器支持的并发用户数                
╠══ Python开发测试
║   ╠══ 2017-12-17
                    画图展示JMeter性能测试HTTP服务器响应时间                
║   ╠══ 2017-12-16
                    socket网络编程连载4-DNS Server的实现                
║   ╠══ 2018-04-12
                    python树形结构数据处理模块treelib                
║   ╠══ 2018-03-27
                    socket网络编程连载1-socket网络编程原理                
║   ╠══ 2018-03-26
                    网络编程-select函数                
║   ╠══ 2018-03-05
                    利用pexpect模块远程操作Linux服务器                
║   ╠══ 2017-12-18
                    Python JSON                
║   ╠══ 2017-12-18
                    socket网络编程连载2-python SocketServer模块解读                
║   ╚══ 2017-12-17
                    python画图工具-Pycha                
╠══ 移动App技术
║   ╠══ 2017-12-16
                    Appium自动化测试连载3-客户端编写脚本测试App应用                
║   ╠══ 2017-12-16
                    Appium自动化测试连载2-Appium测试环境搭建                
║   ╚══ 2017-12-16
                    Appium自动化测试连载1-Appium介绍及工作原理                
╠══ 知识万花筒
║   ╠══ 2018-01-05
                    MongoDB-篇5                
║   ╠══ 2017-12-25
                    MongoDB-篇3                
║   ╠══ 2017-12-25
                    MongoDB-篇4                
║   ╠══ 2017-12-23
                    MongoDB-篇2                
║   ╚══ 2017-12-23
                    MongoDB-篇1                
╠══ 软件测试工具
║   ╠══ 2018-03-28
                    远程访问Linux和Windows的工具                
║   ╠══ 2018-03-28
                    Linux上传下载工具                
║   ╚══ 2018-03-05
                    在Linux上启动JMeter图形化界面                
╠══ 互联网技术
║   ╠══ 2018-04-13
                    网络爬虫工具BeautifulSoup连载-2-入门示例                
║   ╠══ 2018-04-12
                    网络爬虫工具BeautifulSoup连载-1-基础知识与安装                
║   ╠══ 2018-03-27
                    Postman接口测试3-进行测试                
║   ╠══ 2018-03-27
                    Postman接口测试5-生成测试代码                
║   ╠══ 2018-03-27
                    Postman接口测试4-测试用例集合                
║   ╠══ 2018-03-27
                    Postman接口测试2-操作界面使用                
║   ╠══ 2018-03-27
                    Postman接口测试1-初步认识                
║   ╠══ 2018-03-17
                    理解HTTP RESTful-精华篇                
║   ╚══ 2017-12-18
                    JSON数据                
╠══ 通信技术
║   ╠══ 2018-03-04
                    TCP延迟ACK与Nagle算法                
║   ╚══ 2017-12-19
                    10分钟教你全面又深刻认识Diameter消息-精华篇                
╚══ Java开发测试
    ╚══ 2018-03-05
                    Linux上查看,安装Java JDK,并设置Java环境变量                

最后给出代码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import re
import urllib2
import sys
from bs4 import BeautifulSoup

import time  
from selenium import webdriver
from treelib import Node, Tree

reload(sys)
sys.setdefaultencoding('utf-8')
#if has no two lines above, it will raise "UnicodeDecoderError:ascii codec can't decode ..."

class Directory_File_Element:
    def __init__(self, title):
        self.title = title
        
    def getTitleText(self):
        return self.title

ftree = Tree()
ftree.create_node("Root", "root", data=Directory_File_Element(u"知识天地"))
        
saveout = sys.stdout
savedFile = open('release_out.log', 'a+')
sys.stdout = savedFile
 
url = r"http://www.tuoxitech.com/htm/zhishifenxiang/"

driver = webdriver.Firefox()  

driver.get(url)  
time.sleep(3)

res = driver.page_source.encode("utf-8")
soup = BeautifulSoup(res, "html.parser")
entities_list = soup.find("div", {"class" : "cntl clearfix"})
 
entities = entities_list.findAll(name="a", attrs = {"class" : "nstt"})

index = 0
for entity in entities:
    ftree.create_node("dir_" + str(index), parent='root', data=Directory_File_Element(entity.string.encode("utf-8")))
    index += 1

all_dirs = ftree.children("root")

index = 0
for dir in all_dirs:
    dirText = dir.data.getTitleText()
    dir_nid = dir.identifier
    driver.find_element_by_link_text(dirText).click()
    res = driver.page_source.encode("utf-8")
    soup = BeautifulSoup(res, "html.parser")
    time.sleep(3)
    entities_list = soup.find("div", {"class" : "cntr clearfix"})
    entities = entities_list.findAll(name="a")

    for entity in entities:
        #print entity
        ftree.create_node("art_" + str(index), parent=dir_nid, data=Directory_File_Element(entity.text.encode("utf-8")))
        index += 1

ftree.show(data_property="title", line_type = "ascii-em")
 
sys.stdout = saveout
savedFile.close()

driver.close()
相关课程
  • 高级软件测试课程

    ¥5000元173人学习

  • 软件测试就业班全栈课程

    ¥6000元166人学习

  • 友情链接
  • 唯美谷