整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

听说你的资源被盗用了,那你知道 Nginx 怎么防盗链吗?

单有效的防盗链手段

场景

如果做过个人站点的同学,可能会遇到别人盗用自己站点资源链接的情况,这就是盗链。说到盗链就要说一个 HTTP 协议的 头部,referer 头部。当其他网站通过 URL 引用了你的页面,用户在浏览器上点击 URL 时,HTTP 请求的头部会通过 referer 头部将该网站当前页面的 URL 带上,告诉服务器本次请求是由谁发起的。

例如,在谷歌中搜索 Nginx 然后点击链接:

在打开的新页面中查看请求头会发现,请求头中包含了 referer 头部且值是 https://www.google.com/。

像谷歌这种我们是允许的,但是有一些其他的网站想要引用我们自己网站的资源时,就需要做一些管控了,不然岂不是谁都可以拿到链接。

目的

这里目的其实已经很明确了,就是要拒绝非正常的网站访问我们站点的资源。

思路

  • invalid_referer 变量referer 提供了这个变量,可以用来配置哪些 referer 头部合法,也就是,你允许哪些网站引用你的资源。

referer 模块

要实现上面的目的,referer 模块可得算头一号,一起看下 referer 模块怎么用的。

  • 默认编译进 Nginx,通过 --without-http_referer_module 禁用

referer 模块有三个指令,下面看一下。

Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location

Syntax: referer_hash_bucket_size size;
Default: referer_hash_bucket_size 64; 
Context: server, location

Syntax: referer_hash_max_size size;
Default: referer_hash_max_size 2048; 
Context: server, location
  • valid_referers 指令,配置是否允许 referer 头部以及允许哪些 referer 访问。
  • referer_hash_bucket_size 表示这些配置的值是放在哈希表中的,指定哈希表的大小。
  • referer_hash_max_size 则表示哈希表的最大大小是多大。

这里面最重要的是 valid_referers 指令,需要重点来说明一下。

valid_referers 指令

可以同时携带多个参数,表示多个 referer 头部都生效。

参数值

  • none允许缺失 referer 头部的请求访问
  • block:允许 referer 头部没有对应的值的请求访问。例如可能经过了反向代理或者防火墙
  • server_names:若 referer 中站点域名与 server_name 中本机域名某个匹配,则允许该请求访问
  • string:表示域名及 URL 的字符串,对域名可在前缀或者后缀中含有 * 通配符,若 referer 头部的值匹配字符串后,则允许访问
  • 正则表达式:若 referer 头部的值匹配上了正则,就允许访问

invalid_referer 变量

  • 允许访问时变量值为空
  • 不允许访问时变量值为 1

实战

下面来看一个配置文件。

server {
	server_name referer.ziyang.com;
    listen 80;

	error_log logs/myerror.log debug;
	root html;
	location /{
		valid_referers none blocked server_names
               		*.ziyang.com www.ziyang.org.cn/nginx/
               		~\.google\.;
		if ($invalid_referer) {
    			return 403;
		}
		return 200 'valid\n';
	}
}

那么对于这个配置文件而言,以下哪些请求会被拒绝呢?

curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/
curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/
curl -H 'referer: ' referer.ziyang.com/
curl referer.ziyang.com/
curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/
curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/
curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/
curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/

我们需要先来解析一下这个配置文件。valid_referers 指令配置了哪些值呢?

 valid_referers none blocked server_names
        *.ziyang.com www.ziyang.org.cn/nginx/
        ~\.google\.;
  • none:表示没有 referer 的可以访问
  • blocked:表示 referer 没有值的可以访问
  • server_names:表示本机 server_name 也就是 referer.ziyang.com 可以访问
  • *.ziyang.com:匹配上了正则的可以访问
  • www.ziyang.org.cn/nginx/:该页面发起的请求可以访问
  • ~\.google\.:google 前后都是正则匹配

下面就实际看下响应:

# 返回 403,没有匹配到任何规则
➜  ~ curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.8</center>
</body>
</html>
➜  ~ curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.8</center>
</body>
</html>
# 匹配到了 *.ziyang.com
➜  ~ curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/
valid
➜  ~ curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/
valid
# 匹配到了 server name
➜  ~ curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/
valid
# 匹配到了 blocked
➜  ~ curl -H 'referer: ' referer.ziyang.com/
valid
# 匹配到了 none
➜  ~ curl referer.ziyang.com/
valid
# 匹配到了 ~\.google\.
➜  ~ curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/
valid

防盗链另外一种解决方案:secure_link 模块

