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视频在线精品,亚洲一区二区三区免费

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          JavaScript編程 Cookie

          ookie 用于存儲(chǔ) web 頁面的用戶信息。


          什么是 Cookie?

          Cookie 是一些數(shù)據(jù), 存儲(chǔ)于你電腦上的文本文件中。

          當(dāng) web 服務(wù)器向?yàn)g覽器發(fā)送 web 頁面時(shí),在連接關(guān)閉后,服務(wù)端不會(huì)記錄用戶的信息。

          Cookie 的作用就是用于解決 "如何記錄客戶端的用戶信息":

          • 當(dāng)用戶訪問 web 頁面時(shí),他的名字可以記錄在 cookie 中。

          • 在用戶下一次訪問該頁面時(shí),可以在 cookie 中讀取用戶訪問記錄。

          Cookie 以名/值對(duì)形式存儲(chǔ),如下所示:

          username=John Doe

          當(dāng)瀏覽器從服務(wù)器上請(qǐng)求 web 頁面時(shí), 屬于該頁面的 cookie 會(huì)被添加到該請(qǐng)求中。服務(wù)端通過這種方式來獲取用戶的信息。


          使用 JavaScript 創(chuàng)建Cookie

          JavaScript 可以使用 document.cookie 屬性來創(chuàng)建 、讀取、及刪除 cookie。

          JavaScript 中,創(chuàng)建 cookie 如下所示:

          document.cookie="username=John Doe";

          您還可以為 cookie 添加一個(gè)過期時(shí)間(以 UTC 或 GMT 時(shí)間)。默認(rèn)情況下,cookie 在瀏覽器關(guān)閉時(shí)刪除:

          document.cookie="username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 GMT";

          您可以使用 path 參數(shù)告訴瀏覽器 cookie 的路徑。默認(rèn)情況下,cookie 屬于當(dāng)前頁面。

          document.cookie="username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 GMT; path=/";


          使用 JavaScript 讀取 Cookie

          在 JavaScript 中, 可以使用以下代碼來讀取 cookie:

          var x = document.cookie;


          使用 JavaScript 修改 Cookie

          在 JavaScript 中,修改 cookie 類似于創(chuàng)建 cookie,如下所示:

          document.cookie="username=John Smith; expires=Thu, 18 Dec 2013 12:00:00 GMT; path=/";

          舊的 cookie 將被覆蓋。


          使用 JavaScript 刪除 Cookie

          刪除 cookie 非常簡(jiǎn)單。您只需要設(shè)置 expires 參數(shù)為以前的時(shí)間即可,如下所示,設(shè)置為 Thu, 01 Jan 1970 00:00:00 GMT:

          document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";

          注意,當(dāng)您刪除時(shí)不必指定 cookie 的值。


          Cookie 字符串

          document.cookie 屬性看起來像一個(gè)普通的文本字符串,其實(shí)它不是。

          即使您在 document.cookie 中寫入一個(gè)完整的 cookie 字符串, 當(dāng)您重新讀取該 cookie 信息時(shí),cookie 信息是以名/值對(duì)的形式展示的。

          如果您設(shè)置了新的 cookie,舊的 cookie 不會(huì)被覆蓋。 新 cookie 將添加到 document.cookie 中,所以如果您重新讀取document.cookie,您將獲得如下所示的數(shù)據(jù):

          cookie1=value; cookie2=value;

          顯示所有 Cookie 創(chuàng)建 Cookie 1 創(chuàng)建 Cookie 2 刪除 Cookie 1 刪除 Cookie 2

          如果您需要查找一個(gè)指定 cookie 值,您必須創(chuàng)建一個(gè)JavaScript 函數(shù)在 cookie 字符串中查找 cookie 值。


          JavaScript Cookie 實(shí)例

          在以下實(shí)例中,我們將創(chuàng)建 cookie 來存儲(chǔ)訪問者名稱。

          首先,訪問者訪問 web 頁面, 他將被要求填寫自己的名字。該名字會(huì)存儲(chǔ)在 cookie 中。

          訪問者下一次訪問頁面時(shí),他會(huì)看到一個(gè)歡迎的消息。

          在這個(gè)實(shí)例中我們會(huì)創(chuàng)建 3 個(gè) JavaScript 函數(shù):

          1. 設(shè)置 cookie 值的函數(shù)

          2. 獲取 cookie 值的函數(shù)

          3. 檢測(cè) cookie 值的函數(shù)


          設(shè)置 cookie 值的函數(shù)

          首先,我們創(chuàng)建一個(gè)函數(shù)用于存儲(chǔ)訪問者的名字:

          function setCookie(cname,cvalue,exdays){

          函數(shù)解析:

          以上的函數(shù)參數(shù)中,cookie 的名稱為 cname,cookie 的值為 cvalue,并設(shè)置了 cookie 的過期時(shí)間 expires。

          該函數(shù)設(shè)置了 cookie 名、cookie 值、cookie過期時(shí)間。


          獲取 cookie 值的函數(shù)

          然后,我們創(chuàng)建一個(gè)函數(shù)用戶返回指定 cookie 的值:

          function getCookie(cname){

          函數(shù)解析:

          cookie 名的參數(shù)為 cname。

          創(chuàng)建一個(gè)文本變量用于檢索指定 cookie :cname + "="。

          使用分號(hào)來分割 document.cookie 字符串,并將分割后的字符串?dāng)?shù)組賦值給 ca (ca = document.cookie.split(';'))。

          循環(huán) ca 數(shù)組 (i=0;i<ca.length;i++),然后讀取數(shù)組中的每個(gè)值,并去除前后空格 (c=ca[i].trim())。

          如果找到 cookie(c.indexOf(name) == 0),返回 cookie 的值 (c.substring(name.length,c.length)。

          如果沒有找到 cookie, 返回 ""。


          檢測(cè) cookie 值的函數(shù)

          最后,我們可以創(chuàng)建一個(gè)檢測(cè) cookie 是否創(chuàng)建的函數(shù)。

          如果設(shè)置了 cookie,將顯示一個(gè)問候信息。

          如果沒有設(shè)置 cookie,將會(huì)顯示一個(gè)彈窗用于詢問訪問者的名字,并調(diào)用 setCookie 函數(shù)將訪問者的名字存儲(chǔ) 365 天:

          function checkCookie(){

          完整實(shí)例

          實(shí)例

          functionsetCookie(cname,cvalue,exdays){vard = newDate(); d.setTime(d.getTime()+(exdays*24*60*60*1000)); varexpires = "expires="+d.toGMTString(); document.cookie = cname + "=" + cvalue + "; " + expires;}functiongetCookie(cname){varname = cname + "="; varca = document.cookie.split(';'); for(vari=0; i<ca.length; i++){varc = ca[i].trim(); if(c.indexOf(name)==0)returnc.substring(name.length,c.length); }return"";}functioncheckCookie(){varuser=getCookie("username"); if(user!=""){alert("Welcome again " + user); }else{user = prompt("Please enter your name:",""); if(user!="" && user!=null){setCookie("username",user,365); }}}

          以下實(shí)例在頁面載入時(shí)執(zhí)行 checkCookie() 函數(shù)。

          document.cookie 將以字符串的方式返回所有的 cookie,類型格式: cookie1=value; cookie2=value; cookie3=value;

          一節(jié),我們使用Charles記錄微博的登錄過程,并從中解析出了微博的登錄細(xì)節(jié),還用Python模擬實(shí)現(xiàn)了整個(gè)過程。只要微博登錄不改變,我們的代碼就一直可用,這也算是一勞永逸的事情了,而且程序運(yùn)行中不需要人工參與,高度自動(dòng)化。記得之前微博還是有驗(yàn)證碼的,這次重新實(shí)現(xiàn)的這個(gè)過程中沒有發(fā)現(xiàn)驗(yàn)證碼的蛛絲馬跡。

          完全用Python實(shí)現(xiàn)模擬登錄的過程其實(shí)是很累的,考驗(yàn)的是耐力、觀察力、聯(lián)想能力等等。雖然累,但一旦完成后面就省心了,也算是值得一試。

          然而世事無常,并非所有登錄都像微博那樣無驗(yàn)證碼(也許有,只是沒有跳出來),更多的是像12306,知乎,嗶哩嗶哩那樣上了變態(tài)的驗(yàn)證碼的。有時(shí)候?yàn)榱俗詣?dòng)識(shí)別驗(yàn)證碼耗費(fèi)的精力之大難以想象,所以我們寫爬蟲時(shí),要綜合考量投入產(chǎn)出比,人工輸入驗(yàn)證碼可能是更快捷便利的方法。

          今天,我們就介紹一款專門從瀏覽器緩存的cookies獲取cookies的工具,一個(gè)Python的模塊:browsercookie。

          它是一個(gè)很有用的爬蟲工具,通過加載你瀏覽器的cookies到一個(gè)cookiejar對(duì)象里面,讓你輕松下載需要登錄的網(wǎng)頁內(nèi)容。

          browsercookie 的安裝

          它的源代碼在bitbucket上: browsercookie

          可以從源碼安裝,或者直接pip安裝

          pip install browsercookie
          

          需要注意的是,在Windows系統(tǒng)下,內(nèi)置的sqlite模塊在加載FireFox數(shù)據(jù)庫時(shí)會(huì)拋出錯(cuò)誤。需要更新sqlite的版本:

          pip install pysqlite
          

          browsercookie 的使用


          我們拿百度的首頁來做實(shí)驗(yàn),如果沒有登錄cookies,打開的首頁右上角菜單欄顯示登錄而不顯示用戶名,如果有登錄cookies,首頁則顯示用戶名而不顯示登錄,通過在得到的html中搜索“登錄”來驗(yàn)證這兩者的不同準(zhǔn)備工作就是,要先打開瀏覽器(比如Chrome, 或Firefox)登錄一下百度,然后就可以關(guān)掉瀏覽器了,當(dāng)然開著也無所謂。

          首先,我們看看未登錄狀態(tài)下得到的標(biāo)題:

          In [1]: import requests
          In [2]: url = 'https://baidu.com/'
          In [3]: r1 = requests.get(url)
          In [4]: r1.content.decode('utf-8').find('登錄')
          Out[4]: 1580
          In [5]: r1.content.decode('utf8').find('user-name')
          Out[5]: -1
          

          由上面的實(shí)驗(yàn)我們看出來,沒有cookies請(qǐng)求得到登錄的信息,‘user-name’是顯示登錄名時(shí)的css的class,通過查找user-name再次確認(rèn)沒有登錄。

          然后,在看看從瀏覽器獲得cookies后得到的標(biāo)題:

          In [11]: cjff = browsercookie.firefox()
          In [12]: header = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}
          In [13]: r2 = requests.get(url, cookies=cjff, headers=header)
          In [14]: r2.content.decode('utf8').find('登錄')
          Out[14]: -1
          In [15]: r2.content.decode('utf8').find('user-name')
          Out[15]: 5038
          

          通過上面的代碼,我們驗(yàn)證了從browsercookie獲取cookies并成功登錄的百度。

          細(xì)心的小猿們可能已經(jīng)發(fā)現(xiàn)了,我用的cookies是從Firefox那里得來的

          <code>cjff = browsercookie.firefox()</code>。

          原因是,我先實(shí)驗(yàn)從Chrome那里獲取cookies,得到的cookies里面確實(shí)也包含百度,但是就是不能登錄,于是改用Firefox就輕松登錄了。


          browsercookie 的缺憾

          前面我們也提到了從Chrome獲得的cookies不能登錄百度的問題,后來我又實(shí)驗(yàn)了幾個(gè)不同的網(wǎng)站,有的可以也有不可以的,再次證明了這個(gè)模塊的不完美。

          不過,這個(gè)庫用起來很簡(jiǎn)單,幾行代碼就可以驗(yàn)證它對(duì)我們要登錄的網(wǎng)站是否起作用,所以,寫爬蟲遇到登錄的問題不妨先拿它驗(yàn)證一下,萬一行呢,不就省了很多精力。

          還有一類問題,就是你得到了cookies,訪問任何該網(wǎng)站的URL,它都先返回一段登錄驗(yàn)證的html,里面通過JS重定向到不同的網(wǎng)址,你需要進(jìn)一步解析這段JS代碼才能訪問到你真正想訪問的目標(biāo)網(wǎng)址,這樣的操作就比較累人,這樣的網(wǎng)站對(duì)爬蟲很不友好。別猜了,我說的就是微博。

           <html>
           <head>
           <title>新浪通行證</title>
           <meta http-equiv="refresh" content="0; url='https://login.sina.com.cn/crossdomain2.php?action=login&entry=miniblog&r=https%3A%2F%2Fpassport.weibo.com%2Fwbsso%2Flogin%3Fssosavestate%3D1574046135%26url%3Dhttps%253A%252F%252Fweibo.com%252Fkaifulee%26display%3D0%26ticket%3DST-MTM3MTQ1MzA0MA%3D%3D-1542510135-gz-E235393C87F25EE4E30B221C2B5F7F37-1%26retcode%3D0&login_time=1542509978&sign=d531a8b4eed9c403'"/>
           <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
           </head>
           <body bgcolor="#ffffff" text="#000000" link="#0000cc" vlink="#551a8b" alink="#ff0000">
           <script type="text/javascript" language="javascript">
           location.replace("https://login.sina.com.cn/crossdomain2.php?action=login&entry=miniblog&r=https%3A%2F%2Fpassport.weibo.com%2Fwbsso%2Flogin%3Fssosavestate%3D1574046135%26url%3Dhttps%253A%252F%252Fweibo.com%252Fkaifulee%26display%3D0%26ticket%3DST-MTM3MTQ1MzA0MA%3D%3D-1542510135-gz-E235393C87F25EE4E30B221C2B5F7F37-1%26retcode%3D0&login_time=1542509978&sign=d531a8b4eed9c403");
           </script>
           </body>
           </html>
          

          這種異步加載的網(wǎng)頁越來越多,尤其是前端框架ReactJS, VueJS等框架的出現(xiàn)讓前后端分離,由瀏覽器運(yùn)行JavaScript來渲染前端。這個(gè)時(shí)候,就需要我們的爬蟲支持JavaScript的運(yùn)行,此時(shí)此刻,requests等單純的HTTP協(xié)議庫已經(jīng)無能為力了,我們需要更強(qiáng)大的工具

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          <html>
           <head>
           <title> New Document </title>
           <meta name="Generator" content="EditPlus">
           <meta name="Author" content="">
           <meta name="Keywords" content="">
           <meta name="Description" content="">
           </head>
          <body>
           <input type="text" id="a"/> 
           <input type="button" value="保存cookie" onclick="test()"/> 
           <input type="button" value="獲取cookie" onclick="alert(getCookie('userName'))"/> 
           </body>
          <script language=javascript> 
          
          window.onload=function(){
           document.getElementById("a").value=getCookie('userName');
          }
          function test()
          {
          	var a = document.getElementById('a').value;
           SetCookie('userName',a)
          }
           //獲得coolie 的值
          function cookie(name){ 
           var cookieArray=document.cookie.split("; "); //得到分割的cookie名值對(duì) 
           var cookie=new Object(); 
           for (var i=0;i<cookieArray.length;i++){ 
           var arr=cookieArray[i].split("="); //將名和值分開 
           if(arr[0]==name)return unescape(arr[1]); //如果是指定的cookie,則返回它的值 
           } 
           return ""; 
          } 
          
          function delCookie(name)//刪除cookie
          {
           document.cookie = name+"=;expires="+(new Date(0)).toGMTString();
          }
          
          function getCookie(objName){//獲取指定名稱的cookie的值
           var arrStr = document.cookie.split("; ");
           for(var i = 0;i < arrStr.length;i ++){
           var temp = arrStr[i].split("=");
           if(temp[0] == objName) return unescape(temp[1]);
           } 
          }
          
          function addCookie(objName,objValue,objHours){ //添加cookie
           var str = objName + "=" + escape(objValue);
           if(objHours > 0){ //為時(shí)不設(shè)定過期時(shí)間,瀏覽器關(guān)閉時(shí)cookie自動(dòng)消失
           var date = new Date();
           var ms = objHours*3600*1000;
           date.setTime(date.getTime() + ms);
           str += "; expires=" + date.toGMTString();
           }
           document.cookie = str;
          }
          
          function SetCookie(name,value)//兩個(gè)參數(shù),一個(gè)是cookie的名子,一個(gè)是值
          {
           var Days = 30; //此 cookie 將被保存 30 天
           var exp = new Date(); //new Date("December 31, 9998");
           exp.setTime(exp.getTime() + Days*24*60*60*1000);
           document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
          }
          
          function getCookie(name)//取cookies函數(shù) 
          {
           var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
           if(arr != null) return unescape(arr[2]); return null;
          }
          
          function delCookie(name)//刪除cookie
          {
           var exp = new Date();
           exp.setTime(exp.getTime() - 1);
           var cval=getCookie(name);
           if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();
          }
          </script>
          </html>
          

          主站蜘蛛池模板: 国产爆乳无码一区二区麻豆| 国产福利在线观看一区二区| 国产成人av一区二区三区在线| 日本欧洲视频一区| 久久久无码精品人妻一区| 少妇无码一区二区三区免费| 精品成人一区二区三区免费视频| 日韩电影一区二区| 国产成人无码精品一区二区三区| 中文字幕Av一区乱码| 无码人妻精品一区二区三区99仓本 | 久久精品一区二区三区AV| 在线观看精品视频一区二区三区| 国产一区二区三区在线2021 | 国产精品福利一区| 国产精品亚洲一区二区麻豆| 亚洲一区二区三区无码影院| 亚拍精品一区二区三区| 一区二区三区精品| 三上悠亚亚洲一区高清| 国产精品亚洲不卡一区二区三区| 激情亚洲一区国产精品| 色欲AV蜜臀一区二区三区| 亚洲AV成人一区二区三区AV| 中文字幕一区在线| 中文字幕一区二区三区在线播放| 又紧又大又爽精品一区二区| 久久99精品波多结衣一区| 久久久国产一区二区三区| 国产一区二区三区夜色| 久久无码人妻精品一区二区三区| 日韩久久精品一区二区三区| 亚洲欧美日韩国产精品一区| 无码一区二区三区AV免费| 国精产品一区一区三区MBA下载 | 三上悠亚亚洲一区高清| 亚洲韩国精品无码一区二区三区| 中文字幕亚洲乱码熟女一区二区| 在线精品亚洲一区二区三区| 亚洲午夜电影一区二区三区 | 免费一区二区三区四区五区|