热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3多线程爬虫(初级)

多线程爬虫,主要是玩队列,队列玩明白了,多线程自然也就起来了。#导入各种包importthreadingimportqueueimpotjsonfromlxmlimporterte

多线程爬虫,主要是玩队列,队列玩明白了,多线程自然也就起来了。

#导入各种包
import threading
import queue
impot json
from lxml import ertee
定义爬取类,需要继承多线程:
class down_spider(Threading.Thread):
def __intit__(self,urlQ,dataQ):
super(down_spider,self).__init__()
self.urlQ = urlQ
self.dataQ = dataQ
def run(self):#重写run方法
self.down()
def down(self):
while True:#记住这里要写一个循环,不然一个线程只会取一次url就不干活了
if self.urlQ.empty():
break
url = self.urlQ.get()
''' 然后这里就写怎么爬取,设置代理之类的..... 假设是这样:respOnse= requests.get(url) '''
self.dataQ.put(response.text)#text返回一个string,content返回一个字节流
self.dataQ.task_done()#通知任务队列,这个任务完成了
class parser_handle(Threading.Thread):
def __intit__(self,dataQ,lock,file):
super(parser_handle,self).__init__()
self.dataQ= dataQ
self.lock = lock
self.file = file#结果保存到文件里把,文件要从主线程那里创建
def run(self):
while True:
if self.dataQ.empty():
break
text = self.dataQ.get()
html = etree.HTML(text)
''' 然后这里写解析规则 假如是这样:title = html.xpath('//title') item = { 'title':title, } '''
with self.lock:
self.file.wrtie(json.dupms(item,ensure_ascii=False))
定义两个队列,一个用来存url,一个用来存down下来的页面
urlQ= queue.Queue()#默认是先进先出
dataQ = queue.Queue()
lock = threading.RLock()
file = io.open('result.txt','a',encoding='utf-8')
#先把urlQ里的url搞出来
#自己找出规律,存储到urlQ里面
''' 假设是这样: urlQ = queue.Queue() for i in range(1,20): full_url = 'https://www.啊哈啊哈.com/' + str(i) + '/' urlQ.put(full_url) '''
#接下来搞五个线程去爬取
thread_down = []
for i in range(5):
t = down_spider(urlQ,dataQ)
t.start()
thread_down.append(t)
#在搞五个线程来解析加存储
thread_parser = []
for i in range(5):
t = parser_handle(dataQ,lock,file)
t.start()
thread_down.append(t)
#jion一下,让主线程等着我们,都搞完了再退
for t in thread_down:
t.join()
for t in thread_parser:
t.join()
file.close()
print('史上最简陋的多线程爬虫结束了')

多线程爬虫,首先要把队列搞明白,懂得队列的存取,并且需要知道自己需要的是哪种类型的队列,是先进先出,还是先进后出,还是优先级。然后就是用类来写的话,重写run方法,一定要记得while True,并且要给他一个出口。再然后就是锁了, 其实锁这块我不明白,只知道一点,写文件的时候需要加锁,不然大家都去写,不就乱了嘛。
接下来需要搞一下协程,搜集日志,异常处理,代理的使用。
这篇博客看了很有收获,讲的是线程爬虫、协程爬虫https://blog.csdn.net/xinkexueguanli/article/details/52552107


推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有