文章目录
- 写在前面
- 爬虫习惯
- web 网页渲染方式
- 服务器渲染
- 客户端渲染
- 反爬机制
- 使用session对象
- 使用cookie
- 让请求头信息更丰富
- 使用代理和随机延迟
写在前面
本文是对前两篇文章所介绍的内容的补充,在了解前两篇文章——《爬虫入门与requests库的使用》和《BeautifulSoup 库的使用》,对python 爬虫理论上的介绍后,再看本文,你将会有更加深刻的理解(大佬随意🎉
)。
爬虫习惯
在了解requests库
和BeautifulSoup 库
后,我们需要知道一些关于爬虫开发习惯和原则,以此来应对网页不同的渲染方式。
web 网页渲染方式
首先,要知道一般情况,web网页
会有两种渲染方法:
- 服务器渲染:在服务器那边,直接将
数据
与html页面代码
整合在一起,返回给浏览器-----在浏览器上的页面源代码
中能够找到对应的数据。 - 客户端渲染: 第一次请求服务器,只要一个
html
的骨架,第二次请求才会拿到对应的数据
,然后由客户端(浏览器)将html
和数据
整合在一起,展示出来-----在浏览器上的页面源代码
中找不到对应的数据。
服务器渲染
其次,BeautifulSoup 库
是用来处理爬取到的页面源代码(html
)的,若要爬取到网页源代码,就要知道其对应url
:
如上图所示,红框处不仅有url还有对应的参数信息
,以上方式适用于服务器渲染,即在页面源代码中找得到数据。
客户端渲染
另外一种情况就是客户端渲染,其依靠于浏览器抓包工具,如下图:
若想要爬取到上述红框
的数据,需要知道其对应的url,如下:
上图中的url
后面也携带了参数,但是我们一般不看,因为不方便,我们一般采用如下方式查看参数:
最重要的原则是:以上两个方式,
能直接爬取到数据,绝不爬取html页面
!!!
反爬机制
一般的网站都会有反爬机制,当我们通过爬虫进行爬取网站数据时,可能会触发该网站的反爬机制,通常情况下,返回状态码<403>,就表明触发了反爬机制,在反爬机制下,爬虫是无法再继续获取数据的,必须要用户亲自登录该网站才行,为此,我们必须尽可能地避免触发网站的反爬机制,而避免的方法有以下几种。
使用session对象
尽可能地使用Session(会话)对象来封装爬虫,而不是直接使用requests库来封装爬虫。
Session(会话) 的主要作用:
- 自动管理Cookie
当我们访问需要登录的网站时,首次登录后服务器会返回 Cookies
,后续请求需携带这些 Cookies
以维持登录状态。
而有了Session
后,Session
就可以自动保存和发送 Cookies
,无需手动处理。
session = requests.Session()
#创建一个持久化的会话对象# 向指定网址发送登录请求(自动保存 Cookies)
session.post("https://example.com/login", data={"user": "admin", "pass": "123"})
# post——提交用户名(user)和密码(pass)等参数
# 用Session对象发送post登录请求,Session对象可以自动接收并存储服务器返回的Cookies# 后续请求通过Session对象发出,请求将自动携带 Cookies
response = session.get("https://example.com/dashboard")
- 持久化公共参数
当我们有多个请求都需要相同的 Headers
(请求头)、超时时间
、认证信息
或代理
时,可以使用Session对象,一次性设置参数,所有通过 该Session对象
发起的请求自动继承这些参数。
session = requests.Session() #创建一个session对象session.headers.update({"User-Agent": "My Crawler/1.0"})
# 向session对象中添加一个请求头session.proxies = {"http": "http://10.10.1.10:3128"}
# 向session对象中添加一个代理# 所有请求自动携带 请求头 和代理
session.get("https://example.com/page1")
session.get("https://example.com/page2")
- 复用 TCP 连接(性能优化)
当我们高频次请求同一服务器时,重复建立和断开 TCP 连接会浪费资源,这个时候,我们可以通过Session
对象来对TCP连接进行复用,通过复用连接,可以减少延迟并提升效率。
# 未使用 Session:每次请求新建连接
for _ in range(10):requests.get("https://example.com") # 10 次独立连接# 使用 Session:复用同一连接(推荐使用)
with requests.Session() as session:for _ in range(10):session.get("https://example.com") # 更高效
4.保持请求上下文
某些网站会检查请求的连贯性(如反爬机制),我们可以通过session对象
来模拟浏览器行为,保持一致的上下文(如Referer、Cookies)。
注意事项:
- 会话对象需合理关闭(推荐用
with
语句管理资源)。- 如果请求不同网站且无需共享参数,直接使用
requests.get()
更轻量
使用cookie
提前登录你要爬取的网站,通过浏览器抓包,在你的登录后的任意请求的请求头中找到"cookie"
的字段或者在响应头中找到"set-cookie"
字段,将cookie
复制到你的代码中,作为爬虫伪装的请求头的一部分。
- 如上图,cookie的形式:
cookie名 = cookie值
,上图红框内有很多cookie
,有些是目标网站的,有些是第三方平台的。这里面不是所有cookie
都必须需要,其核心的cookie
为dbcl2
+ck
(登录相关)、bid
(反爬基础)。 - 此外,cookie的获取,还可以通过代码来实现:
response.cookies
,该代码作用是返回要爬取的网页的所有的cookie
。
如上图所示,只有一个cookie,cookie名为"bid"
,其值为tk6VyicFk4E
。
一般请求头中有了
cookie
,服务器就会默认此请求是一个用户发出的,而不是爬虫。
让请求头信息更丰富
对于爬虫伪装的请求头,信息要越丰富越好,一般必须有这两个字段"referer"
和
"User-Agent"
,其余字段视情况判断是否添加。
关于"User-Agent"
字段,可以使用 fake_useragent
库生成随机浏览器"User-Agent"
,这样能够增大绕开机制的可能。
from fake_useragent import UserAgent
import requestsua = UserAgent()
headers = {'User-Agent': ua.random} #随机生成的UA
response = requests.get(url, headers=headers)
使用代理和随机延迟
短时间高频请求触发会触发网站对该 IP地址的封禁,因此,我们要控制访问频率。
import requests
import time
import randomproxies = {"http": "http://10.10.1.10:3128", # 假设此为有效代理"https": "http://10.10.1.10:1080",
}# 随机延迟(1~3秒)
time.sleep(random.uniform(1, 3))response = requests.get(url, headers=headers, proxies=proxies)
注意:
- 以上,是一些常用的基本的绕开反爬机制的方法,但并不是全部,具体采用哪个方法,要根据你要爬取的网站的具体情况来判断。
- 各个方法之间,也不是独立的,可以相互配合使用,提高绕开反爬机制的可能。