文章目录

  • 一、认识爬虫
  • 二、常见反爬及其应对措施总结
  • 三、http协议
  • 0.网络七层协议
  • 1.http协议特点
  • 2.http工作过程
  • 3.http协议和https协议的区别
  • 4.http通信的组成
  • 5.关于响应常见的响应码
  • 6.客户端请求
  • 7.服务器响应
  • 四、统一资源定位符url
  • 五、当在浏览器输入一个url,为什么可以加载出一个页面?
  • 六、介绍cookie和session
  • 七、关于response乱码问题
  • 1.response的常用属性
  • 2.response.text乱码问题
  • 八、介绍代理
  • 1.代理的作用
  • 2.代理根据匿名程度的分类
  • 九、介绍json数据
  • 1.数据的分类
  • 2.json的本质
  • 3. json使用
  • 十、正则表达式
  • 十一、介绍xml
  • 1.xml的基本知识
  • 2.html和xml区别
  • 十二、selenium
  • 十三、线程,进程和协程
  • 1.定义
  • 2.进程与线程区别
  • 3.协程
  • 4.互斥锁
  • 5.死锁
  • 6.GIL锁(全局解释器锁)
  • 十四、scrapy分布式爬虫框架
  • 1.scrapy框架简介
  • 2.Scrapy优缺点
  • 3.scrapy的组件
  • 4.scrapy-redis
  • 十五、 爬虫框架或者爬虫过程中使用的模块有哪些?
  • 十六、写爬虫是用多进程还是多线程?
  • 十七、怎么监控爬虫的状态
  • 十八、TCP和UDP协议的区别


一、认识爬虫

1.什么是爬虫?
自动的抓取互联网上信息的脚本文件。

2.爬虫遵循的协议
robot协议,可以告诉我们网站哪里可以爬,哪里不可以爬

3.爬虫可以解决的问题

  • 解决新网站的冷启动问题;
  • 网站的搜索引擎一般是使用爬虫;
  • 对爬取的数据进行数据分析;

4.爬虫的分类

  • 通用爬虫:搜索引擎的主要组成,作用就是将互联网的上页面整体的爬取下来之后,保存到本地。
  • 聚焦爬虫:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。

二、常见反爬及其应对措施总结

( 1)通过请求头的一些特征来判断是否为爬虫

  • user-agent被检测,那可以找一些常见的user-agent放入列表,然后每次爬取随机选一个。
  • referer检测,这种情况就是我们可以将其设置为网站首页或者百度这些的,具体看网站。

(2)通过访问频率来判断是否是一个爬虫。

  • 一般就是设置抓取时间间隔。

(3)爬取频繁将ip进行封禁。

  • 使用代理IP来解决。

(4)验证码反爬

  • 简单的图形验证码:使用常见的一些模块去识别。例如ddddocr
  • 滑块验证码:这个不同网站难度不同,大概流程就是获取图片,识别距离,算出轨迹,轨迹加密,结果校验。主要难度就是轨迹和轨迹的加密。
  • 点选验证码:还是识别,计算坐标,加密。
  • 旋转验证码:主要是计算旋转率。
  • 其他验证码:谷歌验证码,无感验证码等等

(5)cookie限制

  • 对于cookie有效时间长的,可以通过手动登录,然后把cookie添加至headers里
  • 对于cookie有效时间短的,就得进行模拟登陆了,可以通过selenium或者过协议的方式
  • 其他须知:
    ①有的cookie登录前后字符串不变,可能是对方网站后台加的判断
    ②有的cookie和设备是进行绑定的,可通过多个设备机器进行解决
    ③有的cookie和IP进行绑定,可通过代理ip解决

(6)请求参数js加密

  • 1.简单的小网站,可以试试selenium+phantomjs来加载js获取数据
  • 2.断点调试抠算法,看看值的长度是不是有特征,例如32md5,40位sha1等等,没有特征再进行下一步。当然对于难得网站就会涉及补环境这些了。
  • 3.实在抠不出来,可以考虑下rpc解决。

(7)抓包加密

  • app抓不到包或者pc微信抓不到包,解决办法就是找大佬

三、http协议

0.网络七层协议

python3 网络爬虫开发实战pdf 崔庆才 python网络爬虫技术答案_python

