爬虫day7多线程和多进程

一、什么是线程和进程

1、什么是进程

一个正在运行的应用程序就是一个进程。

每一个进程均运行在其专用且受保护的内存(运行内容)中

2、什么是线程

线程是进程执行任务的基本单元。

进程要做什么事情,或者要干什么活必须要有线程。

3、线程的特点

如果要在一个线程中执行多个任务,任务是串行执行(一个一个的按照顺序执行)

4、多线程

默认情况下一个进程只有一个线程(一个工厂只有一个工人),多线程指的是在一个进程中有多个线程(一个工厂有多个工人)。
多线程执行不同的任务可以并行(同时)执行。
注意:多线程可以提高程序执行效率,但不是线程越多越好。(计算机一般的应用程序不要超过100个,爬虫可以到达200到300个)

二、多线程

from threading import Thread, current_thread
from datetime import datetime
import time

1、主线程和子线程

一个进程默认只有一个线程,这个线程叫主线程。除了主线程以外的线程都叫子线程。

如果进程中需要子线程,只能自己创建(创建线程类或者线程类的子类对象)。

print(current_thread()) def download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(2)print(f'{name}下载结束:{datetime.now()}')# 2. 单线程的串行
# download('午夜凶铃')
# download('上海堡垒')
# download('沉默的羔羊')# 3.创建三个子线程,下载三部电影
# 1)1)创建线程对象
"""
创建线程对象,并且分配线程任务:  Thread(*, target, args)
target  -  需要在子线程中调用的函数,需要给一个普通函数的函数名(代表任务)
args  -  在子线程中调用target对应的函数的时候需要的参数对应的元组。如果需要一个实参,元组就给一个元素,如果需要两个实参,元组就给两个元素,...
"""
t1 = Thread(target=download, args=('午夜凶铃',))
t2 = Thread(target=download, args=('上海堡垒',))
t3 = Thread(target=download, args=('沉默的羔羊',))# 2)启动线程: 线程对象.start()
t1.start()
t2.start()
t3.start()

三、图虫图片异步下载

from selenium.webdriver import Chrome
import time
from lxml import etree
from threading import Thread
import requests
import os
from datetime import datetimeb = Chrome()def download_image(url):print(f'开始下载.....:{datetime.now()}')res = requests.get(url)image_name = os.path.basename(url)open(f'files/{image_name}', 'wb').write(res.content)print(f'图片下载完成!{datetime.now()}')def get_html():# 1. 获取图片地址b.get('https://stock.tuchong.com/topic?topicId=50346')time.sleep(1)html = etree.HTML(b.page_source)result = html.xpath('//div[@class="justified-layout"]/div/div/@data-lazy-url')# 2. 下载图片print('==================开始下载===================')for img_url in result:t = Thread(target=download_image, args=('https:'+img_url,))t.start()if __name__ == '__main__':get_html()

四、线程阻塞

1、阻塞线程 - 等到某个线程的任务结束才接着执行

线程对象.join()

from datetime import datetime
import time
from random import randint
from threading import Threaddef download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(randint(2, 7))print(f'{name}下载结束:{datetime.now()}')# =========================华丽的分割线===============================
# t1 = Thread(target=download, args=('肖申克的救赎',))
# t2 = Thread(target=download, args=('触不可及',))
# t3 = Thread(target=download, args=('头脑特工队',))
# t4 = Thread(target=download, args=('恐怖游轮',))# 需求1: 等到四个电影都下载完成(四个子线程都结束)才打印'电影全部下载完成'
# t1.start()
# t2.start()
# t3.start()
# t4.start()
#
# t1.join()
# t2.join()
# t3.join()
# t4.join()
# print('============电影全部下载完成===============')# 需求2:第1个电影下载完成后才开始下载第2、3、4个电影
# t1.start()
# t1.join()
#
# t2.start()
# t3.start()
# t4.start()# =========================华丽的分割线===============================
names = ['肖申克的救赎', '触不可及', '头脑特工队', '恐怖游轮']
ts = []
for name in names:t = Thread(target=download, args=(name,))t.start()ts.append(t)for t in ts:t.join()# 要求: 所有电影都下载结束打印 '全部下载完成'
print('=============全部下载完成=============')

五、豆瓣电影多线程获取数据

import requests
from threading import Thread
from bs4 import BeautifulSoup
import csvdef get_one_page(url):headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}res = requests.get(url, headers=headers)soup = BeautifulSoup(res.text, 'lxml')all_li = soup.select('ol.grid_view>li')page_data = []for li in all_li:name = li.select_one('.title').textscore = li.select_one('.rating_num').textpage_data.append([name, score])# 方案一:获取完一页数据就往文件中写一页数据# writer.writerows(page_data)# 方案二:获取完一页数据后将数据添加到保存所有数据的大列表中all_data.extend(page_data)print('======一页数据获取完成=====')if __name__ == '__main__':# 1. 创建csv文件对应的writerwriter = csv.writer(open('files/豆瓣电影2.csv', 'w', encoding='utf-8', newline=''))writer.writerow(['名字', '评分'])# 方案二:all_data = []# 2. 多线程下载数据urls = [f'https://movie.douban.com/top250?start={x}&filter=' for x in range(0, 250, 25)]ts = []for url in urls:t = Thread(target=get_one_page, args=(url,))t.start()ts.append(t)for t in ts:t.join()print('===================全部完成====================')# 方案二:all_data.sort(key=lambda item: float(item[-1]), reverse=True)writer.writerows(all_data)

六、多进程

1、多进程

一个应用程序默认只有一个进程(主进程),每一个进程中默认有一个线程(主线程);

