多线程网页爬虫 python 实现

采用了多线程和锁机制,实现了广度优先算法的网页爬虫。

对于一个网络爬虫,如果要按广度遍历的方式下载,它就是这样干活的:
        1.从给定的入口网址把第一个网页下载下来
        2.从第一个网页中提取出所有新的网页地址,放入下载列表中
        3.按下载列表中的地址,下载所有新的网页
        4.从所有新的网页中找出没有下载过的网页地址,更新下载列表
        5.重复3、4两步,直到更新后的下载列表为空表时停止

python实现代码如下:

#!/usr/bin/env python
#coding=utf-8
import threading
import urllib
import re
import time

g_mutex=threading.Condition()
g_pages=[]  #从中解析所有url链接
g_queueURL=[]  #等待爬取的url链接列表
g_existURL=[]  #已经爬取过的url链接列表
g_failedURL=[] #下载失败的url链接列表
g_totalcount=0 #下载过的页面数

class Crawler:
    def __init__(self,crawlername,url,threadnum):
        self.crawlername=crawlername
        self.url=url
        self.threadnum=threadnum
        self.threadpool=[]
        self.logfile=file("log.txt",‘w‘)
    def craw(self):
        global g_queueURL
        g_queueURL.append(url)
        depth=0
        print self.crawlername+" 启动..."
        while(len(g_queueURL)!=0):
            depth+=1
            print ‘Searching depth ‘,depth,‘...\n\n‘
            self.logfile.write("URL:"+g_queueURL[0]+"........")
            self.downloadAll()
            self.updateQueueURL()
            content=‘\n>>>Depth ‘+str(depth)+‘:\n‘
            self.logfile.write(content)
            i=0
            while i<len(g_queueURL):
                content=str(g_totalcount+i)+‘->‘+g_queueURL[i]+‘\n‘
                self.logfile.write(content)
                i+=1
    def downloadAll(self):
        global g_queueURL
        global g_totalcount
        i=0
        while i<len(g_queueURL):
            j=0
            while j<self.threadnum and i+j < len(g_queueURL):
                g_totalcount+=1
                threadresult=self.download(g_queueURL[i+j],str(g_totalcount)+‘.html‘,j)
                if threadresult!=None:
                    print ‘Thread started:‘,i+j,‘--File number =‘,g_totalcount
                j+=1
            i+=j
            for thread in self.threadpool:
                thread.join(30)
            threadpool=[]
        g_queueURL=[]
    def download(self,url,filename,tid):
        crawthread=CrawlerThread(url,filename,tid)
        self.threadpool.append(crawthread)
        crawthread.start()
    def updateQueueURL(self):
        global g_queueURL
        global g_existURL
        newUrlList=[]
        for content in g_pages:
            newUrlList+=self.getUrl(content)
        g_queueURL=list(set(newUrlList)-set(g_existURL))
    def getUrl(self,content):
        reg=r‘"(http://.+?)"‘
        regob=re.compile(reg,re.DOTALL)
        urllist=regob.findall(content)
        return urllist

class CrawlerThread(threading.Thread):
    def __init__(self,url,filename,tid):
        threading.Thread.__init__(self)
        self.url=url
        self.filename=filename
        self.tid=tid
    def run(self):
        global g_mutex
        global g_failedURL
        global g_queueURL
        try:
            page=urllib.urlopen(self.url)
            html=page.read()
            fout=file(self.filename,‘w‘)
            fout.write(html)
            fout.close()
        except Exception,e:
            g_mutex.acquire()
            g_existURL.append(self.url)
            g_failedURL.append(self.url)
            g_mutex.release()
            print ‘Failed downloading and saving‘,self.url
            print e
            return None
        g_mutex.acquire()
        g_pages.append(html)
        g_existURL.append(self.url)
        g_mutex.release()

if __name__=="__main__":
    url=raw_input("请输入url入口:\n")
    threadnum=int(raw_input("设置线程数:"))
    crawlername="小小爬虫"
    crawler=Crawler(crawlername,url,threadnum)
    crawler.craw()