1.http协议特点

  • http协议是超文本传输协议
  • http协议是一个应用层协议
  • 无连接:每次请求都是独立的。
  • 无状态:表示客户端每次请求都不能记录请求状态,就是两条请求直接不可通信

2.http工作过程

  • url进行域名解析,将url解析出对应的内容
  • 封装http请求数据包
  • 封装成TCP包,建立TCP连接(TCP的三次握手)
  • 客户端发送请求
  • 服务器接收请求,发送响应
  • 客户端接收到响应,进行页面渲染
  • 服务器关闭tcp连接(TCP的四次挥手)

3.http协议和https协议的区别

  • http协议是使用明文数据传输的网络协议,明文传输会让用户存在一个非常大的安全隐患。端口80
  • HTTPS协议为HTTP协议的安全升级版,是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议。比http 协议更安全。端口443

4.http通信的组成

客户端请求消息 与 服务器响应消息

5.关于响应常见的响应码

状态码

意义

常见举例1

常见举例2

1xx

表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程

100 :服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求

101 :服务器将遵从客户的请求转换到另外一种协议

2xx

表示服务器成功接收请求并已完成整个处理过程

200:OK 请求成功

201 :请求被创建完成,同时新的资源被创建

3xx

重定向

302:所请求的页面已经临时转移至新的url

303 :所请求的页面可在别的url下被找到

4xx

客户端错误

403:对被请求页面的访问被禁止

404:服务器无法找到被请求的页面

5xx

服务器错误

500:请求未完成。服务器遇到不可预知的情况

504 :网关超时。

6.客户端请求

①组成:请求行、请求头部、空行、请求数据四个部分组成

②常见的请求方法:get,post,put,delete

③get和post的区别

GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

get

post

get是从服务器获取数据

post是向服务器提交数据

get参数拼接在url后面,这样是明文传输,很不安全。

post的参数放在body体内,相比get比较安全

get提交可以被浏览器缓存

post不会被浏览器缓存

get产生一个TCP数据包(对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据))

POST产生两个TCP数据包(而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 (返回数据))

传输大小会受限

参数是放在是实体里面,而且参数大小不会受限

④常见的请求头

User-Agent:客户端请求标识。
Accept: 传输文件类型。
Referer :请求来源。
cookie (cookie):在做登录的时候需要封装这个头。
Content-Type (POST数据类型)

7.服务器响应

①组成:状态行,响应头,空行,响应正文。

②常见的响应头

Content-Type:text/html;资源文件的类型,还有字符编码
Content-Length:响应长度
Content-Size响应大小
Content-Encoding告诉客户端,服务端发送的资源是采用什么编码的。
Connection:keep-alive这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求

四、统一资源定位符url

基本格式:scheme://host[:port#]/path/…/?query-string
          协议://服务器ip地址:[端口号]/资源路径/?key1=参数1&key2=参数2

五、当在浏览器输入一个url,为什么可以加载出一个页面?

客户端请求到服务器的时候,该页面中包含了很多页面资源,例如css、js、图片,视频,音乐等资源,会分别请求这些资源。

  • 当我们在浏览器输入一个url,客户端会发送这个url对应的一个请求到服务器获取内容
  • 服务器收到这个请求,解析出对应内容,之后将内容封装到响应里发送到客户端
  • 当客户端拿到这个html页面,会查看这个页面中是否有css、js、image等url,如果有,在分别进行请求,获取到这些资源。
  • 客户端会通过html的语法,将获取到的所有内容完美的显示出来。

六、介绍cookie和session

  • 产生原因:由于http是一个无状态的协议,每次请求如果需要之前的一些信息,无法记录,因此为了解决这个问题,产生了一种记录状态技术------cookie和session
  • cookie指某些网站为了辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据,种类有会话cookie和持久cookie
  • (1)会话cookie指存在浏览器内存的cookie,当浏览器关闭,会话cookie会失效
  • (2)持久cookie是保存在硬盘上的cookie
  • session用来存储特定的用户会话所需的属性及其配置信息。
  • cookie是在客户端记录状态,session是在服务端记录状态
  • 联系:当客户端发送一个cookie,服务器会从这个cookie中找到sessionID,再查找出相应的session信息返回给客户端,来进行用户页面的流转。如果通过sessionID来查找session的时候,发现没有session(一般第一次登陆或者清空了浏览器),那么就会创建一个session。

