Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日韩不卡一区二区,国产99久久精品,日本一级在线播放线观看视频

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          聽說你的資源被盜用了,那你知道 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地址改變了?!居谰弥囟ㄏ颉?/p>

          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框架的一些注意事項。

          有其他技巧或者疑問的同學,也可以在評論區寫上,咱們一起討論哦!


          主站蜘蛛池模板: 一区二区三区在线| 一区二区三区精品高清视频免费在线播放 | 国产日韩精品一区二区在线观看 | 国产精品一区二区三区高清在线 | 精品三级AV无码一区| 久久一本一区二区三区| 中文字幕精品一区二区| 国产成人精品一区二区三在线观看 | 午夜性色一区二区三区不卡视频| 免费精品一区二区三区在线观看| 亚洲第一区在线观看| 亚洲bt加勒比一区二区| 成人无码精品一区二区三区| 一区二区3区免费视频| 亚洲一区影音先锋色资源| 中文无码一区二区不卡αv| 亚洲高清成人一区二区三区| 久久er99热精品一区二区| 精品一区二区三区四区电影| 无码毛片视频一区二区本码| 无码人妻精一区二区三区| 亚洲熟妇av一区二区三区| 国内精品视频一区二区三区八戒 | 国产精品盗摄一区二区在线| 成人区精品人妻一区二区不卡| 亚洲AV成人一区二区三区在线看| 国产一区二区三区不卡在线看 | 亚洲成av人片一区二区三区| 久久精品亚洲一区二区三区浴池 | AA区一区二区三无码精片| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 波多野结衣中文一区二区免费| 亚洲中文字幕无码一区二区三区 | 国产短视频精品一区二区三区| 色一情一乱一伦一区二区三区日本| 国产激情无码一区二区| 一区二区国产在线播放| 亚洲国产AV无码一区二区三区| 午夜福利一区二区三区在线观看 | 亚洲国产精品第一区二区| 色综合视频一区二区三区 |