referer 模块是一种简单的防盗链手段,必须依赖浏览器发起请求才会有效,如果攻击者伪造 referer 头部的话,这种方式就失效了。

secure_link 模块是另外一种解决的方案。

它的主要原理是,通过验证 URL 中哈希值的方式防盗链。

基本过程是这个样子的:

  • 由服务器(可以是 Nginx,也可以是其他 Web 服务器)生成加密的安全链接 URL,返回给客户端
  • 客户端使用安全 URL 访问 Nginx,由 Nginx 的 secure_link 变量验证是否通过

原理如下:

  • 哈希算法是不可逆的
  • 客户端只能拿到执行过哈希算法的 URL
  • 仅生成 URL 的服务器,验证 URL 是否安全的 Nginx,这两者才保存原始的字符串
  • 原始字符串通常由以下部分有序组成:资源位置。如 HTTP 中指定资源的 URI,防止攻击者拿到一个安全 URI 后可以访问任意资源用户信息。如用户的 IP 地址,限制其他用户盗用 URL时间戳。使安全 URL 及时过期密钥。仅服务器端拥有,增加攻击者猜测出原始字符串的难度

模块:

  • ngx_http_secure_link_module未编译进 Nginx,需要通过 --with-http_secure_link_module 添加
  • 变量secure_linksecure_link_expires
Syntax: secure_link expression;
Default: —
Context: http, server, location

Syntax: secure_link_md5 expression;
Default: —
Context: http, server, location

Syntax: secure_link_secret word;
Default: —
Context: location

变量值及带过期时间的配置示例

  • secure_link值为空字符串:验证不通过值为 0:URL 过期值为 1:验证通过
  • secure_link_expires时间戳的值

命令行生成安全链接

  • 生成 md5
echo -n '时间戳URL客户端IP密钥' | openssl md5 -binary | openssl base64 | tr +/ - | tr -d =
  • 构造请求 URL
/test1.txt?md5=md5生成值&expires=时间戳(如 2147483647)

Nginx 配置

  • secure_link $arg_md5,$arg_expires;secure_link 后面必须跟两个值,一个是参数中的 md5,一个是时间戳
  • secure_link_md5 "$secure_link_expires$uri$remote_addr secret";按照什么样的顺序构造原始字符串

实战

下面是一个实际的配置文件,我这里就不做演示了,感兴趣的可以自己做下实验。

server {
	server_name securelink.ziyang.com;
    listen 80;
	error_log  logs/myerror.log  info;
	default_type text/plain;
	location /{
		secure_link $arg_md5,$arg_expires;
        secure_link_md5 "$secure_link_expires$uri$remote_addr secret";

        if ($secure_link = "") {
            return 403;
        }

        if ($secure_link = "0") {
            return 410;
        }

		return 200 '$secure_link:$secure_link_expires\n';
	}

	location /p/ {
        secure_link_secret mysecret2;

        if ($secure_link = "") {
            return 403;
        }

        rewrite ^ /secure/$secure_link;
	}

	location /secure/ {
		alias html/;
    	internal;
	}
}

仅对 URI 进行哈希的简单办法

除了上面这种相对复杂的方式防盗链,还有一种相对简单的防盗链方式,就是只对 URI 进行哈希,这样当 URI 传

  • 将请求 URL 分为三个部分:/prefix/hash/link
  • Hash 生成方式:对 “link 密钥” 做 md5 哈希
  • 用 secure_link_secret secret; 配置密钥

命令行生成安全链接

  • 原请求link
  • 生成的安全请求/prefix/md5/link
  • 生成 md5echo -n 'linksecret' | openssl md5 –hex

Nginx 配置

  • secure_link_secret secret;

这个防盗链的方法比较简单,那么具体是怎么用呢?大家都在网上下载过资源对吧,不管是电子书还是软件,很多网站你点击下载的时候往往会弹出另外一个页面去下载,这个新的页面其实就是请求的 Nginx 生成的安全 URL。如果这个 URL 被拿到的话,其实还是可以用的,所以需要经常的更新密钥来确保 URL 不会被盗用。

者:Java3y

原文:转载自微信公众号,Java3y

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

为什么要学HTTP?

我们绝大多数的Web应用都是基于HTTP来进行开发的。我们对Web的操作都是通过HTTP协议来进行传输数据的。

简单来说,HTTP协议就是客户端和服务器交互的一种通迅的格式

HTTP的诞生主要是为了能够让文档之间相互关联,形成超文本可以互相传阅

可以说,Http就是Web通信的基础,这是我们必学的。

HTTP基础概念

我们学计算机网络的时候就知道,我们把计算机网络分层了5层,一般我们现在用的都是TCP/IP这么一个分层结构。