七、关于response乱码问题

1.response的常用属性

1.获取字符串类型的响应正文: response.text
2.获取bytes类型的响应正文: response.content
3.响应正文字符串编码:response.encoding
4.状态码:response.status_code
5.响应头:response.headers

2.response.text乱码问题

#方法一:转换成utf-8格式  
response.encoding='utf-8'  
print(response.text) 

#方法二:解码为utf-8 :
with open('index.html','w',encoding='utf-8') as fp:
	fp.write(response.content.decode('utf-8'))

八、介绍代理

1.代理的作用

  • 突破自身IP访问限制, 访问一些平时不能访问的站点。
  • 访问一些单位或团体内部资源: 比如使用教育网内地址段免费代理服务器, 就可以用于对教育网开放的各类FTP 下载上传, 以及各类资料查询共享等服务。
  • 提高访问速度: 通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取屮信息传给用户,以提高访问速度。
  • 隐藏真实IP : 上网者也可以通过这种方法隐藏自己的IP ,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的被封锁。

2.代理根据匿名程度的分类

代理

介绍

高度匿名代理

会将数据包原封不动地转发, 在服务端看来就好像真的是一个普通客户端在访问, 而记录的IP 是代理服务器的IPO

普通匿名代理

会在数据包上做一些改动, 服务端上有可能发现这是个代理服务器, 也有一定几率追查到客户端的真实伊代理服务器通常会加人的HITP 头有HTTP_VIA 和HTTP_X_FORWARDED FOR 。

透明代理

不但改动了数据包, 还会告诉服务器客户端的真实IPO 这种代理除了能用缓存技术提高浏览速度, 能用内容过滤提高安全性之外, 并无其他显著作用, 最常见的例子是内网中的硬件防火墙。

间谍代理

指组织或个人创建的用于记录用户传输的数据, 然后进行研究、监控等目的的代理服务器。

九、介绍json数据

1.数据的分类

种类

特点

结构化数据

数据以行为为单位,一行数据表示一个实体信息,每一行的数据饿属性是相同的。常见关系型数据库中以表存储的数据就是结构化数据

半结构化数据

结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔个语义元素以及对记录和字段进行分层,因此也被称为自描述的结构。常见的半结构化数据有:xml,html,json

非结构化数据

1.没有固定的结构,常见的非结构化数据有:文档,图片和视频等。 2.对于非结构数据,一般我们整体存储二进制格式

2.json的本质

json是一个字符串,json是对js对象的字符串表达式,它使用文本形式表示一个JS对象的信息。

3. json使用

(1)json.dumps(list/dict)   将python的list或者dict返回为一个json字符串
(2)json.dump(list/dict,fp)   将python的list或者dict转为一个json字符串,保存到文件中

(3)json.loads(json字符串)    将json字符串返回为python的list或者dict
(4)json.load(fp)            从json文件中读出json数据,并转换为python的list或者dict。

十、正则表达式

1.贪婪和非贪婪

  • 正则默认是贪婪模式,所以数量控制符默认是取最大值,也是贪婪。例如*
  • 非贪婪是用?来控制,尽量匹配最少的次数,0次或一次

2.python使用格式:

pattern=re.compile('正则表达式') 
print(pattern.match(字符串,start,end))#默认从头开始匹配,只匹配一次,返回一个match对象
print(pattern.search(字符串,start,end))#从任意位置开始匹配,只匹配一次,返回一个match对象
print(pattern.findall(字符串,start,end))#全文多次匹配,将匹配到的结果放到一个list返回给我们
print(pattern.finditer(字符串,start,end))#全文多次匹配,将匹配到的结果放到一个match对象的迭代器返回

3.常见的正则题目

python3 网络爬虫开发实战pdf 崔庆才 python网络爬虫技术答案_开发语言_02

十一、介绍xml

1.xml的基本知识

  • 定义:xml称为可拓展性标记语言,类似 HTML
  • 特点:xml具有自描述特性,是一种半结构化数据
  • 作用:XML 的设计宗旨是传输数据,而非显示数据。可以作为配置文件使用来记录一些重要信息。
  • 注意:XmL 的标签需要我们自行定义。

