文档章节

Python3写爬虫(四)多线程实现数据爬取

巴鲁
 巴鲁
发布于 2015/04/18 18:00
字数 696
阅读 329
收藏 1

前段时间阅读了一篇名为《 [Python]网络爬虫(八):糗事百科的网络爬虫(v0.3)源码及解析(简化更新) 》的博客,基于Python2.7编写,我用Python3将其重构,在前几篇内容的基础上加入了多线程并且用类实现。以下是程序源代码,并对源代码进行解读:


#!/usr/bin/env python3
import queue
import urllib.request as request
import re
import threading
import socket
import time
import urllib.error

class SpiderModel:
    def __init__(self):
        socket.setdefaulttimeout(5)
        self.queue_url=queue.Queue()
        self.queue_text=queue.Queue()
        myUrl = "http://www.qiushibaike.com"
        self.queue_url.put(myUrl)
        self.visited=set()
    
    #从url队列中取出一个url,放如已访问    
    def Get_Page(self):
        #弹出一个队列元素,加入已访问set中
        #取出该url指向的数据,String
        myUrl=self.queue_url.get()
        self.visited |={myUrl}
        
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'   
        headers = { 'User-Agent' : user_agent }   
        req = request.Request(myUrl, headers = headers)
        time.sleep(2)
        try:
            myResponse = request.urlopen(req,timeout=3)
        except:
            print('urlopen出问题了')#对于Timeout问题我真的是无语了,查了很多资料也没得到结果
        try:
            myPage = myResponse.read()
        except:
            print('urllib request read出问题了')
        unicodePage = myPage.decode("utf-8",'ignore')
        return unicodePage
    
    def Get_Text(self):
        while True:
            PageString=self.Get_Page()
            #获取每个页面的所有url链接,放入队列queue_url
            linkre = re.compile('href=\"(.+?)\"')
            for x in linkre.findall(PageString):
                if 'http' in x and x not in self.visited:
                    self.queue_url.put(x)
                    #print(x)
        
            #获取每个页面的文章内容,放入队列queue_text中
            myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',PageString,re.S)    
            for item in myItems:       
                self.queue_text.put(item[0]+item[1])
                #print(item[0]+item[1])

    def Show_Text(self):
        while self.queue_text.not_empty:
            text_one=self.queue_text.get()
            print(text_one)
    
    def Start(self):
        print ('正在加载中请稍候......' )   
        threads=[]#创建线程列表,用于存放需要执行的子线程
        threading.Thread(target=self.Get_Text).start()
        threading.Thread(target=self.Show_Text).start()
    
#----------- 程序的入口处 --------------#    
print ("""  
---------------------------------------  
   程序:糗百爬虫  
   版本:1.0  
   作者:baluw  
   日期:2015-04-04  
   语言:Python 3.4   
   功能:抓取糗事百科,同步显示  
---------------------------------------  
"""  )
    
    
print ('请按下回车浏览今日的糗百内容:' )   
input(' ')
myModel = SpiderModel()    
myModel.Start()
#--------------程序入口-----------------#

程序创建了两个队列(queue)queue_url和queue_text分别存储抓取的网站网址和捕获的文本,一个集合(set)存储已访问的网站。关于利用正则表达式活取URL链接和网站文本内容,在前面文章中也已经介绍了,如果有疑问,可查看前面内容。

最主要的内容,在Start()这个函数,创建两个线程,一个线程活取url和文本并存入队列,另一个线程同步显示已经活取的内容。

但是系统存在问题,一直没法解决,运行了几秒钟,小程序就挂掉了。


© 著作权归作者所有

巴鲁
粉丝 8
博文 23
码字总数 12631
作品 0
本溪
程序员
私信 提问
手把手教你写网络爬虫(2):迷你爬虫架构

原文出处:拓海 介绍 大家好!回顾上一期,我们在介绍了爬虫的基本概念之后,就利用各种工具横冲直撞的完成了一个小爬虫,目的就是猛、糙、快,方便初学者上手,建立信心。对于有一定基础的读...

拓海
2018/04/27
0
0
Python多线程爬图&Scrapy框架爬图

一、背景 对于日常Python爬虫由于效率问题,本次测试使用多线程和Scrapy框架来实现抓取斗图来表情。 由于IO操作不使用CPU,对于IO密集(磁盘IO/网络IO/人家交互IO)型适合用多线程,对于计算...

KaliArch
2018/08/21
0
0
5个python爬虫教材,让小白也有爬虫可写,含视频教程!

认识爬虫   网络爬虫,如果互联网是一张蜘蛛网,网络爬虫既是一个在此网上爬行的蜘蛛,爬了多少路程即获取到多少数据。 python写爬虫的优势   其实以上功能很多语言和工具都能做,但是用...

柯西带你学编程
2018/06/12
0
0
python爬虫实战,干翻一个网站,爬取资源链接并用多线程下载!

其实说是这样说,不过我觉得如果不是有什么特殊用处就不要去下载了,毕竟一个视频就占那么大的内存,爬好链接地址就可以了。当然如果你是要爬那种网站,那么下载一点点备用我也能够理解。 需...

Python新世界
2018/07/30
0
0
起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
2018/12/15
460
1

没有更多内容

加载失败,请刷新页面

加载更多

Rabbit MQ 延迟消息发送

为什么使用延迟消息? 不同于同步消息,有些业务场景下希望可以实现延迟一定时间再消费消息。 典型的场景有微信、支付宝等第三方支付回调接口,会在用户支付后3秒、5秒、30秒等等时间后向应用...

兜兜毛毛
6分钟前
2
0
【0918】正则介绍_grep

【0918】正则介绍_grep 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 一、正则介绍 正则是一串有规律的字符串,它使用单个字符串来描述或匹配一系列符合某个语法规则的字符串。 二、grep工具 ...

飞翔的竹蜻蜓
36分钟前
4
0
为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
今天
8
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
今天
4
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部