基python实现多线程网页爬虫
作者:糖拌咸鱼 时间:2023-10-30 00:58:48
一般来说,使用线程有两种模式, 一种是创建线程要执行的函数, 把这个函数传递进Thread对象里,让它来执行. 另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的class里。
实现多线程网页爬虫,采用了多线程和锁机制,实现了广度优先算法的网页爬虫。
先给大家简单介绍下我的实现思路:
对于一个网络爬虫,如果要按广度遍历的方式下载,它是这样的:
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()
以上代码就是给大家分享的基python实现多线程网页爬虫,希望大家喜欢。
标签:python,多线程,爬虫
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python绘制动态曲线教程
2023-01-20 08:24:33
![](https://img.aspxhome.com/file/2023/4/134464_0s.jpg)
MySQL如何优化查询速度
2024-01-17 05:38:04
python批量修改ssh密码的实现
2023-07-06 13:17:08
Oracle中sys和system的区别小结
2009-11-10 20:36:00
Google首页的CSS Sprite
2007-09-29 21:36:00
![](https://img.aspxhome.com/file/UploadPic/20079/29/2007929213924854s.png)
Python猴子补丁Monkey Patch用法实例解析
2022-02-20 06:45:01
对Python3之进程池与回调函数的实例详解
2022-07-30 13:07:01
JavaScript利用时间分片实现高性能渲染数据详解
2024-04-29 13:24:26
JavaScript 解析 Cookie 的函数
2007-11-08 11:58:00
Git 标签使用详解
2023-09-06 14:09:32
![](https://img.aspxhome.com/file/2023/1/131861_0s.png)
asp 自定义分段函数/求第N名成绩
2011-03-25 11:07:00
SQL Server 2005 SP3正式版下载
2008-12-16 12:42:00
oracle 时间格式的调整
2009-05-24 19:32:00
详解Node.js如何开发命令行工具
2024-05-05 09:21:19
pycharm利用pyspark远程连接spark集群的实现
2023-10-08 06:49:00
![](https://img.aspxhome.com/file/2023/3/127923_0s.png)
Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境详细过程(2023最新攻略)
2023-06-06 21:28:07
![](https://img.aspxhome.com/file/2023/1/111871_0s.png)
Centos下升级php5.2到php5.4全记录(编译安装)
2024-05-05 09:18:30
MySQL pt-slave-restart工具的使用简介
2024-01-17 11:42:34
asp和php页面全面封杀WVS扫描器的代码
2011-02-28 10:43:00
从mysql读写分离着手提升服务器性能
2024-01-22 06:56:10
![](https://img.aspxhome.com/file/2023/8/65298_0s.png)