嫌多(线程/进程)太慢? 嫌Scrapy太麻烦?没事,异步高调走起!——瓜子二手车
并发与并行:(偏向于多线/进程方面的原理)
- 并发: 指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行
- 很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771 - 并行: 指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的
阻塞与非阻塞:(偏向于协程/异步的原理)
- 阻塞:阻塞状态指程序未得到所需计算资源时被挂起的状态。程序在等待某个操作完成期间,自身无法继续处理其他的事情,则称该程序在该操作上是阻塞的。
- 非阻塞:程序在等待某操作过程中,自身不被阻塞,可以继续处理其他的事情,则称该程序在该操作上是非阻塞的
同步与异步:
- 同步:不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,我们称这些程序单元是同步执行的。
- 异步:为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式,不相关的程序单元之间可以是异步的。
说了这么多,咱们列举一些他们相关的特点吧:
- 多线程(英语:multithreading):指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”
- 多进程(Multiprocessing):每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
- 二者的区别:线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。
- 协程(Coroutine):又称微线程、纤程,协程是一种用户态的轻量级线程。 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
基本的原理都已经了解了 ,那咱们不整一下,咋行?光说不练假把式,走起!!!
本节源码:[仓库地址]( https://github.com/Mr2753/PythonScrape/tree/master/GuaZI_Car )
首先先说一下基本的思路:
- 确定URL
- 发起请求,得到响应
- 解析响应,提取数据、
- 保存数据
确定URL:
本次请求的URL(先放地址了!)
https://www.guazi.com/cs/buy/o2/#bread
根据以上可知,URL:https://www.guazi.com/{cs}/buy/o{page}/#bread ,更具改变cs改变城市,一线城市为前拼音两个字母(例如:长沙/cs 、湘潭/xiangtan),第一页为o1,第二个为o2。以此类推
发送请求:
1 2 3 4 5 |
async def scrape(self, url): async with self.semaphore: async with aiohttp.ClientSession(headers=self.header).get(url) as response: await asyncio.sleep(1) return await response.text() |
注意:再次加入请求头,本网站对Cookies有严格的检测。且并不能挂IP代理访问
解析响应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
async def parse(self, html): with open('car.csv', 'a+', encoding='utf-8') as f: doc = pq(html) for message in doc('body > div.list-wrap.js-post > ul > li > a').items(): # 汽车简介 car_name = message('h2.t').text() # 汽车详情(年限、里程、服务) car_info = message('div.t-i').text() year = car_info[:5] mileage = car_info[6:-5] service = car_info[13:].replace('|', '') # 价格 try: price = message('div.t-price > p').text() except AttributeError: price = message('em.line-through').text() car_pic = message('img').attr('src') data = f'{car_name}, {year},{mileage}, {service}, {price}n' logging.info(data) f.write(data) |
我这里是直接一步到位了,解析响应,以及保存数据。
运行之后即可看到类似于这样的东东
嫌多(线程/进程)太慢? 嫌Scrapy太麻烦?没事,异步高调走起!——瓜子二手车相关推荐
- 打开线程 | 进程 | 协程的大门
不知从几何起,可能是大三那年的操作系统考试,也可能是刚经历完的秋招,这些概念总是迷迷糊糊,可能自己回答的和其他人的答复也差不多,并没有什么亮点,通常都会以:「我们换个题」的方式结束,有时候也挺尴尬的. ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...
- python的线程如何启用和结束_python线程进程
操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入 输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节 ...
- android线程安全ppt,线程进程安全.ppt
线程进程安全.ppt 第三章 线程 进程安全 进程和线程是两个范围不同的概念 进程是程序在计算机上的一次执行活动 运行一个程序 相当于启动了一个进程 进程是操作系统进行资源分配的单位 通俗地讲 是一个 ...
- QNX----第2章 QNX Neutrino 线程 进程与调度策略(1部分)
QNX Neutrino RTOS的实现 从历史上看,QNX的软件系统的"应用压力"是由内存有限的嵌入式系统从内存有限的嵌入式系统中得到的,一直到高端的SMP(对称多处理器)计算机 ...
- 0816(032天 线程/进程03 一点细节+线程池)
0816(032天 线程/进程03 一点细节+线程池) 每日一狗(田园犬西瓜瓜) 线程/进程03 一点细节+线程池 文章目录 0816(032天 线程/进程03 一点细节+线程池) 线程/进程03 一 ...
- 十四丶并发编程(线程 进程 协程)
Yuan先生 知识预览 操作系统 回到顶部 操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系 ...
- linux 线程 进程经典文章
进程是程 序在计算机上的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是 死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程.凡是用于完成操作系统的各种功能的进程就是 ...
- PHP 会话 线程 进程,接上节我们来了解了解多进程的一些基础进程 / 线程 / 多进程 / 父进程 / 子进程 / 会话 / 控制终端等...
多进程的一些基础 定义 进程/父进程/子进程 进程是资源调度和分配的一个独立单元 进程是由线程组成 即等于 一个进程 = 一个线程. 进程是由另一个进程创建 (系统进程 init进程除外) 所以会出现 ...
最新文章
- 标准氨基酸和质子化氨基酸 三字母 单字母 对应表
- mysql三锁,mysql锁机制之表锁(三)
- Design Pattern IDisposable Pattern C
- MIGO相关的3个BADI增强点
- 网上教育能改变教育不公平的现状吗?
- C#实现ByteBuffer类 .
- 如何不让Oracle使用Linux的swap分区
- vmware下安装rhel5
- 图解WebGLThree.js工作原理
- H3C的静态路由、Track与NQA联动配置举例
- 高数_关于e两个重要的积分公式
- android 修改imei源码,Android 修改imei、gps等信息分析
- 【软件工程】实验七:建立功能模型--自行车租赁管理系统
- C语言 | 条件运算符
- U盘无法与计算机连接,连接电脑后为什么u盘不显示 连接电脑后u盘不显示原因【图文】...
- SQL Server无法以local 登陆问题的解决方法provider: Named Pipes Provider, error: 40 - Could not open a connection
- Centos7.x上安装cerebro
- 基于elementUI封装了基础表单组件
- C语言指针进阶(中)
- 无线网络安全标准(转)