`
fighting_2013
  • 浏览: 15511 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Python 简易抓取界面

阅读更多

初学Python,参考相关资料做了个简易抓取网页界面,主要为了增加对python的熟识度。主要是通过urllib2获取预先指定的地址的页面,通过BeautifulSoup来解析界面元素,找到href标签,并将相关的数据存入数据库,以方便后面取出继续抓取。整个抓取和解析也是基于多线程与队列来控制的。做的比较简单与粗糙,后续深入可以改进。


import DBHelper
import CodeHelper
import urllib2
from bs4 import BeautifulSoup
import threading as thread
import Queue
import time

class Resource:
    
    def __init__(self, url, text, content, status):
        self._url = url
        self._text = text
        self._content = content
        self._status = status
        
    def insert(self):
        dbHelper = DBHelper.DBHelper()
        sql = 'select * from resource where url=%s'
        data = dbHelper.read(sql, [self._url])
        if data is not None :
            return
        sql = 'insert into resource(url,text,content,status) values(%s,%s,%s,%s)'
        print 'url: %s content: %s status: %s' %(self._url, self._text, self._content, self._status)
        dbHelper.execute(sql, [self._url, self._text, self._content, self._status]);
        dbHelper.commint()
        dbHelper.close()
        
    def updateStatus(self):
        dbHelper = DBHelper.DBHelper()
        sql = 'update resource set status=%s where url=%s'
        dbHelper.execute(sql, [self._status, self._url]);
        dbHelper.commint()
        dbHelper.close()
        
    def updateContentAndStatus(self):
        dbHelper = DBHelper.DBHelper()
        sql = 'update resource set content=%s,status=%s where url=%s'
        dbHelper.execute(sql, [self._content, self._status, self._url]);
        dbHelper.commint()
        dbHelper.close()
        
    def readListByStatus(self):
        dbHelper = DBHelper.DBHelper()
        sql = 'select * from resource where status=%s'
        return dbHelper.readList(sql, [self._status]);
        
    def readList(self):
        dbHelper = DBHelper.DBHelper()
        return dbHelper.readList('select * from resource');
        
class ResourceThread(thread.Thread):
    
    def __init__(self, task_queue):
        thread.Thread.__init__(self)
        self._task_queue = task_queue
        self.setDaemon(True)
        self.start()
    
    def run(self):
        print 'current thread name %s' %thread.currentThread().name
        while True :
            try :
                func, args = self._task_queue.get(block = False)
                func(args)
                self._task_queue.task_done()
            except Exception,e :
                print str(e)
                break
            
class ResourceManager:
    
    def __init__(self, taskNum = 10, threadNum = 2) :
        self._task_queue = Queue.Queue()
        self._threads = []
        self.__init__task_queue__(taskNum)
        self.__init__thread_pool(threadNum)
        
    def __init__task_queue__(self, taskNum) :
        for i in range(taskNum) :
            print 'this is %s task' %i
            self.add_task(do_task, i)
        
    def __init__thread_pool(self, threadNum) :
        for i in range(threadNum) :
            print 'threadNum %s' %i
            resourceThread = ResourceThread(self._task_queue)
            self._threads.append(resourceThread)
            
    def add_task(self, func, *args) :
        self._task_queue.put((func, args))
    
    def check_queue(self):
        return self._task_queue.qsize()
    
    def wait_for_complete(self) :
        for thread_item in self._threads :
            if thread_item.isAlive() :
                thread_item.join()
    
def do_task(args):
    print 'this task args %s' %args
    resource = Resource(None, None, None, 0)
    data = resource.readListByStatus()
    print 'read status 0 data is %s' %data
    if data is None :
        return
    for item in data :
        url = item[1]
        if url is None or url.find('http://') == -1 :
            continue
        content = urllib2.urlopen(url).read()
        html = BeautifulSoup(content)
        fetch_resource = Resource(url, None, str(html.find('body'))[0:9999], 1)
        fetch_resource.updateContentAndStatus()
        aLinks = html.find_all('a')
        print 'aLinks %s' %aLinks
        for aLink in aLinks :
            href = aLink.get('href')
            a_text = CodeHelper.encodeContent(aLink.get_text())
            print 'href %s text %s' %(href, a_text)
            subResource = Resource(href, a_text, '', 0)
            subResource.insert()
            
def execute():
    urls = ['http://www.kuwo.cn', 'http://www.1ting.com/', 'http://www.kugou.com/', 'http://y.qq.com/']
    for url in urls :
        resource = Resource(url, None, 0)
        resource.insert()
    
    start = time.time()
    resource_manager =  ResourceManager(20, 4)
    resource_manager.wait_for_complete()
    end = time.time()
    print "cost all time: %s" % (end-start)

if __name__ == '__main__':
    execute()
0
3
分享到:
评论

相关推荐

    Python-简易的模型监控界面定期更新的用户信用分及特征分布

    本项目“Python-简易的模型监控界面定期更新的用户信用分及特征分布”旨在提供一个简洁易用的工具,用于观察模型性能的变化以及关键特征的分布情况。 首先,我们需要理解Python在这一场景中的角色。Python是一种...

    爬虫脚本项目源码-Python制作简易时钟

    标题中的“爬虫脚本项目源码-Python制作简易时钟”表明这是一个使用Python编程语言编写的项目,其目标是创建一个简单的时钟程序。这个项目可能包含了一个或多个Python脚本,这些脚本能够实时显示当前时间,类似于...

    python 学习视频

    - **知识点概述**:通过Python实现一个简易版的搜索引擎。 - **关键内容**: - 网页爬虫技术; - 文档索引建立; - 查询算法优化; - 结果排序与展示。 - **实践意义**:深入了解搜索引擎的工作原理,提高信息...

    Python-从无到有构建一个电影知识图谱并基于该KG开发一个简易的KBQA程序

    电影领域的数据可以从各种来源获取,例如IMDb、TMDB等公开API,或者通过网络爬虫抓取网页数据。数据通常包括电影名称、年份、类型、导演、演员等信息。在`KG-demo-for-movie-master`压缩包中,可能包含了预处理好的...

    python新手级项目爬虫+PyQt5简易天气预报系统源码.zip

    在这个项目中,爬虫可能被用来从特定的气象网站抓取实时或预测性的天气数据。常用的Python爬虫库有requests(用于发送HTTP请求)和BeautifulSoup(用于解析HTML或XML文档)。 1. **requests库**:Python中的...

    python +pyqt5 +实战项目 +自制简易音乐播放器

    在本项目中,我们将探讨如何使用Python编程语言和PyQt5库来开发一个自制的简易音乐播放器。PyQt5是Python中一个强大的GUI(图形用户界面)工具包,它允许开发者创建各种复杂的桌面应用程序。在这个音乐播放器项目中...

    简易网页爬虫 V1.0 绿色免费版

    - 用户友好的界面,提供输入URL和设置抓取规则的选项。 - 自动解析和提取网页链接,列出所有链接供用户查看。 - 支持保存抓取的链接或数据到本地文件。 - 可能具有简单的过滤和筛选功能,帮助用户定制抓取范围。 - ...

    Python源码实例集锦-猜数字游戏、Tkinter计算器、Flask Web应用、Pandas数据分析、BeautifulSoup爬虫入门

    利用 Tkinter 创建的简易图形化界面计算器,只支持加减乘除等基础操作;采用 Flask 框架构建的一个基础的 Web 网络应用程序;运用 Pandas 库从 CSV 文件中导入并处理数据的基础操作演示;以及用 BeautifulSoup 进行...

    Python天气预报应用的实战指南

    内容概要:本篇内容详述了一个简单的Python天气预报应用程序的设计与搭建步骤,它涵盖了通过网络请求获取气象信息以及用Tkinter制作应用程序界面。本文主要介绍了从请求外部API以提取指定城市的实时天气情况到把相关...

    Python爬虫+办公自动化+好玩DIY-视频课程资源网盘链接提取码下载 .txt

    本视频课程旨在帮助初学者及有一定基础的学习者通过Python语言掌握数据抓取、办公自动化处理以及实现个性化DIY项目的能力。课程内容由浅入深,不仅涵盖了Python编程的基础知识,还包括了实际工作中常用的技巧与方法...

    TCPView网络抓包工具

    TCPView是一款轻量级的网络监控工具,专用于抓取并分析TCP和UDP连接信息。在信息技术领域,网络抓包工具对于调试、监控网络流量以及排查网络问题具有重要作用。TCPView以其小巧的体积(不到300kb)和简易的操作方式...

    互联网热点自动获取工具的实现.zip

    "互联网热点自动获取工具的实现.zip" 文件包就是针对这一需求而设计的,它包含了一系列Python脚本,用于实时抓取并聚合来自多个知名平台的热点信息。 首先,我们来看"GetHotLines.py",这很可能是主程序,负责调用...

    domi003:实作php + sqlite简易查询网站资料使用python爬虫抓至sqlite内

    在这个项目中,SQLite将作为数据存储的主要平台,Python爬虫抓取的网站数据将被存储在这里。 3. **Python爬虫**:Python是一种功能强大的编程语言,拥有丰富的库支持网络爬虫的编写。如`requests`库用于发送HTTP...

    pdf盖章用简易demo

    3. 拖放操作:拖放功能是用户界面设计中常见的一种交互方式,允许用户通过鼠标抓取一个元素并将其移动到另一个位置。在HTML5中,可以使用`dragstart`, `drag`, `dragend`等事件来实现。在PDF盖章场景中,拖放功能...

    Python生成个性签名图片获取GUI过程解析

    4. GUI设计:使用tkinter库来创建一个简易的图形用户界面。tkinter是Python的标准GUI库,它提供了一系列构建窗口、按钮、文本框等GUI组件的工具。在本文示例中,定义了一个设计签名的函数design(),通过tkinter的...

    改进版心理健康养生问答系统web版.zip

    标签中的“web.py简易界面”表示系统使用web.py框架创建了一个简单的用户界面。web.py是Python的一个轻量级Web框架,适合构建快速、简单的Web应用。"gensim相似文档搜索"意味着该系统可能采用了gensim库来实现文档的...

    hitsz_news_serach.zip

    总结,"hitsz_news_search"项目展示了如何利用Python技术栈构建一个简易的新闻搜索引擎,涉及了爬虫技术、中文分词和全文检索等核心概念。通过该项目,开发者不仅可以学习到实用的编程技巧,还能了解到信息检索的...

    简单的网站信息收集工具

    为了更加高效地收集网站信息,我们开发了这款简易网站信息收集器。本工具旨在帮助用户快速、准确地收集目标网站的基础信息,为后续的数据分析、研究或决策提供有力支持。 二、功能特点 自动化收集:用户只需输入...

    eascheduler:简易异步调度程序

    **EAScheduler:简易异步调度程序** EAScheduler,作为一个轻量级的异步任务调度框架,旨在为开发者提供简单、高效的异步任务管理工具。它基于Python的asyncio库构建,允许用户轻松地预定和执行一系列异步任务,以...

Global site tag (gtag.js) - Google Analytics