初试 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
.spider_main.py import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[]
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 =
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 == :
break count = count + 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) .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) == :
return
for url in urls:
self.add_new_url(url) def has_new_url(self):
return len(self.new_urls) != def get_new_url(self):
new_url = self.new_urls.pop()
self.old_urls.add(new_url)
return new_url . 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() != :
return None
return response.read()
#obj = HtmlDownloader()
#obj.download("http://baike.bai du.com/view/21087.htm") .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()) .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>
view
submlie 中 Ctrl+B 运行。
初试 pyhton 简易采集的更多相关文章
- python实现简易采集爬虫
#!/usr/bin/python #-*-coding:utf-8-*- # 简易采集爬虫 # 1.采集Yahoo!Answers,parseData函数修改一下,可以采集任何网站 # 2.需要sq ...
- QT 初试 MainWindow简易窗体
1.创建一个空的QT工程文件 2 建立程序文件 MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include<QMainWind ...
- querylist 在laravel框架中的简单采集数据(专业5)
//爬虫网站路由Route::get('/querylist/list','querylistControllers@querylist'); //控制器 <?phpnamespace App\ ...
- 搭建简易的WebServer(基于pyhton实现简易Web框架 使用socket套接字)
1. 使用web底层socket的方式实现简易服务器的搭建,用来理解学习 # 1.导入socket模块 import socket import re import gevent import sys ...
- 【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集
版本:第一版作者:周新稳 杨帅 日期:20160226 =========================== 本资料高清PDF 下载: http://pan.baidu.com/s/1c1uuhLQ ...
- 【应用笔记】【AN003】VC++环境下基于以太网的4-20mA电流采集
简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC++环境下进行温度采集,实现WINDOWS平台对数据的采集.分析及显示 ...
- 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)
版本:第一版 作者:毛鹏 杨帅 日期:20151108 简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC#环境下进行温 ...
- 实现简易的android 直播技术
Android 的直播,主要使用的是camera采集的数据推流到服务器上,在客户端播放camera采集的数据.采用SurfaceView+ SurfaceTexture来显示camera数据, Sur ...
- 【干货】.NET开发通用组件发布(三) 简易数据采集组件
组件介绍和合作开发 http://www.cnblogs.com/MrHuo/p/MrHuoControls.html 简易数据采集组件 怎么说他是一个简易的数据采集组件呢?因为由于时间仓促,缺少从某 ...
随机推荐
- leetcode-easy-string-14 Longest Common Prefix
mycode 91.59% class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if not str ...
- SpringBoot深入了解
核心配置文件 application 配置文件,主要用于 Spring Boot 项目的自动化配置. bootstrap 配置文件有以下几个应用场景. 使用 Spring Cloud Config 配 ...
- ColorPicker 颜色选择器
用于颜色选择,支持多种格式. 基础用法 使用 v-model 与 Vue 实例中的一个变量进行双向绑定,绑定的变量需要是字符串类型. <div class="block"&g ...
- Java学习笔记之Iterator和ListIterator
原文:https://blog.csdn.net/GongchuangSu/article/details/51514380 Iterator接口是对collection进行迭代的迭代器,ListIt ...
- select框动态添加选项
$.ajax({ url : "${staticServer }/ywgl/zkpzgl/zkfkgl/showBillType.htm", //ajax请求路径 type : & ...
- css换行用省略号代替
css换行用省略号代替,也可以说是长标题的文章可以使用简单的CSS样式实现省略号控制显示. 一般的文字截断(适用于内联与块): .text-overflow{ display:block;/*内联对象 ...
- Pytorch笔记 (3) 科学计算2
一.组织张量的元素 (1)重排张量元素 本节介绍在不改变 张量元素个数 和 各元素的值的情况下改变张量的大小 torch.Tensor类的成员方法 reshape() 参数是多个int类型的值. 如果 ...
- tensorflow keras导包混用
tensoboard 导入:导入包注意 否者会报错 :keras FailedPreconditionError: Attempting to use uninitialized value trai ...
- 【Qt开发】Qt控件之进度条
QT 进度条操作实例是本文要介绍的内容,在QT中可以用QProgressBar或着QProgressDialog来实现进度条. QProgressBar的使用 首先在designer中拖一个按钮和 ...
- Centos(64位)安装Hbase详细步骤
HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...