一个程序可以有多个进程(除了主进程以外的进程叫子进程),任何一个进程中又可以有多个线程。

如果希望程序中有子进程,需要自己创建进程对象(创建的进程中都自带一个线程)

2、使用多进程

def download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(2)print(f'{name}下载结束:{datetime.now()}')# 注意:如果想要使用多进程,必须在程序中添加这个if语句
if __name__ == '__main__':# 1)创建进程对象p1 = Process(target=download, args=('肖生克的救赎',))p2 = Process(target=download, args=('惊魂记',))p3 = Process(target=download, args=('7号房的礼物',))# 2)启动进程p1.start()p2.start()p3.start()# 3)进程阻塞p1.join()p2.join()p3.join()print('下载完成!')

七、多进程爬京东数据

import time
from selenium.webdriver import Chrome, ChromeOptions
from multiprocessing import Process
from selenium.webdriver.common.keys import Keysoptions = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})def get_one_goods(name):b = Chrome(options=options)b.get('https://www.jd.com')search = b.find_element_by_id('key')search.send_keys(name)search.send_keys(Keys.ENTER)time.sleep(30)if __name__ == '__main__':goods = ['运动鞋', '笔记本电脑']for x in goods:p = Process(target=get_one_goods, args=(x,))p.start()

爬虫day7多线程和多进程相关推荐

  1. python爬虫之多线程、多进程+代码示例

    python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪 ...

  2. python爬虫用多线程还是多进程_python爬虫之多线程、多进程爬虫

    多线程对爬虫的效率提高是非凡的,当我们使用python的多线程有几点是需要我们知道的: countdown是一个计数的方法,正常执行它,我们一般使用countdown(10),就可以达到执行的目的,当 ...

  3. io密集型和cpu密集型_一次说明白Python爬虫中多线程,多进程,异步IO编程

    图/文:迷神 我们在Python爬虫中,重要的是讲究速度,如果有10万或者100万Url地址,写过爬虫的都会知道,那估计是非常慢的.我们的Python爬虫一般IO密集型业务,Python爬虫程序需要发 ...

  4. day7 多线程和多进程

    多线程和多进程 01 . 什么是线程和进程 什么是进程 - 工厂 一个正在运行的应用程序就是一个进程. 每一个进程均运行在其钻用且受保护的内存(运行内存)中 什么是线程 - 工人 线程就是进程执行任务 ...

  5. python爬虫之多线程、多进程爬虫

    一.原因 多线程对爬虫的效率提高是非凡的,当我们使用python的多线程有几点是需要我们知道的: 1.Python的多线程并不如java的多线程,其差异在于当python解释器开始执行任务时,受制于G ...

  6. 人人美剧迅雷链接多线程和多进程爬虫分析

    人人美剧迅雷链接多线程和多进程爬虫分析 浅谈GIL cpu计算密集型 IO密集型 普通裸奔 多线程 多进程+多线程 总结 浅谈GIL 使用python中的多线程就不得不聊聊GIL,基于cpython, ...

  7. python爬虫之多线程threading、多进程multiprocessing、协程aiohttp 批量下载图片

    一.单线程常规下载 常规单线程执行脚本爬取壁纸图片,只爬取一页的图片. import datetime import re import requests from bs4 import Beauti ...

  8. 爬虫-python -(8) 多线程与多进程操作以及线程池 异步操作

    文章目录 1.通过异步操作提高爬虫效率 2.多线程 3.多进程 4.线程池与进程池 5.线程池实例-新发地菜价保存 6.总结 1.通过异步操作提高爬虫效率 一般爬虫过程为,请求网页-响应请求-从响应中 ...

  9. 网络爬虫--18.python中的GIL(全局解释器锁)、多线程、多进程、并发、并行

    参考文献: python的GIL.多线程.多进程 并发和并行的区别? GIL(全局解释器锁)一看就懂的解释! 多谢作者分享!

最新文章

  1. (转)软件测试的分类软件测试生命周期
  2. 技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?
  3. IOS-React-Native:unable to find utility instruments, not a developer tool or in PATH
  4. 解决启动Oracle9i的OEM或OMS的常见问题(VTK-1000)
  5. 交互神器 Facebook Origami
  6. QML中定义JavaScript资源
  7. SVN switch 用法详解
  8. 关于递归函数,非递归函数中引用传参的问题
  9. 保存hbitmap到文件
  10. pip安装软件 Command “python setup.py egg_info“ failed with error code 1 in
  11. ReportViewer教程(11)-给报表特定的内容设置颜色
  12. sql语句ding_SQL语句映射文件增删改查、参数、缓存
  13. 外接圆、内切圆半径公式及相应关系知识点总结
  14. win10定时语音提醒
  15. 2020 给你 8 个接私活的网站
  16. 【2018慢性病与信息大会】周脉耕:信息化助力基层慢病管理
  17. 关于ES6中let 和 const 命令的用法以及注意事项:
  18. 【OCR】文字检测:传统算法、CTPN、EAST
  19. func() takes 0 positional arguments but 1 was given
  20. 趣味编程:从字符串中提取信息

热门文章

  1. 年少青春聊作狂,且作豪歌志四方
  2. 三位分节制顺口溜_数学顺口溜(大全)
  3. 《月亮与六便士》中文版读后感
  4. 【UI设计】UI参考网站
  5. Shift键连按4下后键盘长按才有反应
  6. VMCentOS7安装切换国内源
  7. 金三银四真的是跳槽良机吗?资深人才从不根据月份跳槽
  8. 自我发展:个体时代如何释放自我价值
  9. 解决elasticsearch分片unassigned的3个方法
  10. footer吸底效果css