【spider】多线程爬虫

多线程工作原理

多线程示意图

 

Queue(队列对象)

queue是python中的标准库,可以直接from queue import Queue引用;队列是线程间最常用的交换数据的形式

 

python下多线程的思考

对于资源,加锁是个重要的环节。Queue,是线程安全的,因此在满足使用条件下,建议使用队列

 

创建一个“队列”对象 

pageQueue = Queue(10)

 


将一个值放入队列中

for page in range(1, 11):
   pageQueue.put(page)

 


将一个值从队列中取出

pageQueue.get()

 

队列Queue

Queue线程安全
    queue是python中的标准库,可以直接from queue import Queue引用;队列是线程间最常用的交换数据的形式
    创建一个“队列”对象
    队列常用方法
        put()
        get(block)
        empty()
        full()
        qsize()

队列锁与线程锁

import threading
from queue import  Queue
dataQueue = Queue(100)
exitFlag = Falseclass MyThread(threading.Thread):def __init__(self,q):super().__init__()self.queue = qdef run(self):super().run()global exitFlagwhile True:if exitFlag:print('++++++++++++++++++++++++++exit')breaktry:print('------------------------',self.queue.get(False))self.queue.task_done()except:passdef main():for i in range(100):dataQueue.put(i)threads = []for i in range(5):thread = MyThread(dataQueue)threads.append(thread)thread.start()# 队列锁# dataQueue.join()global  exitFlagexitFlag = Trueprint('exit ------------------------------------------------')# 线程锁for t in threads:t.join()if __name__ == '__main__':main()

另一个实例 爬去读书网站

import requests
from bs4 import BeautifulSoup
from queue import Queue
import threading
from threading import Lock
url = 'https://www.dushu.com/book/1175_%d.html'
task_queue = Queue(100)
parse_queue = Queue(100)
headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.9',
'Cache-Control':'max-age=0',
'Connection':'keep-alive',
'Cookie':'Hm_lvt_8008bbd51b8bc504162e1a61c3741a9d=1572418328; Hm_lpvt_8008bbd51b8bc504162e1a61c3741a9d=1572418390',
'Host':'www.dushu.com',
'Sec-Fetch-Mode':'navigate',
'Sec-Fetch-Site':'none',
'Sec-Fetch-User':'?1',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',}
# 解析线程退出的标记
exit_flag = False# 相当于线程池
class CrawlThread(threading.Thread):def __init__(self, q_task:Queue,q_parse:Queue) -> None:super().__init__()self.q_task = q_taskself.q_parse = q_parsedef run(self) -> None:super().run()self.spider()# 一直干活def spider(self):while True:if self.q_task.empty():print('+++++++爬虫线程%s执行任务结束+++++++'%(threading.current_thread().getName()))breaktaskId = self.q_task.get()response = requests.get(url % (taskId), headers = headers)response.encoding = 'utf-8'html = response.textself.q_parse.put((html,taskId))self.q_task.task_done()print('------爬虫线程:%s-----执行任务:%d-------'%(threading.current_thread().getName(),taskId))
# 专心爬虫
def crawl():for i in range(1,101):task_queue.put(i)for i in range(5):t = CrawlThread(task_queue,parse_queue)t.start()class ParseThread(threading.Thread):def __init__(self,q_parse:Queue,lock:Lock,fp):super().__init__()self.q_parse = q_parseself.lock = lockself.fp = fpdef run(self):super().run()self.parse()def parse(self):while True:if exit_flag:print('-----------解析线程:%s完成任务退出------------'%(threading.current_thread().getName()))breaktry:html,taskId = self.q_parse.get(block=False)soup = BeautifulSoup(html,'lxml')books = soup.select('div[class="bookslist"] > ul > li')print('----------------',len(books))for book in books:self.lock.acquire()book_url = book.find('img').attrs['src']book_title = book.select('h3 a')[0]['title']book_author = book.select('p')[0].get_text()book_describe = book.select('p')[1].get_text()fp.write('%s\t%s\t%s\t%s\n'%(book_url,book_title,book_author,book_describe))self.lock.release()self.q_parse.task_done()print('**********解析线程:%s完成了第%d页解析任务***********'%(threading.current_thread().getName(),taskId))except :pass
# 专心的负责网页解析,保存
def parse(fp):lock = Lock()for i in range(5):t = ParseThread(parse_queue,lock,fp)t.start()
if __name__ == '__main__':crawl()fp = open('./book.txt','a',encoding='utf-8')parse(fp)# 队列join:队列中的任务必须结束,下面才会执行task_queue.join()parse_queue.join()fp.close()exit_flag = Trueprint('代码执行到这里!!!!!!!!!!!!!!')

