技能要求复习-面试Python爬虫

专业技能:

  • 熟练使用python
  • 熟悉Linux工作环境、熟练使用Shell及常用命令
  • 熟悉Django框架,参与过项目研发
  • 熟悉TCP/IP、UDP、HTTP、Socket
  • 熟悉深/浅拷贝、线程/进程/协程的区别
  • 熟练使用re、xpath、pyquery、BeautifulSoup、MySQL、Fiddler
  • 熟悉SQLite、Redis、MongoDB
  • 熟悉HTML、CSS、JavaScript
  • 熟悉Git开发流程
  • 有过C#、C、ARM汇编的开发经验

熟练使用python

Python小知识总结
6类数据结构:

  • 不可变类型:字符串、数、元组tuple
  • 可变类型:列表、集合、字典
  • 字典的键不能是可变类型

单、双、三引号的区别:

  • 单、双引号无区号能相互包含
  • 三引号可跨行、保留换行符,可作注释

global 修改全局变量

爬虫流程、设计到的库:

  1. 通过URL获取网站的返回信息:requests
  2. 定位数据:re、xpath、pyquery、BeautifulSoup
  3. 存储数据:pymysql, pymongo

熟练使用re、xpath、pyquery、BeautifulSoup、MySQL、Fiddler

pass

熟悉Linux工作环境、熟练使用Shell及常用命令

Linux三剑客的基本使用

老大awk,最擅长取列,老二sed,最擅长取行,老三grep最擅长过滤

熟悉Django框架,参与过项目研发

基于MVC的设计MTV,MTV是Model、Template、View三个单词的简写,分别代表模型、模版、视图。

熟悉HTML、CSS、JavaScript

熟悉TCP/IP、UDP、HTTP、Socket

socket,tcp,http三者之间的区别和原理

  • TCP三次握手、四次挥手
服务器 客户端 建立通道、处于listen状态 主动发起连接请求 回复请求 确认请求 服务器 客户端
客户端 服务器 主动发起断开请求 回复请求 发送完最后一字节数据后,发起主动断开请求 确认请求 客户端 服务器
  • 请求报文包含三部分:

    • 请求行:包含请求方法、URI、HTTP版本信息
    • 请求首部字段
    • 请求内容实体
  • 响应报文包含三部分:

    • 状态行:包含HTTP版本、状态码、状态码的原因短语
    • 响应首部字段
    • 响应内容实体

熟悉深/浅拷贝

python直接赋值、浅拷贝与深拷贝的区别解析

'''
1. 直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
2. copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变
3. 深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
'''
import copy
raw = [1,2,3,["a","b"]]

rawBak = raw
rawCopy = copy.copy(raw)
rawDeepCopy = copy.deepcopy(raw)

raw.append(5)
raw[3].append("c")

print("raw:\t\t", raw)
print("rawBak:\t\t", rawBak)
print("rawCopy:\t", rawCopy)
print("rawDeepCopy:", rawDeepCopy)

''' resultPrint
raw:		 [1, 2, 3, ['a', 'b', 'c'], 5]
rawBak:		 [1, 2, 3, ['a', 'b', 'c'], 5]
rawCopy:	 [1, 2, 3, ['a', 'b', 'c']]
rawDeepCopy: [1, 2, 3, ['a', 'b']]
'''

熟悉线程/进程/协程的区别

进程,线程,协程与并行,并发

进程
进程的出现是为了更好的利用CPU资源使到并发成为可能。 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费。聪明的老大们就在想若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行。注意关键字切换,自然是切换,那么这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录任务A和任务B分别需要什么资源,怎样去识别任务A和任务B等等。登登登,进程就被发明出来了。通过进程来分配系统资源,标识任务。如何分配CPU去执行进程称之为调度,进程状态的记录,恢复,切换称之为上下文切换。进程是系统资源分配的最小单位,进程占用的资源有:地址空间,全局变量,文件描述符,各种硬件等等资源。

线程
线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容)。若有多个进程,每个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的任务,进程C负责保存内容到硬盘中的任务。这里进程A,B,C间的协作涉及到了进程通信问题,而且有共同都需要拥有的东西-------文本内容,不停的切换造成性能上的损失。若有一种机制,可以使任务A,B,C共享资源,这样上下文切换所需要保存和恢复的内容就少了,同时又可以减少通信所带来的性能损耗,那就好了。是的,这种机制就是线程。线程共享进程的大部分资源,并参与CPU的调度, 当然线程自己也是拥有自己的资源的,例如,栈,寄存器等等。 此时,进程同时也是线程的容器。线程也是有着自己的缺陷的,例如健壮性差,若一个线程挂掉了,整一个进程也挂掉了,这意味着其它线程也挂掉了,进程却没有这个问题,一个进程挂掉,另外的进程还是活着。