2.html和xml区别

语法方面:

  • 在html中不区分大小写,在xml中严格区分大小写
  • 在html中,在某些情况可以省略闭合标签。在xml中,绝对不能省略任何标记。
  • 在xml中,单标签结尾处需要加’/'。
  • 在xml中,空白部分不会被解析器自动删除,但是html是过滤掉空格的
  • 在xml中,属性值必须封装在引号中。在html中,引号可用可不用。
  • 在html中属性名可以不带属性值,xml必须带属性值而且不能为空

标记不同:

  • html使用固有的标记,xml没有固有标记

作用不同

  • xml主要用来传输数据,html主要用来显示数据

十二、selenium

  • Selenium 是一个 Web 的自动化测试工具,可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
  • Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行, 所以 我们可以用一个PhantomJS 的工具代替真实的浏览器。
  • PhantomJS 是一个无界面浏览器,它会把网站加载到内存并执行页面上的 js,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。相比传统的 Chrome或 Firefox 浏览器等,资源消耗会更少。 但是这个不更新了,大部分还是使用谷歌的无头驱动。

十三、线程,进程和协程

1.定义

名字

定义

python中的类名

通信

状态

线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

threading

通过队列Queue

新建-就绪–运行-阻塞-死亡

进程

一个程序的执行实例就是一个进程。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合)一个进程有至少一个线程。

multiprocessing

通过队列Queue

新建-就绪–运行-阻塞-死亡

2.进程与线程区别

  1. 同一个进程中的所有线程共享内存空间和数据,但是进程之间是独立的。
  2. 对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。
  3. 线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。
  4. 同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。
  5. 创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。
  6. 一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。
  7. 线程启动速度快,进程启动速度慢。
  8. IO密集型用多线程,CPU密集型用多进程

3.协程

yield:线程和进程的操作是由程序触发系统接口,最后的执行者是系统,它本质上是操作系统提供的功能。而协程的操作则是程序员指定的,在python中通过yield,人为的实现并发处理。

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时。协程,则只使用一个线程,分解一个线程成为多个“微线程”,在一个线程中规定某个代码块的执行顺序。

协程的适用场景:当程序中存在大量不需要CPU的操作时(即IO使用较多情况下)。

常用第三方模块: gevent和greenlet。(gevent是对greenlet的高级封装,一般用它就行,是一个相当高效的模块。)

4.互斥锁

定义:由于同一个进程中的所有线程共享资源和内存,当多个线程同时修改某一个共享数据的时候,需要进行同步控制。线程同步能够保证多个线程安全访问“竞争资源”,最简单的同步机制就是引用互斥锁。

互斥锁:由于线程共享进程的内存空间和数据,因此在某个线程要共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性。互斥锁体现的就是一个同步的机制,即该线程释放资源就是一个条件,条件完成,才能执行下一步操作。是微观的操作

锁的好处:

  • 确保了某段代码只能由一个线程从头到尾完整地执行。
  • 保证了全局变量的安全

锁的坏处:

  • (1)阻止了多线程的并发执行,包含锁的某段代码实际上只能以单线程模块执行,效率降低。
  • (2)由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁的时,可能会造成“死锁”。

5.死锁

  • (1)同一个线程先后两次调用lock,在第二次调用时,由于锁已经被自己占用,该线程会挂起等待自己释放锁,由于该线程已被挂起而没有机会释放锁,因此 它将一直处于挂起等待状态,变为死锁;
  • (2)线程A获得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程B释放锁2,而这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线程A和B都在等待对方释放自己才释放,从而造成两个都永远处于挂起状态,造成死锁。

6.GIL锁(全局解释器锁)

  • GIL的存在是由于CPython解释器的设计和实现方式。在CPython中,GIL是一种互斥锁,用于保护Python对象和内存管理机制,以防止多个线程同时访问和修改Python解释器的内部状态。GIL确保在任何给定时间点只有一个线程能够执行Python字节码指令,即使在多核处理器上也是如此。
  • GIL只对CPython解释器有效,其他Python解释器可能采用不同的实现方式,如Jython和IronPython不受GIL限制。
  • 由于GIL的存在,尽管Python支持多线程编程,但在同一时间只有一个线程能够真正地执行Python字节码。这意味着多线程程序无法利用多核处理器的并行性来提高计算密集型任务的性能。然而,GIL对于I/O密集型任务并不是那么严重,因为I/O操作涉及等待外部资源,此时可以释放GIL给其他线程执行。
  • 在CPU密集型任务中,多线程的性能提升有限,因为多个线程无法同时执行Python字节码。
  • 在I/O密集型任务中,多线程可以提供一定的性能优势,因为线程可以并发地执行I/O操作。

