初试 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 简易数据采集组件 怎么说他是一个简易的数据采集组件呢?因为由于时间仓促,缺少从某 ...
随机推荐
- mysql5.6 varchar长度不同的情况下group by的效率
varchar长度短的情况下,基于这个字段的group by效率更高.所以开发在设计表的时候要使该字段在满足业务需求的情况下尽可能的小. ps:本想找源码看看代码那是怎么处理的,直接用vim看文件太累 ...
- GreyMagic
hearthbuddy中的一段代码 // Token: 0x06001A79 RID: 6777 RVA: 0x000DD024 File Offset: 0x000DB224 internal In ...
- 对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们
托管调试助手“CallbackOnCollectedDelegate”在“D:\XXX\XXX.vshost.exe”中检测到问题. 其他信息: 对“XXX+HookProc::Invoke”类型的已 ...
- 90子集II
题目:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集).说明:解集不能包含重复的子集. 输入:[1,2,2] 输出:[[2],[1],[1,2,2],[2,2],[1 ...
- 【DVWA】SQL Injection(SQL 注入)通关教程
日期:2019-07-28 20:43:48 更新: 作者:Bay0net 介绍: 0x00.基本信息 关于 mysql 相关的注入,传送门. SQL 注入漏洞之 mysql - Bay0net - ...
- ALV程序设计
ALV 全称SAP LIST VIEW, 是SAP所提供的一个强大的数据报表显示工具. ALV显示格式分为GRID及LIST两种,两者所显示数据一致, GRID模式在每个输出字段提供选择按钮,允许用 ...
- SO BAPI SD_SALESDOCUMENT_CREATE
DATA: E_ORDER_HEADER_IN LIKE BAPISDHD1 OCCURS 0 WITH HEADER LINE, E_ORDER_PARTNERS LIK ...
- ibatis使用iterate实现批量插入insert正确写法
由于想批量入库提升效率,最近实现了ibatis的批量插入,结果一直报错 :StringIndexOutOfBoundsException ,原来是value中的格式不正确. 本人邮箱:techqu@1 ...
- 汇编语言——用DOSBox的debug查看CPU和内存 & 用机器指令和汇编指令编程
实验一 查看CPU和内存,用机器指令和汇编指令编程 实验目的 了解什么是Debug,以及Debug中需要用的一些功能 R:查看.改变CPU寄存器的内容 D:查看内存中的内容 E:改写内存中的内容 ...
- Java内部类介绍
在Java中,内部类包括:成员内部类(静态内部类.非静态内部类).匿名内部类.局部内部类(几乎不用). 1.成员内部类: 1.1非静态成员内部类 public class InnerClassTest ...