爬虫学习笔记
![图片](/img/截屏2024-12-24 20.46.44.png “图片title”)
scheme:协议,常用的协议有http、https、ftp等,另外scheme也被常称作protocol。
某些情况下URL需要提供用户名和密码才能访问。
端口:有些URL中没有端口信息,这是使用了默认的端口。http协议的默认端口是80,https协议的默认端口是443。所以https://www.baidu.com
其实相当于https://www.baidu.com:443
。
path:网络资源在服务器中的指定路径。
query:用来查询某类资源,多个查询用&隔开。
fragment:可以理解为资源内部的书签,目前两个主要的应用:单页面路由,例如Vue、React,另一个应用是HTML锚点,控制页面滚动到特定的位置。
Https是以安全为目标的Http通道,在http下加入SSL层(secure socket layer)。https的安全基础是SSL,通过该协议传输的内容都是经过SSL加密的。SSL的主要作用有:建立一个信息安全通道,保证数据传输的安全性。确认网站的安全性。
在浏览器的地址栏输入一个URL,按下回车之后,浏览器向网站所在的服务器发送一个请求(request),网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应(response),接着传回浏览器。响应里包含页面的源代码等内容。
浏览器中Network面板中,一个条目就代表一次发送请求和接收响应等过程。
在浏览器中直接输入URL并回车,便发起了一个GET请求,请求的参数会直接包含在URL里。POST请求大多在提交表单时发起,例如登录时。POST请求的数据包含在请求体中。上传文件时,由于文件内容较大,因此也会采用POST方式。
请求头:说明服务器要使用的附加信息。常用的请求头:
请求头 | 注释 |
---|---|
Accept | 请求报头域 |
Accept-Language | 客户端可接受的语言类型 |
Accept-Encoding | 客户端可接受的内容编码 |
Host | 请求资源的主机IP和端口号 |
Cookies | 网站进行会话跟踪而存储在用户本地的数据。主要功能是维持当前访问会话。 |
Referer | 标识请求从哪个页面发过来的,服务器可以用来做来源统计、防盗链处理等 |
User-Agent | 操作系统及版本、浏览器及版本等。爬虫加上此信息可以伪装为浏览器 |
Content-Type | 具体请求中的媒体类型信息,例如:text/html,image/gif,application/json |
请求体,一般承载的内容是POST请求中的表单数据。
Content-Type和POST提交数据方式的关系:
Content-Type | POST提交数据的方式 |
---|---|
application/x-www-form-urlencoded | 表单数据 |
multipart/form-data | 表单文件上传 |
application/json | 序列化JSON数据 |
text/xml | XML数据 |
爬虫中,构造POST请求需要使用正确的Content-Type,并了解设置各种请求库的各个参数时使用的都是哪种Content-Type,否则可能导致POST提交后无法得到正常响应。
常用的响应头:
响应头 | 注释 |
---|---|
Date | 响应产生的时间 |
Last-Modified | 资源的最后修改时间 |
Content-Encoding | 响应内容的编码 |
Server | 服务器的信息,名称、版本号等 |
Content-Type | 返回的数据是什么类型 |
Set-Cookie | 告诉浏览器需要将此内容放在Cookie中,下次请求时将Cookie携带上 |
Expires | 响应的过期时间,再次访问相同内容时,可以直接从缓存中加载。 |
响应体,可以说是最关键的部分,响应的正文数据都存在响应体中。爬虫请求网页时,要解析的内容就是响应体。
HTML相当于骨架,CSS相当于皮肤,JavaScript相当于肌肉。
HTML中,标签之间的布局常由布局标签div嵌套组合而成。
CSS,层叠样式表。”层叠“指当HTML中引用了多个样式文件,并且样式发生冲突时,浏览器能够按照层叠顺序处理这些样式。
HTML中所有标签定义的内容都是节点,这些节点构成一个HTML节点树,也叫HTML DOM树(Document Object Model)文档对象模型。节点树中的所有节点均可通过JavaScript访问,所以HTML节点元素均可被修改、创建或删除。
CSS选择器,可以根据id、class、标签名选择。用空格把各个选择器分隔开便可以代表嵌套关系。选择器之间不加空格,则代表并列关系。
另外还有一种常用的选择器XPath
有时我们得到的源代码和在浏览器中实际看到的不一样,有些网页是采用Ajax,前端模块化工具构建的,可能整个网页都是从JavaScript渲染出来的。对于这种情况,我们可以分析源代码后台Ajax接口,也可使用Selenium、Splash、Pyppeteer、Playwright这样的库来模拟JavaScript渲染。
两种用于保持HTTP连接状态的技术分别是Session和Cookie。Session在服务端,用来保存用户的Session信息,Cookie在客户端,有了Cookie,浏览器在下一次访问相同网页时就会自动附带上它,服务器通过识别Cookie鉴定出是哪个用户在访问,然后判断此用户是否处于登录状态,并返回对应的响应。
爬虫中,处理需要先登录才能访问的页面时,一般会直接将登录成功后获取的Cookie放在请求头里面直接请求。
Session,会话。用户在页面之间跳转时,存储在Session对象中的变量将不会丢失。
Session维持:客户端第一次请求服务器时,服务器会返回一个响应头中带有Set-Cookie字段的响应,这个字段用来标记用户。浏览器会把Cookie保存起来,当下一次请求相同的网站时,把保存的Cookie放到请求头中益气提交给服务器。Cookie中携带着Session ID相关信息,服务器判断Session辨认用户状态。如果传给服务器的Cookie是无效的,或者Session已经过期了,客户端将不能继续访问页面,可能会受到错误的响应或者跳转到登录页面重新登录。
Session不会轻易消失,就像生活中的会员卡,除非主动销卡,否则店家不会轻易删除顾客资料。
爬虫有时会出现403之类的错误,可能由于IP访问频率太高而被封IP。代理服务器是代网络用户取得网络信息。代理是网络信息的中转站。
代理可以通过协议或匿名程度分类:
根据协议区分,FTP、HTTP、SSL/TLS、RTSP、Telnet、POP3/SMTP、SOCKS(单纯传递数据包,不关心具体协议和用法。又分为SOCKS4和SOCKS5,4只支持TCP,5支持TCP和UDP,5还支持各种身份验证机制、服务器端域名解析)。
根据匿名程度区分,高度匿名、普通匿名(服务端可能发现正在访问自己的是代理服务器。这里代理服务器通常会加入的HTTP头有HTTP_VIA和HTTP_X_FORWARDED_FOR)、透明、间谍。
进程可以理解为一个可以独立运行的程序单位,例如打开一个浏览器,就开启了一个浏览器进程。在一个进程中,可以同时处理很多事情,例如有的页面播放音乐,有的页面播放视频,这些任务可以同时运行,一个任务就对应一个线程。
进程就是线程的集合,线程是操作系统进行运算调度的最小单位,是进程中的最小运行单元。多线程就是一个进程中同时执行多个线程。
处理器同一时刻只能执行一条指令,并发concurrency指多个线程对应的多条指令被快速轮换的执行。并行parallel指同一时刻有多条指令在多个处理器上同时执行。
多线程:在一个程序的进程中,有一些操作是比较耗时或者需要等待的,例如查询数据库。使用多线程,处理器可以在某个线程处于等待态时,执行其他线程。
爬虫有一段时间需要等待服务器返回响应,这种任务属于IO密集型任务,适合使用多线程。而计算密集型任务不适合使用多线程。
python中GIL的限制导致不论在单核还是多核条件下,同一时刻都只能运行一个线程,无法发挥多核并行的优势。GIL是全局解释器锁,设计之初是出于对数据安全的考虑。某个线程想要执行必须拿到GIL,在一个python进程中GIL只有一个。每个进程都有属于自己的GIL,所以多进程能够发挥多核优势。
对IO密集型任务来说,多线程和多进程产生的影响差别不大。但对于计算密集型任务来说,多线程的运行效率在多核下可能反而比单核低。
python基本库
urllib库
实现HTTP请求的发送,可以指定请求的URL、请求头、请求体等信息。还可以把服务器返回的响应转化为Python对象。response = urllib.request.urlopen('https://www.python.org')
加入data参数,POST请求
1 |
|
data参数需要使用bytes将参数转化为字节流编码格式的内容。bytes方法第一个参数是字符串,所以要使用urlencode将字典转化为字符串。
urlopen方法功能较少,如果需要加入Headers等信息,需要使用更强大的Request类。
1 |
|
还是用urlopen来发送请求,将之前的URL改为Request对象。Request可以传入headers请求头字典,里面可以加入User-Agent。
requests库
Session可以模拟同一个会话。通常在模拟登录成功之后,进行下一步操作时用到。