虽然官方的是ISO 提出的7层结构,但是仅仅是理论基础,在实际上大多人都是使用TCP/IP的分层结构

首先,我们先得知道,为什么我们要在计算机网络中分层次???

因为如果两台计算机能够相互通信的话,实际实现起来是非常困难操作的…我们分层的目的就是为了将困难的问题简单化,并且如果我们分层了,我们在使用的时候就可以仅仅关注我们需要关注的层次,而不用理会其他层

如果需要改动设计的时候,我们只需要把变动的层替换即可,并不用涉及到其他的层次。这与我们程序设计中的低耦合是一个概念。

而我们的HTTP协议是在最上层,也就是应用层。这是最贴近我们的程序员的层次。

网站通信粗略过程

我们知道HTTP是在应用层中的,显然,我们在Web通信的过程中,不仅仅是需要HTTP协议的,还会涉及到其他的协议的

DNS:负责解析域名

  • 我们访问一个网页的时候,往往是通过域名来访问的www.zhongfucheng.site,而计算机通信只认的是我们的主机地址(192.168.xxx.xxx),因此,当我们输入域名的时候,需要DNS把域名解析成主机来进行访问。


HTTP:产生请求报文数据

  • 当我们对Web页面进行操作的时候,就会产生HTTP报文数据,请求对应的服务端进行响应。

这里写图片描述

TCP协议:分割HTTP数据,保证数据运输

  • TCP协议采用了三次握手的方式来保证数据的准确运输,在运输的数据的时候,发送标识过去给服务器,服务器也返回标识给客户端,而客户端收到消息后再次返回标识给服务器。这样一来就保证了数据运输是可靠的。


IP协议:传输数据包,找到通信目的地地址。

  • IP协议把我们的产生的数据包发送给对方,IP地址指明了节点被分配的地址,但IP地址可能会变换,我们可以使用ARP协议来将IP地址反射为MAC地址。MAC地址是不会更改的,是网卡所属的固定地址。
  • 在找到通信目的地之前,我们是需要不断的中转的,这过程我们称作为:“路由中转”,我们并不知道路由中转了多少次的。因此是不能全面了解到互联网中的传输状况的。


接下来就离我们比较远了,属于硬件相关的了,也就是链路层和物理层。以后复习到计算机网络的时候再来补充吧!

我们网页上请求数据就是上边这么一个流程

告知服务器请求的意图

我们如果开发过Web程序的话,我们知道常用的提交方式有POST和GET方法

我们也知道GET是用来获取数据的,POST是用来提交数据的。

其实HTTP协议中还支持着其他的方法,比如:Input、Delete、OPTIONS很多这样的方法。而由于常用,于是我们也可能仅仅知道GET和POST方法了。

HTTP提供方法的目的就是为了告知服务器该客户端想进行什么操作。当HTTP是OPTIONS方法的时候,服务器端就会返回它支持什么HTTP方法。

当然了,现在RESTful盛行,也就是充分利用了HTTP协议的这些方法

HTTP是不保存状态的协议

HTTP是无状态的,也就是说,它是不对通信状态进行保存的。它并不知道之前通信的对方是谁。这样设计的目的就是为了让HTTP简单化,能够快速处理大量的事务!

但是,我们经常是需要知道访问的人是谁,于是就有了Cookie技术了。

  • 要是服务器端想要记住客户端是谁,那么就颁发一个cookie给客户端
  • 客户端把Cookie保存在硬盘中,当下次访问服务器的时候,浏览器会自动把客户端的cookie带过去。
  • 就这样,服务器就能够知道这家伙是谁了。


持久连接

在HTTP1.0的时候,每一次进行HTTP通信就会断开一次连接。如果容量很少的文本传输是没有问题的。但是如果我们访问一个网页,该网页有非常多的图片。一个图片就算上一个HTTP请求了。那么在中途中就不断地建立TCP连接、获取图片、断开TCP连接。

这样是非常浪费资源的,因此在HTTP1.1版本,就是持久连接了。一次HTTP连接能够处理多个请求

持久连接为“管线化”方式发送成为了可能:在一次HTTP连接里面,不需要等待服务器响应请求,就能够继续发送第二次请求

提升传输效率

在说明之前,首先我们要知道什么是实体主体

  • 实体主体就是作为数据在HTTP中传输的数据


一般地,实体主体可以等价为报文主体,报文主体是HTTP中的一部分

我们如果不使用任何手段,服务器返回的数据实体主体是原样返回的。我们可以使用两种方式来提高传输效率

  • 使用压缩技术把实体主体压小,在客户端再把数据解析
  • 使用分块传输编码,将实体主体分块传输,当浏览器解析到实体主体就能够显示了。