多线程实现
    读书http://www.qwsy.com/shuku.aspx?&page=1
    导包
    定义变量
    创建爬虫线程并启动
        爬虫线程
    创建解析线程并启动
        解析线程
            Queue.get(block = True/False)
    join()锁定线程,确保线程全部执行完毕
    结束任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css设置文字上下居中,一行文字居中,两行或多行文字同样居中。

HTML: <div class"book-detail-store-item align-center-vertical">居中文字</div> CSS: .book-detail-store-item {width: 50px&#xff1b;height&#xff1a;50px&#xff1b;line-height: 25px;font-size: 12px;}/*flex垂直居中对齐*/ .align-center…

MySQL/sqlserver查询in操作 查询结果按in集合顺序显示

2019独角兽企业重金招聘Python工程师标准>>> MySQL/sqlserver查询in操作 查询结果按in集合顺序显示 MySQL用下面的语句 select * from ibs6_terminal_adv_inf where id in (16,14,15) order by field(id,16,14,15) select * from ibs6_terminal_adv_inf where id in…

【机器学习】opencv-人脸识别

一 . opencv是什么及其作用&#xff1f; OpenCV是一个基于BSD许可&#xff08;开源&#xff09;发行的跨平台计算机视觉库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;同时提供了Python…

关于java中的集合如何删除一个元素。

我们有三种方法可以删除集合中的元素&#xff0c;下面介绍两种方法&#xff0c; 一种是传统的for循环&#xff0c;另一种是使用Iterator迭代器(推荐使用)&#xff0c;简单的介绍如下&#xff1a; for循环删除元素: public class ForRemove<T>{ public void forDelete(…

她说程序员不懂浪漫,生日宴上惨变单身狗,其实,程序员的浪漫你不懂!

css蛋糕谁说程序员不懂得浪漫&#xff0c;只是程序员的浪漫你不懂&#xff01;PS&#xff1a;人家都不懂&#xff0c;你再浪漫有啥用&#xff0c;最后还不是单身狗&#xff1f;说实在的&#xff0c;以前也分享过一个程序员用纯CSS画的一个MAC&#xff0c;代码就三千多行&#x…

H.264 picture parameter sets成员值含义学习笔记

-picture parameter sets1. pic_parameter_set_idpic_parameter_set_id指明了在切片头中对应的某个psp.pic_parameter_set_id的值应该在0到255,包括0和2552. seq_parameter_set_idset_parameter_set_id表示激活的sps.seq_parameter_set_id应该取值在0到31之间,包括边界值.3. en…

【机器学习】opencv-数据预处理

想要将收集好的数据s进行统一命名 数量整理 就需要提前进行预处理 import numpy as npimport osimport randomimport cv2 # wuao文件名修改&#xff0c;1~10文件名 filename os.listdir(./faces/wuao/) for i,name in enumerate(filename):os.rename(./faces/wuao/%s%(name)…

WIN7如何替换开机登录画面

1 把你的图片保存为backgroundDefault.jpg,并确保和你的屏幕分辨率相同 2 把下面的代码另存为开启自定义登录界面.reg&#xff08;注意格式为ASCII格式&#xff09; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\A…

Resharper 安装以及破解

首先进行软件安装 安装后 解压下载好的 文件 会得到如下&#xff1a; 打开序列号 会看到 然后 复制 %LocalAppData%\\JetBrains 路径 会得到进入当前JetBrains 文件夹 然后搜索 JetBrains.Platform.Shell.dll 会得到这个文件 点击属性 查看到后半段的地址 \AppData\Local\JetB…

【机器学习】图片中的人脸识别

通过opencv三方库进行图片人脸识别 face_zones中的参数可以自行调试,这三个data都可以用于人脸识别 haarcascade_frontalface_default.xmlhaarcascade_frontalface_alt.xmlhaarcascade_frontalface_alt2.xml import numpy as npimport cv2img cv2.imread(./2ren.jpg) img.s…

Android Fragment

Fragment在3.0后增加&#xff1a;android.app.Fragment。在v4的兼容包里也有。 一般为了兼容性还是可能会用&#xff1a;android.support.v4.app.Fragment 生命周期&#xff1a; onAttach,onCreate,onCreateView,onActivityCreated,onStart,onResume, onPause,onStop,onDestroy…

1020. 月饼 (25)

1020. 月饼 (25) 月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出的情形…

【机器学习】opencv-视频中的人脸检测

本次在图片识别的程度上增添了视频识别 原理就是在图片的基础上进行操作 每毫秒进行下一帧的人脸解析识别&#xff0c;时间可自行设置 import numpy as np import cv2win cv2.namedWindow(dzd,cv2.WINDOW_NORMAL) cv2.resizeWindow(dzd,640,200) rose cv2.imread(./rose.jp…

scan8[16+2*4]的内容

scan8确实不好理解&#xff0c;解答如下&#xff1a; static const int x264_scan8[162*4] { /* Luma */ 41*8, 51*8, 42*8, 52*8, 61*8, 71*8, 62*8, 72*8, 43*8, 53*8, 44*8, 54*8, 63*8, 73*8, 64*8, 74*8, /* Cb */ 11*8, 21*8, 12*8, 22*8, /…

React 产品实现 -任务管理工具“氢”

原文地址&#xff1a;https://zhuanlan.zhihu.com/p/...&#xff0c;欢迎转载 &#xff1a;-&#xff09;? 关于 其实对于这个专栏的订阅用户感到非常抱歉&#xff0c;已经停更很久了&#xff0c;也没啥特别的理由就是懒 orz&#xff01;不对&#xff0c;画风不能这样开头&…

通过curl获取网页访问时间

curl -w %{time_namelookup}:%{time_connect}:%{time_starttransfer}:%{time_total}:%{speed_download}"\n" "https://www.google.com" 转载于:https://www.cnblogs.com/fanxuanhui-linux/p/6581292.html

【numpy】20道numpy题目

1、创建一个长度为10的一维全为0的ndarray对象&#xff0c;然后让第5个元素等于1 import numpy as npndarry np.zeros(10) ndarryarray([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])ndarry[4]1 ndarryarray([0., 0., 0., 0., 1., 0., 0., 0., 0., 0.])2、创建一个元素为从10到4…

ffmpeg_intra_pred_mode问题.pdf

ffmpeg_intra_pred_mode问题.pdf文章

【R】语言第一课-----安装

安装R和Rstuido软件 R语言是用于统计分析&#xff0c;图形表示和报告的编程语言和软件环境&#xff1b;Rstudio是编辑、运行R语言的最为理想的工具之一。 1、官网下载R安装包 下载地址为&#xff1a;https://cran.r-project.org 进入链接&#xff0c;如下图所示&#xff0c…

面向对象基础知识整理

1、什么是对象&#xff1f; 什么是类&#xff1f; 对象是可以看的见摸得着的&#xff0c;对象可以是任何东西&#xff0c;比如水杯&#xff0c;书&#xff0c;手机等。准确的说&#xff0c;对象是一个自包含的实体&#xff0c;用一组可识别的特性和行为标识的。 类就是具有相同…