Python嫌多(线程/进程)太慢? 嫌Scrapy太麻烦?没事,异步高调走起!——瓜子二手车

基本概念了解:

不少人学习python,不知道从何学起。
不少人学习python,掌握了基本语法事后,不知道在哪里寻找案例上手。
不少已经作案例的人,殊不知道如何去学习更加高深的知识。
那么针对这三类人,我给你们提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789
html


并发与并行:(偏向于多线/进程方面的原理)

  • 并发: 指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具备多个进程同时执行的效果,但在微观上并非同时执行的,只是把时间分红若干段,使多个进程快速交替的执行
  • 并行: 指在同一时刻,有多条指令在多个处理器上同时执行。因此不管从微观仍是从宏观来看,两者都是一块儿执行的

阻塞与非阻塞:(偏向于协程/异步的原理)


  • 阻塞:阻塞状态指程序未获得所需计算资源时被挂起的状态。程序在等待某个操做完成期间,自身没法继续处理其余的事情,则称该程序在该操做上是阻塞的。
  • 非阻塞:程序在等待某操做过程当中,自身不被阻塞,能够继续处理其余的事情,则称该程序在该操做上是非阻塞的

同步与异步:

  • 同步:不一样程序单元为了完成某个任务,在执行过程当中需靠某种通讯方式以协调一致,咱们称这些程序单元是同步执行的。
  • 异步:为完成某个任务,不一样程序单元之间过程当中无需通讯协调,也能完成任务的方式,不相关的程序单元之间能够是异步的。

说了这么多,我们列举一些他们相关的特色吧:

  • 多线程(英语:multithreading):指从软件或者硬件上实现多个线程并发执行的技术。具备多线程能力的计算机因有硬件支持而可以在同一时间执行多于一个线程,进而提高总体处理性能。具备这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片断叫做“线程”(Thread),利用它编程的概念就叫做“多线程处理(Multithreading)”
  • 多进程(Multiprocessing):每一个正在系统上运行的程序都是一个进程。每一个进程包含一到多个线程。进程也多是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它能够在程序里独立执行。也能够把它理解为代码运行的上下文。因此线程基本上是轻量级的进程,它负责在单个程序里执行多任务。一般由操做系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不一样的工做,称为多线程.
  • 两者的区别:线程和进程的区别在于,子进程和父进程有不一样的代码和数据空间,而多个线程则共享数据空间,每一个线程有本身的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体状况而定. 线程的运行中须要使用计算机的内存资源和CPU。
  • 协程(Coroutine):又称微线程、纤程,协程是一种用户态的轻量级线程。 协程看上去也是子程序,但执行过程当中,在子程序内部可中断,而后转而执行别的子程序,在适当的时候再返回来接着执行。

    基本的原理都已经了解了 ,那我们不整一下,咋行?光说不练假把式,走起!!!python

    本节源码:[仓库地址]( https://github.com/Mr2753/PythonScrape/tree/master/GuaZI_Car )git

    首先先说一下基本的思路:github

    • 肯定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。以此类推并发

发送请求:异步

 

1async

2post

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)

我这里是直接一步到位了,解析响应,以及保存数据。

运行以后便可看到相似于这样的东东


若有疑问,我们评论区见