我们如果在下载东西的过程中断了,按照以前我们是需要重新下载的,但是现在可以在中断中继续下载。我们可以使用到获取范围数据,这种叫做范围请求

这种请求只会下载资源的一部分。

  • 比如我的图片下载到一半了,我们只需要下载另一半就可以组成一张完整的图片了。那么请求的时候请求没有下载的一部分即可。


常用的状态码简述

2XX

一般是请求成功

200 正常处理

204 成功处理,但服务器没有新数据返回,显示页面不更新

206 对服务器进行范围请求,只返回一部分数据

3XX

一般表示重定向

301 请求的资源已分配了新的URI中,URL地址改变了。【永久重定向】

302 请求的资源临时分配了新的URI中,URL地址没变【转发】

303 与302相同的功能,但明确客户端应该采用GET方式来获取资源

304 发送了附带请求,但不符合条件【返回未过期的缓存数据】

307 与302相同,但不会把POST请求变成GET

4XX

表示客户端出错了。

400 请求报文语法错误了

401 需要认证身份

403 没有权限访问

404 服务器没有这个资源

5XX

服务器出错了

500 内部资源出错了

503 服务器正忙

服务器与客户端之间的应用程序

首先要说的是,一个HTTP服务器可以拥有多个站点,也就是说:HTTP下可以配置多个虚拟主机。当用户访问不同主机的时候,实际上都是访问同一台HTTP服务器。

在客户端和服务器中还有一些用于通信数据转发的应用程序

  • 代理
  • 可以用来缓存数据,当代理缓存了数据以后,客户端就可以直接用代理获取数据
  • 可以用来对网站进行访问控制,获取访问日志记录
  • 网关
  • 能够提供非HTTP请求的操作,访问数据库什么的
  • 隧道
  • 建立一条安全的通信路径,可以使用SSL等加密手段进行通信。

HTTP首部简述

HTTP请求报文

HTTP请求报文:在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分组成。

  1. 请求行【描述客户端的请求方式请求的资源名称,以及使用的HTTP协议版本号
  2. 首部字段【描述客户端请求哪台主机,以及客户端的一些环境信息等】
  3. 一个空行

首部字段例子:

  • Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】
  • Accept-Charset: ISO-8859-1 【浏览器告诉服务器,它支持哪种字符集
  • Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式
  • Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】
  • Host: www.it315.org:80【浏览器告诉服务器,它的想访问哪台主机】
  • If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,缓存数据的时间】
  • Referer: http://www.it315.org/index.jsp【浏览器告诉服务器,客户机是从那个页面来的---反盗链
  • 8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【浏览器告诉服务器,浏览器的内核是什么】
  • Cookie【浏览器告诉服务器,带来的Cookie是什么
  • Connection: close/Keep-Alive 【浏览器告诉服务器,请求完后是断开链接还是保持链接】
  • Date: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,请求的时间】

HTTP响应报文

HTTP响应报文:在响应中,HTTP报文由HTTP版本、状态码(数字和原因短语)、HTTP首部字段3部分组成。

  1. 一个状态行【用于描述服务器对请求的处理结果。
  2. 首部字段【用于描述服务器的基本信息,以及数据的描述服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据
  3. 一个空行
  4. 实体内容【服务器向客户端回送的数据

状态行:

  • 格式: HTTP版本号 状态码 原因叙述
  • 状态行:HTTP/1.1 200 OK
  • 状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类


首部字段例子:

  • Location: http://www.it315.org/index.jsp 【服务器告诉浏览器要跳转到哪个页面
  • Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】
  • Content-Encoding: gzip 【服务器告诉浏览器数据压缩的格式
  • Content-Length: 80 【服务器告诉浏览器回送数据的长度】
  • Content-Language: zh-cn 【服务器告诉浏览器,服务器的语言环境】
  • Content-Type: text/html; charset=GB2312 【服务器告诉浏览器,回送数据的类型
  • Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】
  • Refresh: 1;url=http://www.it315.org【服务器告诉浏览器要定时刷新
  • Content-Disposition: attachment; filename=aaa.zip【服务器告诉浏览器以下载方式打开数据
  • Transfer-Encoding: chunked 【服务器告诉浏览器数据以分块方式回送】
  • Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie
  • Expires: -1【服务器告诉浏览器不要设置缓存
  • Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存
  • Pragma: no-cache 【服务器告诉浏览器不要设置缓存
  • Connection: close/Keep-Alive 【服务器告诉浏览器连接方式】
  • Date: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器回送数据的时间】