时间: 2024-10-12 08:43:24

多线程网页爬虫 python 实现的相关文章

多线程网页爬虫 python 实现(二)

#!/usr/bin/env python #coding=utf-8 import threading import urllib import re import time cur=0 last=0 totalcount=0 depth=0 t_mutex=threading.Condition() class Mycrawler: def __init__(self,crawlername,seeds,threadnum): self.crawlername=crawlername sel

Python天气预报采集器 python网页爬虫

这个天气预报采集是从中国天气网提取广东省内主要城市的天气并回显.本来是打算采集腾讯天气的,但是貌似它的数据是用js写上去还是什么的,得到的html文本中不包含数据,所以就算了 爬虫简单说来包括两个步骤:获得网页文本.过滤得到数据. 1.获得html文本.  python在获取html方面十分方便,寥寥数行代码就可以实现需要的功能. def getHtml(url): page = urllib.urlopen(url) html = page.read() page.close() return

Python 网页爬虫

一.要解决的问题 需要解决的是根据自定义的关键词自动搜索google学术,解析搜索到的网页,下载所有相应的论文的PDF链接.这里我们采用Python来实现, 二.Python入门 python 自动缩进:shift+table整块向左缩进,table向右缩进,在修改整块代码时很有用比如将函数变成单独执行时. 了解python的变量,包,函数定义等 三.网页知识 3.1 浏览网页的过程 打开网页的过程其实就是浏览器作为一个浏览的“客户端”,向服务器端发送了 一次请求,把服务器端的文件“抓”到本地,

用 python 实现一个多线程网页下载器

今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. keywords:python,http,multi-threads,thread,threading,httplib,urllib,urllib2,Queue,http pool,httppool 废话少说,上源码: 1 # -*- coding:utf-8 -*- 2 import urllib,

基于Python的urllib2模块的多线程网络爬虫程序

1 m Queue import Queue 2 from gzip import GzipFile 3 from StringIO import StringIO 4 import time 5 import socket 6 class ContentEncodingProcessor(urllib2.BaseHandler): 7 """A handler to add gzip capabilities to urllib2 requests ""

Python 网页爬虫 &amp; 文本处理 &amp; 科学计算 &amp; 机器学习 &amp; 数据挖掘兵器谱(转)

原文:http://www.52nlp.cn/python-网页爬虫-文本处理-科学计算-机器学习-数据挖掘 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python.离开腾讯创业后,第一个作品课程图谱也是选择了Python系的Flask框架,渐渐的将自己的绝大部分工作交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处理,科学计算,机器学习和数据挖掘领域,有很多很多

【Python】Python 网页爬虫 &amp; 文本处理 &amp; 科学计算 &amp; 机器学习 &amp; 数据挖掘兵器谱

好文 mark http://www.52nlp.cn/python-%E7%BD%91%E9%A1%B5%E7%88%AC%E8%99%AB-%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86-%E7%A7%91%E5%AD%A6%E8%AE%A1%E7%AE%97-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工

python实现的一个简单的网页爬虫

学习了下python,看了一个简单的网页爬虫:http://www.cnblogs.com/fnng/p/3576154.html 自己实现了一个简单的网页爬虫,获取豆瓣的最新电影信息. 爬虫主要是获取页面,然后对页面进行解析,解析出自己所需要的信息进行进一步分析和挖掘. 首先需要学习python的正则表达式:http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html 解析的url:http://movie.douban.com/ 查看

Python编写网页爬虫爬取oj上的代码信息

OJ升级,代码可能会丢失. 所以要事先备份. 一开始傻傻的复制粘贴, 后来实在不能忍, 得益于大潇的启发和聪神的原始代码, 网页爬虫走起! 已经有段时间没看Python, 这次网页爬虫的原始代码是 python2.7版本, 试了一下修改到3.0版本, 要做很多包的更替,感觉比较烦,所以索性就在这个2.7版本上完善了. 首先观赏一下原始代码,我给加了一些注释: # -*- coding: cp936 -*- import urllib2 import urllib import re import