初试 pyhton 简易采集

一。安装软件(用eclispe 搭建好环境好,没有取省自动补全编写代码会很卡,最后选用sumblie)

eclispe  用的windows 32 4.31
python  用的 4.3.3  下载地址
pydev  用的2.4`

二。目录结构

三.各模块代码 ,调度器 spider_main.py, url管理器 url_manager.py, 网页下载器 html_downloader.py, 网页数据解析器 html_parser.py

采集数据输出 html_outputer.py

1.spider_main.py

import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from baike_spider import url_manager, html_downloader, html_parser,html_outputer

class SpiderMain(object):
    def __init__(self):
        # url 管理器, 模板下载器,下载数据解析器,解析数据输入器。 模块调度器
        self.urls = url_manager.UrlManager()   
        self.downloader = html_downloader.HtmlDownloader()
        self.parser = html_parser.HtmlParser()
        self.outputer = html_outputer.HtmlOutputer()

def craw(self,root_url):    
        count = 1
        self.urls.add_new_url(root_url)
            
        while self.urls.has_new_url():
            try:
                new_url = self.urls.get_new_url()
                print (count,new_url)
#                print craw (‘ %d : %s‘) % (count,new_url)
                html_cont = self.downloader.download(new_url)
                new_urls,new_data = self.parser.parse(new_url,html_cont)
                self.urls.add_new_urls(new_urls)
                self.outputer.collect_data(new_data)
                if count == 10:
                    break

count = count + 1

except:
                print (‘craw fail‘)    
                        
        self.outputer.output_html()

if __name__ =="__main__":
    root_url = "http://baike.baidu.com/view/21087.htm"
    obj_spider = SpiderMain()
    obj_spider.craw(root_url)

2.url_manager.py

class UrlManager(object):
    def __init__(self):
        self.new_urls = set()
        self.old_urls = set()

def add_new_url(self,url):
        if url is None:
            return
        if url not in self.new_urls and url not in self.old_urls:
            self.new_urls.add(url)

def add_new_urls(self,urls):
        if urls is None or len(urls) == 0:
            return
        for url in urls:
            self.add_new_url(url)

def has_new_url(self):
        return len(self.new_urls) != 0

def get_new_url(self):
        new_url =  self.new_urls.pop()
        self.old_urls.add(new_url)
        return new_url

3. html_downloader.py

import urllib.request
#print (urllib.request)
class HtmlDownloader(object):

def download(self,url):
        if url is None:
            return None

response = urllib.request.urlopen(url)

if response.getcode() != 200:
            return None
        return response.read()
#obj = HtmlDownloader()
#obj.download("http://baike.bai du.com/view/21087.htm")

4.html_parser.py

from bs4 import BeautifulSoup
import re
#import urlparse
#import urllib.request

class HtmlParser(object):

def _get_new_urls(self,page_url,soup):
        new_urls = set()
        links = soup.find_all("a",href=re.compile(r"/view/\d+\.htm"))
        for link in links:
            new_url = link[‘href‘]
#            print(new_url)
            new_full_url = "http://baike.baidu.com"+new_url
#            print (new_full_url)
            new_urls.add(new_full_url)
            
        return new_urls

def _get_new_data(self,page_url,soup):
            res_data = {}
            res_data[‘url‘] = page_url
            ttile_node = soup.find(‘dd‘,class_="lemmaWgt-lemmaTitle-title").find("h1")
            
            res_data[‘title‘] = ttile_node.get_text()
    
            summary_node = soup.find("div",class_="lemma-summary")
            res_data[‘summary‘] = summary_node.get_text()
            return res_data

def parse(self,page_url,html_cont):
        if page_url is None or html_cont is None:
            return

soup = BeautifulSoup(html_cont,‘html.parser‘,from_encoding = "utf-8")
#        print (soup)
        new_urls = self._get_new_urls(page_url,soup)
#        print (new_urls)
        new_data = self._get_new_data(page_url,soup)
        return new_urls, new_data    
    
#test = HtmlParser()
#response = urllib.request.urlopen("http://baike.baidu.com/view/21087.htm")
#test.parse("http://baike.baidu.com/view/21087.htm",response.read())

5.html_outputer.py

class HtmlOutputer(object):
    def __init__(self):
        self.datas = []

def collect_data(self,data):
        if data is None:
            return
        self.datas.append(data)
    
    def output_html(self):
        
#        print(self.datas)
        fout = open(‘output.html‘,"w")

fout.write("<html>")            
        fout.write("<body>")            
        fout.write("<table>")

for data in self.datas:
            # print(data[‘url‘])
            # print(data[‘title‘])
            # print(data[‘summary‘])
            fout.write("<tr>")
            fout.write("<td>%s</td>" % data[‘url‘].encode(‘utf-8‘).decode("utf-8"))            
            fout.write("<td>%s</td>" % data[‘title‘].encode(‘utf-8‘).decode("utf-8"))            
            # fout.write("<td>%s</td>" % data[‘summary‘].encode(‘utf-8‘).decode("utf-8"))        
            fout.write("</tr>")    
                    
        fout.write("</table>")            
        fout.write("</body>")            
        fout.write("</html>")            
        
submlie 中 Ctrl+B 运行。

时间: 2024-11-10 02:22:42

初试 pyhton 简易采集的相关文章

一大波可视化网页采集完整过程记录 新手也能一看就会

这几年工作中经常用到各种各样的网页爬虫,过年期间整理了一下,把一些比较实用的采集过程贴成动态GIF图片小视频,供以后自己使用.也希望方便到大家. 这里以八爪鱼为演示,没接触过可视化网页采集的话,不妨跟着动图动手做一做,理解起来更容易些. 下面都是些耗时在1~2分钟左右的演示,包括完整的规则配置过程.实时运行效果.和用代码实现爬虫相比,可视化的优点就是省时间,不是特别麻烦的情况,一般几分钟做出来很正常.下面开始: 先来做一个百度搜索结果的爪取规则:* 点击查看百度某关键词所有搜索结果爪取演示这个规

Matlab GUI 简易音频信号采集分析

基于Matlab 带有GUI界面 可以选择声卡采集.wav文件.信号生成器三种输入方式 显示音频的时域.频域波形 可叠加噪声 可选择进行参数可调的高通.低通滤波 滤波采用butterworth滤波器 下载地址:http://download.csdn.net/detail/thoughts_storms/7594229 Matlab GUI 简易音频信号采集分析

【应用笔记】【AN003】VC++环境下基于以太网的4-20mA电流采集

简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC++环境下进行温度采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成及工作原理 系统组成主要包括PT100铂电阻.SBWZ温度变送器.4-20mA电流采集模块(GM4008)以及上位机软件组成,如图1所示. PT100铂电阻温度传感器:利用铂金属阻值随温度的变化而变化的特性制成的一种温度传感器,主要用来测量温度的变化量. SBWZ温度变送器:一种现场安装

ZigBee温湿度采集系统设计

一 .温湿度度采囊系统的总体设计 协调器上电后,能够建立ZigBee无线网络,接着终端节点能查找并自动加入该ZigBee数传网络中,这时就建立起了协调器和终端节点的通信. 终端节点能够定时进行ZigBee数据采集温湿度数据,并将其通过ZigBee无线模块发送给协调器,协调器收到温湿度数据后,通过RS232通信串口传输上到PC机.系统设计原理图如图1-1: 图1-1 系统设计原理图 1.无线传感网络节点设计 针对ZigBee无线模块传感器网络的功能和组成,将传感器节点大致分成如下几个部分:ZigB

无线采集传输终端是什么?

无线采集传输终端(WCTU) 参考地址:http://www.winertech.com/projects_info.asp?id=146&WCTU CTU ( collect Transfer unit)既采集传输单元,是综合DTU,RTU,及短信收发功能为一体的高性能工业级无线数据采集传输设备.根据多年行业应用用户的使用和需求信息综合开发出来的一套实用性强,稳定性高,操作简易的无线采集通信模块,而WCTU(wireless collect Transfer unit)即无线采集传输终端 .

【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

版本:第一版作者:周新稳 杨帅 日期:20160226 =========================== 本资料高清PDF 下载: http://pan.baidu.com/s/1c1uuhLQ 源代码包下载: http://pan.baidu.com/s/1LSuXw =========================== 简介 本应用笔记主要说明如何在VB开发环境下基于RS485实现4-20mA电流采集. 系统组成及工作原理 系统组成如图1所示,主要包括 PT100铂电阻温度传感器.S

【原创】IP摄像头技术纵览(五)---网络摄像头初试—mjpg-streamer移植与部署

[原创]IP摄像头技术纵览(五)-网络摄像头初试-mjpg-streamer移植与部署 本文属于<IP摄像头技术纵览>系列文章之一: Author: chad Mail: [email protected] 1.vgrabbj.spacview.Luvcview.mjpg-streamer评测对比 vgrabbj-0.9.6是基于v4l1设计的,与v4l2的API差别很大,该软件已经没有使用或参考价值. spcaview 也相当古老,并且调用了SDL库,不适合嵌入式系统,不建议研究. 什么是S

linux环境下使用V4L2及Qt设计简易照相机

最近放假,比较清闲,正好手上有一个USB的免驱摄像头,想了想打算做一个简易的照相机,后期移植到4412的板子上做实时监控.之后在网上找了找参考资料,发现了一个比较好的博客,在此贴出来,链接:http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 本文是我在参考这个博客和其他很多资料的情况下写作的,其中包含了我遇到的问题及解决办法. 硬件平台:USB免驱摄像头+X86PC 开发环境:WIN7-64bit+VM

winserver的consul部署 北京_赛车采集修复 实践与.net core客户端使用

随着微服务兴起,服务的管理显得极其重要.都知道微服务就是"拆",把臃肿的单块应用,拆分成多个轻量级的服务,每个服务可以在短周期内重构.迭代.交付.随着微服务的数量增多,因量变引起了质量,带来新的问题其中一个是服务的管理问题.随着业务发展微服务增多,可能技术负责人也无法清楚记着服务的部署情况,服务的健康也不能时刻关注着,因此服务治理系统的作用必不可少. 北京_赛车采集修复 地址一:[hubawl.com]狐霸源码论坛地址二:[bbscherry.com] Consul Consul是一款