对于HTTP首部这一部分是非常庞大的一个章节,知识点也很多,我就没有一一去记录了。用到的时候再查吧。我看的是《图解HTTP》。

HTTPS简述

HTTP在安全上是不足的

  • 通信使用明文【没有加密过内容的】
  • 不验证通信方身份,无论是客户端和服务器,都是随意通信的
  • 无法证明报文的完整性【别人监听后,可以篡改】

我们一般在上网时,使用抓包工具就很容易获取到HTTP请求的信息了,这是TCP/IP在网络通信中无法避免的。

假设我们对HTTP报文进行加密了, 那也仅仅是是内容的加密。别人获取到了HTTP内容了,即使无法破解HTTP内容,还是能够篡改的。

我们最好就是使用SSL建立安全的通信线路,就可以在这条线路上进行HTTP通信了。

其实HTTPS就是披着SSL的HTTP…

HTTPS使用的是共享密钥和公开私有密钥混合来进行加密的。由于公开私有密钥需要太多的资源,不可能一直以公开私有密钥进行通信。因此,HTTP在建立通信线路的时候使用公开私有密钥,当建立完连接后,随后就使用共享密钥进行加密和解密了

对于认证方面,HTTPS是基于第三方的认证机构来获取认受认可的证书、因此,可以从中认证该服务器是否是合法的。

而客户端方面则需要自己购买认证证书、这实施起来难度是很大的【认证证书需要钱】。

所以,一般的网站都是使用表单认证就算了,这是用得最广泛的客户端认证了。

Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注

习Python也有一段时间了,在学习过程中不断的练习学到的各类知识,做的最多的还是爬虫,也就是简单的数据采集,有采集图片(这个最多了。。。),有下载电影的,也有学习相关的比如ppt模板的抓取,当然也写过类似收发邮件,自动登录论坛发帖,验证码相关操作等等!

这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,在此总结一下,也共享给正在学习的小伙伴

安装相关

python的各个版本其实分别并不大,所以不用太纠结用3.6还是3.7.

而我们经常使用的库呢,建议大家学到什么库安装什么库

有的同学会纠结,库安装不上的问题,这个推荐大家百度搜索:python whl 第一个就是吧,在里面有各个库的各个版本,选择对应的下载回来,用pip install 文件完整路径 安装即可!

最基本的抓站——获取源代码

import requests#导入库

html = requests.get(url)#获取源代码

适用于静态网页

网站反“反爬”

大部分的网站(各类中小型网站)都会需要你的代码有headers的信息,如果没有,会直接拒绝你的访问!大型网站反而很少,尤其是门户网站,比如新浪新闻、头条图集、百度图片的爬虫,基本没有什么反爬措施,相关内容可以看看我的其他文章!

而有反爬措施的网站,大部分可以按加入UA信息——加入HOST、Referer(反盗链)信息的顺序加入到headers数据(字典格式)中来尝试!代码格式 requeststs.get(url,headers=headers)

UA信息是浏览器信息,告诉对方服务器我们是什么浏览器,平时可以收集下相关信息做个UA池,需要的时候调用就可以,也可以随机调用,防止被网站发现,注意的是如果是移动端,一定要注意移动端的网页和pc端的不一样,比如做微博爬虫,我们就比较喜欢移动端,它的反爬力度比pc端的要低很多,也提醒大家,如果一个网站反爬很厉害,你可以去看看移动端(手机登录然后复制url),也许会有惊喜!

ua信息

HOST信息, 网站的主机信息,这个一般是不变的

Referer信息 ,这个就是“反盗链”的关键信息,简单的说,就是你是从哪里到当前页面的,破解也很简单,把url放到里面就行!

如果上述办法还是绕不过反爬,那么就麻烦一些,把headers里面的信息都写进去吧

终极反“反爬”:去学习selenium吧少年!

保存文件

其实可以简单的分两大类:字符串内容保存和其他内容保存!那么简单的2中代码就可以解决

a+为文末追加写入模式,适用于字符串内容的写入,注意排版,也可以在'a+'后面添加参数encoding='utf-8'指定保存文本的编码格式

wb为二进制写入模式,适用于找到对象的真实下载地址后用二进制方式下载文件

未完待续

篇幅有限,本来想写完的,但是有人和我说,写的太多没人看。。。这就很尴尬了!那就先写到这里吧!

也正好有时间重新整理下后面的内容,大概有:自动登录(cookie池)和保持登录、ip代理、验证码(这个是大项)以及scarpy框架的一些注意事项。

有其他技巧或者疑问的同学,也可以在评论区写上,咱们一起讨论哦!