协程
协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。 当涉及到大规模的并发连接时,例如10K连接。以线程作为处理单元,系统调度的开销还是过大。当连接数很多 —> 需要大量的线程来干活 —> 可能大部分的线程处于ready状态 —> 系统会不断地进行上下文切换。既然性能瓶颈在上下文切换,那解决思路也就有了,在线程中自己实现调度,不陷入内核级别的上下文切换。说明一下,在历史上协程比线程要出现得早,在1963年首次提出, 但没有流行开来。为什么没有流行,没有找到信服的资料,先挖个坑,以后那天了解后,再补上。

小结
进程,线程,协程不断突破,更高效的处理阻塞,不断地提高CPU的利用率。但是并不是说,线程就一定比进程快,而协程就一定不线程要快。具体还是要看应用场景。可以简单粗暴的把应用分为IO密集型应用以及CPU密集型应用。

多核CPU,CPU密集型应用
此时多线程的效率是最高的,多线程可以使到全部CPU核心满载,又避免了协程间切换造成性能损失。当CPU密集型任务时,CPU一直在利用着,切换反而会造成性能损失,即便协程上下文切换消耗最小,但也还是有消耗的。

多核CPU,IO密集型应用
此时采用多线程多协程效率最高,多线程可以使到全部CPU核心满载,而一个线程多协程,则更好的提高了CPU的利用率。

单核CPU,CPU密集型应用
单进程效率是最高,此时单个进程已经使到CPU满载了。

单核CPU,IO密集型应用
多协程,效率最高。例如,看了上面应该也是知道的了

并发与并行
并行
并行就是指同一时刻有两个或两个以上的“工作单位”在同时执行,从硬件的角度上来看就是同一时刻有两条或两条以上的指令处于执行阶段。所以,多核是并行的前提,单线程永远无法达到并行状态。可以利用多线程和度进程到达并行状态。另外的,Python的多线程由于GIL的存在,对于Python来说无法通过多线程到达并行状态。

并发
对于并发的理解,要从两方面去理解,1.并发设计 2.并发执行。先说并发设计,当说一个程序是并发的,更多的是指这个程序采取了并发设计。

并发设计的标准:使多个操作可以在重叠的时间段内进行 ,这里的重点在于重叠的时间内, 重叠时间可以理解为一段时间内。例如:在时间1s秒内, 具有IO操作的task1和task2都完成,这就可以说是并发执行。所以呢,单线程也是可以做到并发运行的。当然啦,并行肯定是并发的。一个程序能否并发执行,取决于设计,也取决于部署方式。例如, 当给程序开一个线程(协程是不开的),它不可能是并发的,因为在重叠时间内根本就没有两个task在运行。当一个程序被设计成完成一个任务再去完成下一个任务的时候,即便部署是多线程多协程的也是无法达到并发运行的。

并行与并发的关系: 并发的设计使到并发执行成为可能,而并行是并发执行的其中一种模式。

一个老师同一时间段辅导3个学生,并发。单核。
三个老师同时辅导3个学生,并行。多核。



熟悉SQLite、Redis、MongoDB

SQLite:一个轻量级、跨平台的关系型数据库,在嵌入式平台使用过
Redis:速度快

  • String——字符串
  • Hash——字典
  • List——列表
  • Set——集合
  • Sorted Set——有序集合

MongoDB:

  • 基于内存;
  • 数据结构简单,对数据操作也简单;
  • 操作数据是单线程,避免了不必要的上下文切换,没有锁机制,不用加锁解锁;
  • 多路复用:多个网络连接,复用同一个线程,单线程处理多个请求,尽量减少网络IO的时间消耗。

熟悉Git开发流程

有过C#、C、ARM汇编的开发经验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
出现-352错误通常是由于Python爬虫程序在请求网页时遇到了错误或异常。具体的错误信息可能会有所不同,需要查看具体的错误提示来确定问题的原因。以下是一些常见的导致-352错误的可能原因和解决方法: 1. 网络连接问题:-352错误可能是由于网络连接问题导致的。可以尝试检查网络连接是否正常,或者尝试使用其他网络环境进行测试。 2. 请求被拒绝:有些网站会对爬虫程序进行限制,可能会拒绝爬虫程序的请求。可以尝试使用代理IP或者设置合适的请求头信息来规避这种限制。 3. 验证码或人机验证:有些网站为了防止爬虫程序的访问,会设置验证码或人机验证。如果遇到这种情况,可以尝试使用自动识别验证码的库或者手动输入验证码来解决。 4. 网站反爬虫策略:一些网站会采取反爬虫策略,如设置访问频率限制、IP封禁等。如果遇到这种情况,可以尝试降低请求频率、使用代理IP或者模拟真实用户行为来规避反爬虫策略。 5. 网页结构变化:有些网站的网页结构可能会发生变化,导致爬虫程序无法正确解析网页内容。可以尝试更新爬虫程序的解析逻辑,适应网页结构的变化。 以上是一些常见的导致-352错误的原因和解决方法,具体的解决方法需要根据具体的情况来确定。如果你能提供更多的错误信息或代码片段,我可以给出更具体的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值