十四、scrapy分布式爬虫框架

1.scrapy框架简介

scrapy 是一个快速、高层次的基于 python 的 web 爬虫构架,它用于抓取web站点并从页面中提取结构化的数据。scrapy 使用了 Twisted异步网络库来处理网络通讯。

2.Scrapy优缺点

优点:

  • scrapy 是基于twisted异步网络框架处理的,速度快。
  • 采取可读性更强的xpath代替正则
  • 自带统计和log系统
  • 支持shell方式,方便独立调试
  • 支持中间件,可以针对不同情况进行不同处理。

缺点:

  • 扩展性比较差
  • 异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。

3.scrapy的组件

python3 网络爬虫开发实战pdf 崔庆才 python网络爬虫技术答案_爬虫_03

4.scrapy-redis

scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。

redis数据库的优点

1.数据读取快,因为数据都放在内存上
2.支持事务watch
3.数据持久化,支持快照和日志,方便恢复数据
4.拥有丰富的数据类型:list,string,set,qset,hash
5.支持主从复制,可以进行数据备份
6.丰富的特性:可以作为缓存,消息队列,设置过期时间,到期自动删除

分布式爬虫主要解决什么问题?

ip、带宽、cpu、io

scrapy-redis如何实现分布式抓取?

  • 在分布式爬取时,会有master机器和slave机器,其中,master为核心服务器,slave为具体的爬虫服务器。
  • 我们在master服务器上搭建一个redis数据库,并将要抓取的url存放到redis数据库中,所有的slave爬虫服务器在抓取的时候从redis数据库中去链接,由于scrapy_redis自身的队列机制,slave获取的url不会相互冲突,然后抓取的结果最后都存储到数据库中。master的redis数据库中还会将抓取过的url的指纹存储起来,用来去重。相关代码在dupefilter.py文件中的request_seen()方法中可以找到。

十五、 爬虫框架或者爬虫过程中使用的模块有哪些?

  • Python自带:urllib,urllib2
    urlliburllib2模块都做与请求URL相关的操作,但他们提供不同的功能。
    urllib2:urllib2.urlopen可以接受一个Request对象或者url,(在接受Request对象时候,并以此可以来设置一个URL 的headers),urllib.urlopen只接收一个url
    urllib 有urlencode,urllib2没有,因此总是urllib,urllib2常会一起使用的原因
  • 第 三 方:requests
    requests 是一个HTTP库, 它只是用来,进行请求,对于HTTP请求,他是一个强大的库,下载,解析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现.
  • 框 架:Scrapy,feapder
  • 解析:Xpath、正则

十六、写爬虫是用多进程还是多线程?

  • IO密集型情况使用多线程
  • 计算密集型情况下使用多进程

解释: IO 密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有 IO 操作会进行 IO 等待,造成不必要的时间浪费,而开启多线程能在线程 A 等待时,自动切换到线程 B,可以不浪费 CPU 的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身 机器的硬件情况,来设置多进程或多线程。

十七、怎么监控爬虫的状态

  • 邮箱通知
  • 钉钉机器人通知
  • 企业微信机器人通知
  • 日志模块
  • 配合数据库进行可视化监测

十八、TCP和UDP协议的区别

  • tcp的目的是提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接,tcp在数据包接收无序,丢失或在交付期间被破坏时,负责数据的恢复,tcp面向连接,如打电话要先拨号建立连接,udp则是无连接的,即发送数据之前不需要建立连接。
  • tcp提供可靠的服务,通过tcp连接传送的数据能无差错,不丢失、不重复、且按序到达,而udp是尽最大努力交付,但不保证可靠交付,每一条tcp连接只能是点到点的,而udp支持一对一,一对多,多对一和多对多的交互通信。