一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

接着在终端通过命令:

sudo systemctl start nginx

即可启动 Nginx 服务。

备注:由于各个系统差别以及版本差异,安装和启动命令略有差别,解决办法自行搜索

Nginx 的日志

Nginx 为用户提供了日志功能,其中记录了每次服务器被请求的状态和其他信息,包括 User-Agent。 Nginx 的默认日志存放路径为:

/var/log/nginx/

在终端通过命令

cd /var/log/nginx && ls

可以进入到日志存放目录并列出目录下的文件,可以看到其中有两个主要的文件,为access.log 和 error.log

它们分别记录着成功的请求信息和错误信息。我们通过 Nginx 的访问日志来查看每次请求的信息。

发起请求的几种办法

浏览器

Nginx 启动后,默认监听 80 端口,你只需要访问 IP 地址或者域名即可。假设 IP 地址为127.0.0.1,那么可以在浏览器输入:

http://127.0.0.1

回车后,浏览器就会向服务器发起请求,和你平时上网是一样的。

Python 代码

这里我们利用 Requests 库来发起网络请求。在本地新建一个名为 gets.py的文件,其中代码为:

import requests
# 向目标发起请求,并打印返回的 http 状态码
resp = requests.get("http://127.0.0.1")
print(resp.status_code)

Postman

Postman是一款功能强大的网页调试与发送网页HTTP请求的工具(Postman下载地址),它可以模拟浏览器,访问指定的 Url 并输出返回内容,实际使用如下图所示:

Curl

这是一个利用URL语法在命令行下工作的传输工具,它不仅支持 url 地址访问还支持文件上传和下载,所以可以称它为综合传输工具。他也可以模拟浏览器,访问指定的 Url,实际使用如下图所示:

Nginx 日志记录结果

上面使用了 4 种方法来向服务器发起请求,那么我们看看 Nginx 的日志中,记录了什么样的信息。在终端通过命令:

sudo cat access.log

来查看日志文件。可以看到这几次的请求记录:

# 请求记录
127.0.0.1 - - [04/Nov/2018:22:19:07 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
127.0.0.1 - - [04/Nov/2018:22:19:07 +0800] "GET /favicon.ico HTTP/1.1" 404 200 "http://127.0.0.1/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
127.0.0.1 - - [04/Nov/2018:22:20:36 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
127.0.0.1 - - [04/Nov/2018:22:27:14 +0800] "GET /z_stat.php?id=1256772952&web_id=1256772952 HTTP/1.1" 404 144 "http://appstore.deepin.org/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) deepin-appstore/4.0.9 Safari/538.1"
127.0.0.1 - - [04/Nov/2018:22:42:10 +0800] "GET / HTTP/1.1" 200 396 "-" "PostmanRuntime/7.3.0"
127.0.0.1 - - [04/Nov/2018:22:42:51 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.60.0"

无论是 Python 还是 Curl 或者浏览器以及 Postman 的请求,都被记录在日志文件中,说明 Nginx 可以识别发起请求的终端类型。

实现反爬虫

之前的理论和逻辑,在实验中都得到了验证,那么接下来我们就通过黑名单策略将 Python 和 Curl 发起的请求过滤掉,只允许 Firefox 和 Postman 的请求通过,并且对被过滤的请求返回 403 错误提示。

反爬虫的过程如上图所示,相当于在服务器和资源之间建立了一道防火墙,在黑名单中的请求将会被当成垃圾丢弃掉。

配置 Nginx 规则

Nginx 提供了配置文件以及对应的规则,允许我们过滤掉不允许通过的请求,本次反爬虫我们使用的就是它。Nginx 的配置文件通常放在/etc/nginx/目录下,名为nginx.conf,我们通过查看配置文件来看一看,站点的配置文件在什么地方。再通过系统自带的编辑器(笔者所用系统自带 Nano,其他系统可能自带 Vim)来编辑配置文件。在配置文件中找到站点配置文件地址(笔者所用电脑存放路径为/etc/nginx/sites-enable),再到站点配置文件中找到local级别的配置,并在其中加上一下内容:

if ($http_user_agent ~* (Python|Curl)) {
     return 403;
    }

这段配置的释义是判断请求中请求头字符串中是否包含有 Python或者 Curl,如果包含则直接返回 403 错误,否则返回正常的资源。完成配置后保存,再通过命令:

sudo nginx -s reload

整个操作过程如上图所示,让 Nginx 服务器重新载入配置文件,使得刚才的配置生效。

反爬虫效果测试

重复上面访问的步骤,通过浏览器、Python 代码、Postman 工具和 Curl发起请求。从返回的结果就可以看到,与刚才是有所区别的。

  • 浏览器返回的是正常的页面,说明没有收到影响;
  • Python 代码的状态码变成了 403,而不是之前的 200
  • Postman 跟之前一样,返回了正确的内容;
  • Curl 跟 Python 一样,无法正确的访问资源,因为它们发起的请求都被过滤掉了。

提示:你可以继续修改 Nginx 的配置来进行测试,最终会发现结果会跟现在的一样:只要在黑名单中,请求就会被过滤掉并且返回 403 错误。

提示:这就是你平时编写爬虫代码时,需要在请求头中伪造浏览器的原因。

绕过 User-Agent 方式的反爬虫

通过上面的学习,我们知道了 User-Agent 反爬虫这种手段的原理,并且通过 Nginx 来实现了反爬虫,接下来我们一起学习如何绕过这种反爬虫措施。

Python 绕过反爬虫

在 Requests 库中,允许用户自定义请求头信息,所以我们可以在请求头信息中将 User-Agent 的值改为浏览器的请求头标识,这样就能够欺骗 Nginx 服务器,达到绕过反爬虫的目的。将之前的 Python 代码改为:

import requests
# 伪造请求头信息 欺骗服务器
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:9527.0) Gecko/20100101 Firefox/9527.0"}
resp = requests.get("http://127.0.0.1", headers=headers)
print(resp.status_code)

代码中我们用到的是 Firefox 浏览器的请求头信息,而且为了更好的观察效果,我们可以更改浏览器的版本号(改成9527)以区分真实浏览器(这不会影响请求结果)。运行这个文件,看看得到的返回结果:

200

不是 403 了,说明已经绕过了这种类型的反爬虫(你看,这就是网上那些文章所写的,需要修改请求头信息才能绕过反爬虫,现在你明白是怎么回事了吧)。

练习:使用 Postman 再测试一下

一个测试也许不准确,你还可以通过 Postman 再来测试一下,还记得怎么做吗?

  • 将需要过滤的标识(Postman)添加到 Nginx 的配置文件中
  • 重载配置文件,使其生效
  • 通过 Postman 发起请求看看是否会被过滤
  • 再次使用 Postman 工具,并且携带上浏览器的标识再发起请求,看看是否会被过滤

小提示:这个练习如果你自己来做的话,会更容易理解其中的原理,并且可以加深你的映像。

总结

回顾一下,整篇文章的过程:

最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~

给大家准备的学习资料包括但不限于:

Python 环境、pycharm编辑器/永久激活/翻译插件

python 零基础视频教程

Python 界面开发实战教程

Python 爬虫实战教程

Python 数据分析实战教程

python 游戏开发实战教程

Python 电子书100本

Python 学习路线规划

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