一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

我的第一個(gè)Python爬蟲(chóng)

 網(wǎng)海拾貝網(wǎng)絡(luò)豬 2020-03-27

2018年3月27日,繼開(kāi)學(xué)以來(lái),開(kāi)了軟件工程和信息系統(tǒng)設(shè)計(jì),想來(lái)想去也沒(méi)什么好的題目,干脆就想弄一個(gè)實(shí)用點(diǎn)的,于是產(chǎn)生了做“學(xué)生服務(wù)系統(tǒng)”想法。相信各大高校應(yīng)該都有本校APP或超級(jí)課程表之類的軟件,在信息化的時(shí)代能快速收集/查詢自己想要的咨詢也是種很重要的能力,所以記下了這篇博客,用于總結(jié)我所學(xué)到的東西,以及用于記錄我的第一個(gè)爬蟲(chóng)的初生。

一、做爬蟲(chóng)所需要的基礎(chǔ)

要做一只爬蟲(chóng),首先就得知道他會(huì)干些什么,是怎樣工作的。所以得有一些關(guān)于HTML的前置知識(shí),這一點(diǎn)做過(guò)網(wǎng)頁(yè)的應(yīng)該最清楚了。
   HTML(超文本標(biāo)記語(yǔ)言),是一種標(biāo)記性語(yǔ)言,本身就是一長(zhǎng)串字符串,利用各種類似 < a >,< /a>這樣的標(biāo)簽來(lái)識(shí)別內(nèi)容,然后通過(guò)瀏覽器的實(shí)現(xiàn)標(biāo)準(zhǔn)來(lái)翻譯成精彩的頁(yè)面。當(dāng)然,一個(gè)好看的網(wǎng)頁(yè)并不僅僅只有HTML,畢竟字符串是靜態(tài)的,只能實(shí)現(xiàn)靜態(tài)效果,要作出漂亮的網(wǎng)頁(yè)還需要能美化樣式的CSS和實(shí)現(xiàn)動(dòng)態(tài)效果的JavaScipt,只要是瀏覽器都是支持這些玩意兒的。
   嗯,我們做爬蟲(chóng)不需要了解太多,只需要了解HTML是基于文檔對(duì)象模型(DOM)的,以樹(shù)的結(jié)構(gòu),存儲(chǔ)各種標(biāo)記,就像這樣:
   DOM的百度百科
   之后會(huì)用到這種思想來(lái)在一大堆HTML字符串中找出我們想要的東西。

了解了這個(gè)然后還得了解網(wǎng)頁(yè)和服務(wù)器之間是怎么通信的,這就得稍微了解點(diǎn)HTTP協(xié)議,基于TCP/IP的應(yīng)用層協(xié)議,規(guī)定了瀏覽器和服務(wù)器之間的通信規(guī)則,簡(jiǎn)單粗暴的介紹幾點(diǎn)和爬蟲(chóng)相關(guān)的就是:

瀏覽器和服務(wù)器之間有如下幾種通信方式:
   GET:向服務(wù)器請(qǐng)求資源,請(qǐng)求以明文的方式傳輸,一般就在URL上能看到請(qǐng)求的參數(shù)
   POST:從網(wǎng)頁(yè)上提交表單,以報(bào)文的形式傳輸,請(qǐng)求資源
   還有幾種比較少見(jiàn)就不介紹了。

了解了這兩點(diǎn)就可以準(zhǔn)備工具了,當(dāng)然,對(duì)爬蟲(chóng)有興趣還可以了解一下爬蟲(chóng)的發(fā)展史。

二、介紹幾款優(yōu)秀制作爬蟲(chóng)的輔助工具

由于我是采用python3.6開(kāi)發(fā)的,然后從上文的介紹中,也該知道了一只爬蟲(chóng)是需要從HTML中提取內(nèi)容,以及需要和網(wǎng)頁(yè)做交互等。
   如果不采用爬蟲(chóng)框架的話,我建議采用:
   
    BeautifulSoup 庫(kù) ,一款優(yōu)秀的HTML/XML解析庫(kù),采用來(lái)做爬蟲(chóng),
              不用考慮編碼,還有中日韓文的文檔,其社區(qū)活躍度之高,可見(jiàn)一斑。
              [] 這個(gè)在解析的時(shí)候需要一個(gè)解析器,在文檔中可以看到,推薦lxml
              
    Requests 庫(kù),一款比較好用的HTTP庫(kù),當(dāng)然python自帶有urllib以及urllib2等庫(kù),
            但用起來(lái)是絕對(duì)沒(méi)有這款舒服的,哈哈
           
    Fiddler. 工具,這是一個(gè)HTTP抓包軟件,能夠截獲所有的HTTP通訊。
          如果爬蟲(chóng)運(yùn)行不了,可以從這里尋找答案,官方鏈接可能進(jìn)不去,可以直接百度下載

爬蟲(chóng)的輔助開(kāi)發(fā)工具還有很多,比如Postman等,這里只用到了這三個(gè),相信有了這些能減少不少開(kāi)發(fā)阻礙。

三、最簡(jiǎn)單的爬蟲(chóng)試?yán)?/h2>

最簡(jiǎn)單的爬蟲(chóng)莫過(guò)于單線程的靜態(tài)頁(yè)面了,這甚至都不能叫爬蟲(chóng),單單一句正則表達(dá)式即可匹配出所有內(nèi)容,比如各種榜單:豆瓣電影排行榜,這類網(wǎng)站爬取規(guī)則變化比較少,用瀏覽器自帶的F12的審查很容易找到需要爬取信息的特征:這里寫(xiě)圖片描述
    見(jiàn)到花花綠綠的HTML代碼不要害怕,一個(gè)一個(gè)點(diǎn),直到找到需要的信息就行了,可以看到所有電影名都是在這樣

<div class = "pl2">

之下的,每有一個(gè)這樣的標(biāo)簽就代表一個(gè)電影,從他的孩子< span >中即可抓取到電影名。
代碼如下:

from bs4 import BeautifulSoup
from lxml import html
import xml
import requests

url = "https://movie.douban.com/chart"
f = requests.get(url)                 #Get該網(wǎng)頁(yè)從而獲取該html內(nèi)容
soup = BeautifulSoup(f.content, "lxml")  #用lxml解析器解析該網(wǎng)頁(yè)的內(nèi)容, 好像f.text也是返回的html
#print(f.content.decode())								#嘗試打印出網(wǎng)頁(yè)內(nèi)容,看是否獲取成功
#content = soup.find_all('div',class_="p12" )   #嘗試獲取節(jié)點(diǎn),因?yàn)閏alss和關(guān)鍵字沖突,所以改名class_

for k in soup.find_all('div',class_='pl2'):#,找到div并且class為pl2的標(biāo)簽
   a = k.find_all('span')       #在每個(gè)對(duì)應(yīng)div標(biāo)簽下找span標(biāo)簽,會(huì)發(fā)現(xiàn),一個(gè)a里面有四組span
   print(a[0].string)            #取第一組的span中的字符串

抓取結(jié)果如下:
這里寫(xiě)圖片描述
    乍一看,就這么個(gè)玩意兒,這些電影名還不如直接自己去網(wǎng)頁(yè)看,這有什么用呢?但是,你想想,只要你掌握了這種方法,如果有翻頁(yè)你可以按照規(guī)則爬完了一頁(yè)就解析另外一頁(yè)HTML(通常翻頁(yè)的時(shí)候URL會(huì)規(guī)律變化,也就是GET請(qǐng)求實(shí)現(xiàn)的翻頁(yè)),也就是說(shuō),只要掌握的爬取方法,無(wú)論工作量有多么大都可以按你的心思去收集想要的數(shù)據(jù)了。

四、需要模擬登錄后再爬取的爬蟲(chóng)所需要的信息

4.1.登錄分析

剛才的爬蟲(chóng)未免太簡(jiǎn)單,一般也不會(huì)涉及到反爬蟲(chóng)方面,這一次分析需要登錄的頁(yè)面信息的爬取,按照往例,首先打開(kāi)一個(gè)網(wǎng)頁(yè):
    我選擇了我學(xué)校信息服務(wù)的網(wǎng)站,登錄地方的代碼如下:
       這里寫(xiě)圖片描述
    可以看到驗(yàn)證碼都沒(méi)有,就只有賬號(hào)密碼以及提交。光靠猜的當(dāng)然是不行的,一般輸入密碼的地方都是POST請(qǐng)求。
    POST請(qǐng)求的響應(yīng)流程就是 客戶在網(wǎng)頁(yè)上填上服務(wù)器準(zhǔn)備好的表單并且提交,然后服務(wù)器處理表單做出回應(yīng)。一般就是用戶填寫(xiě)賬號(hào)、密碼、驗(yàn)證碼然后把這份表單提交給服務(wù)器,服務(wù)器從數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證,然后作出不同的反應(yīng)。在這份POST表單中可能還有一些不需要用戶填寫(xiě)的用腳本生成的隱藏屬性作為反爬蟲(chóng)的手段。
    要知道表單格式可以先試著隨便登錄一次,然后在F12中的network中查看登錄結(jié)果,如圖:
    圖1                                圖1
    這里寫(xiě)圖片描述                                 圖2

】如果用真正的賬號(hào)密碼登錄,要記住勾選上面的Preserve log,這樣即使網(wǎng)頁(yè)發(fā)生了跳轉(zhuǎn)之前的信息也還在。
從上面的兩張圖中很容易發(fā)現(xiàn)其中的一個(gè)POST請(qǐng)求, login?serv…就是登錄請(qǐng)求了
可以看到這個(gè)登錄請(qǐng)求所攜帶的信息有:
General: 記錄了請(qǐng)求方式,請(qǐng)求地址,以及服務(wù)器返回的狀態(tài)號(hào) 200等
Response Headers: 響應(yīng)頭,HTTP響應(yīng)后傳輸?shù)念^部消息
Request Headers: 請(qǐng)求頭,重點(diǎn)!!,向服務(wù)器發(fā)送請(qǐng)求時(shí),發(fā)出的頭部消息,之中很多參數(shù)都是爬蟲(chóng)需要模擬出來(lái)傳送給服務(wù)器的。
From Data:表單,重點(diǎn)!!,在這里表單中有:

username: 12345
password: MTIzNDU=
lt: e1s1
_eventId: submit

我明明都填的12345,為什么密碼變了呢?可以看出這密碼不是原始值,應(yīng)該是編碼后的產(chǎn)物,網(wǎng)站常用的幾種編碼/加密方法就幾種,這里是采用的base64編碼,如果對(duì)密碼編碼的方式?jīng)]有頭緒可以仔細(xì)看看登錄前后頁(yè)面的前端腳本。運(yùn)氣好可以看到encode函數(shù)什么的。

4.2信息提取

如果了解過(guò)Resquests庫(kù)的文檔就知道,發(fā)送一個(gè)一般的POST請(qǐng)求所需要的參數(shù)構(gòu)造是這樣的:

 r = requests.post(url,[data],[header],[json],[**kwargs])
 /*
url -- URL for the new Request object.
data -- (optional) Dictionary, bytes, or file-like object to send in the body of the Request.
json -- (optional) json to send in the body of the Request.
**kwargs -- Optional arguments that request takes.
*/

從上面的兩張圖片中即可找到發(fā)送一個(gè)正確的請(qǐng)求所需要的參數(shù),即 urldata
   url 即上面的 Request URL:
Request URL: http://uia./sso/login?service=http%3A%2F%2Fportal.%2Fuser%2FsimpleSSOLogin
   data 即上面的From data:

username: 12345
password: MTIzNDU=
lt: e1s1
_eventId: submit

收集到了必要的信息還得了解三點(diǎn):
   一、登錄后的網(wǎng)頁(yè)和服務(wù)器建立了聯(lián)系,所以能和服務(wù)器進(jìn)行通信,但即使你從這個(gè)網(wǎng)頁(yè)點(diǎn)擊里面的超鏈接跳轉(zhuǎn)到另外一個(gè)子網(wǎng)頁(yè),在新網(wǎng)頁(yè)中還是保持登錄狀態(tài)的在不斷的跳轉(zhuǎn)中是怎么識(shí)別用戶的呢?
   在這里,服務(wù)器端一般是采用的Cookie技術(shù),登陸后給你一個(gè)Cookie,以后你發(fā)出跳轉(zhuǎn)網(wǎng)頁(yè)的請(qǐng)求就攜帶該Cookie,服務(wù)器就能知道是你在哪以什么狀態(tài)點(diǎn)擊的該頁(yè)面,也就解決了HTTP傳輸?shù)臒o(wú)狀態(tài)問(wèn)題。
   很明顯,在模擬登錄以后保持登錄狀態(tài)需要用得著這個(gè)Cookie,當(dāng)然Cookie在請(qǐng)求頭中是可見(jiàn)的,為了自己的賬號(hào)安全,請(qǐng)不要輕易暴露/泄漏自己的Cookie

二、先了解一下,用python程序訪問(wèn)網(wǎng)頁(yè)的請(qǐng)求頭的User-Agent是什么樣的呢?沒(méi)錯(cuò),如下圖所示,很容易分辨這是程序的訪問(wèn),也就是服務(wù)器知道這個(gè)請(qǐng)求是爬蟲(chóng)訪問(wèn)的結(jié)果,如果服務(wù)器做了反爬蟲(chóng)措施程序就會(huì)訪問(wèn)失敗,所以需要程序模擬瀏覽器頭,讓對(duì)方服務(wù)器認(rèn)為你是使用某種瀏覽器去訪問(wèn)他們的。
   這里寫(xiě)圖片描述
  
   三、查找表單隱藏參數(shù)的獲取方式,在上文表單列表中有個(gè)lt參數(shù),雖然我也不知道他是干嘛的,但通過(guò)POST傳輸過(guò)去的表單肯定是會(huì)經(jīng)過(guò)服務(wù)器驗(yàn)證的,所以需要弄到這份參數(shù),而這份參數(shù)一般都會(huì)在HTML頁(yè)面中由JS腳本自動(dòng)生成,可以由Beautifulsoup自動(dòng)解析抓取?! ?br>   
關(guān)于Fiddler的使用和請(qǐng)求信息相關(guān)信息可以查看鏈接:https://zhuanlan.zhihu.com/p/21530833?refer=xmucpp
嗯,最重要的幾樣?xùn)|西已經(jīng)收集完畢,對(duì)Cookie和請(qǐng)求頭的作用也有了個(gè)大概的了解,然后開(kāi)始發(fā)送請(qǐng)求試試吧~

五、開(kāi)始編碼爬蟲(chóng)

如果用urllib庫(kù)發(fā)送請(qǐng)求,則需要自己編碼Cookie這一塊(雖然也只要幾行代碼),但用Requests庫(kù)就不需要這樣,在目前最新版本中,requests.Session提供了自己管理Cookie的持久性以及一系列配置,可以省事不少。
   先以面對(duì)過(guò)程的方式實(shí)驗(yàn)地去編碼:

from bs4 import BeautifulSoup
from lxml import html
import requests
####################################################################################
#  在這先準(zhǔn)備好請(qǐng)求頭,需要爬的URL,表單參數(shù)生成函數(shù),以及建立會(huì)話
############################# 1 #################################################
header={
    "Accept": "text/html, application/xhtml+xml, image/jxr, */*",
    "Referer": "http://uia./sso/login?service=http%3A%2F%2Fportal.hnist.			    cn%2Fuser%2FsimpleSSOLogin",    
    "Accept-Language": "zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3",
    "Content-Type": "application/x-www-form-urlencoded",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "Keep-Alive",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36",
    "Accept-Encoding": "gzip, deflate",
    "Origin": "http://uia.",
    "Upgrade-Insecure-Requests": "1",
   #Cookie由Session管理,這里不用傳遞過(guò)去,千萬(wàn)不要亂改頭,我因?yàn)楦牧祟^的HOST坑了我兩天
}  

School_login_url = 'http://uia./sso/login? service=http%3A%2F%2Fportal.%2Fuser%2FsimpleSSOLogin'#學(xué)校登錄的URL

page = requests.Session()     #用Session發(fā)出請(qǐng)求能自動(dòng)處理Cookie等問(wèn)題
page.headers = header		 #為所有請(qǐng)求設(shè)置頭
page.get(School_login_url)    #Get該地址建立連接(通常GET該網(wǎng)址后,服務(wù)器會(huì)發(fā)送一些用于					驗(yàn)證的參數(shù)用于識(shí)別用戶,這些參數(shù)在這就全由requests.Session處理了)


def Get_lt():	#獲取參數(shù) lt 的函數(shù)
    f = requests.get(School_login_url,headers = header)
    soup = BeautifulSoup(f.content, "lxml")  
    once = soup.find('input', {'name': 'lt'})['value']
    return once

lt = Get_lt()  #獲取lt

From_Data = {   #表單
    'username': 'your username',
    'password': 'Base64 encoded password',   
    #之前說(shuō)過(guò)密碼是通過(guò)base64加密過(guò)的,這里得輸入加密后的值,或者像lt一樣寫(xiě)個(gè)函數(shù)
    'lt': lt,
    '_eventId': 'submit',
}
############################# 1 end #############################

################################################################
#  在這一段向登錄網(wǎng)站發(fā)送POST請(qǐng)求,并判斷是否成功返回正確的內(nèi)容
############################# 2 #################################

q = page.post(School_login_url,data=From_Data,headers=header) 
#發(fā)送登陸請(qǐng)求

#######查看POST請(qǐng)求狀態(tài)##############
#print(q.url)	#這句可以查看請(qǐng)求的URL
#print(q.status_code)  #這句可以查看請(qǐng)求狀態(tài)
#for (i,j) in q.headers.items():
#    print(i,':',j)		#這里可以查看響應(yīng)頭
#print('\n\n')
#for (i,j) in q.request.headers.items():
#    print(i,':',j)		#這里可以查看請(qǐng)求頭
####上面的內(nèi)容用于判斷爬取情況,也可以用fiddle抓包查看 ####

f = page.get('http://uia.')	#GET需要登錄后(攜帶cookie)才能查看的網(wǎng)站
print("body:",f.text)

######## 進(jìn)入查成績(jī)網(wǎng)站,找到地址,請(qǐng)求并接收內(nèi)容 #############

proxies = {  #代理地址,這里代理被注釋了,對(duì)后面沒(méi)影響,這里也不需要使用代理....
#"http": "http://x.x.x.x:x",
#"https": "http://x.x.x.x:x",
}

########  查成績(jī)網(wǎng)站的text格式表單,其中我省略了很多...######
str = """callCount=1
httpSessionId=DA0080E0317A1AD0FDD3E09E095CB4B7.portal254
scriptSessionId=4383521D7E8882CB2F7AB18F62EED380
page=/web/guest/788
"""
#### 這是由于該服務(wù)器關(guān)于表單提交部分設(shè)計(jì)比較垃圾,所以不用去在意表單內(nèi)容含義 ###

f = page.post('http://portal./portal_bg_ext/dwr/plainjs/
ShowTableAction.showContent.dwr',\data=str,proxies=proxies)
 #查成績(jī)的地址,表單參數(shù)為上面的str
  
######  查看地址,返回狀態(tài),以及原始內(nèi)容#######"""
print("f:",f.url)
print(f.status_code)
text = f.content.decode('unicode_escape')
print(text.encode().decode()) #因?yàn)樵純?nèi)容中有\(zhòng)uxxx形式的編碼,所以使用這句解碼
###########################################"""
################################### 2 end #########################

###################################################################
#  解析獲得的內(nèi)容,并清洗數(shù)據(jù),格式化輸出...
############################# 3 ####################################




[] 如果使用了Fiddler,他會(huì)自動(dòng)為Web的訪問(wèn)設(shè)置一個(gè)代理,這時(shí)候如果你關(guān)閉了Fiddler可能爬蟲(chóng)會(huì)無(wú)法正常工作,這時(shí)候你選擇瀏覽器直連,或者設(shè)置爬蟲(chóng)的代理為Fiddler即可。
[注2]爬蟲(chóng)不要頻率太快,不要影響到別人服務(wù)器的正常運(yùn)行,如果不小心IP被封了可以使用代理(重要數(shù)據(jù)不要使用不安全的代理),網(wǎng)上有很多收費(fèi)/免費(fèi)的代理,可以去試下。

過(guò)程中獲得的經(jīng)驗(yàn):

  • 在上面第一部分,不知道作用的參數(shù)不要亂填,只需要填幾個(gè)最重要的就夠了,比如UA,有時(shí)候填了不該填的請(qǐng)求將會(huì)返回錯(cuò)誤狀態(tài).,盡量把可分離的邏輯寫(xiě)成函數(shù)來(lái)調(diào)用,比如生成的表單參數(shù),加密方法等.
  • 在上面第二部分如果請(qǐng)求失敗可以配合抓包軟件查看程序和瀏覽器發(fā)送的請(qǐng)求有什么差別,遺漏了什么重要的地方,盡量讓程序模仿瀏覽器的必要的行為。
  • 第三部分中,因?yàn)槟玫降臄?shù)據(jù)是如下圖1這樣的,所以需要最后輸出后decode,然后再使用正則表達(dá)式提取出雙引號(hào)中的內(nèi)容連接誒成一個(gè)標(biāo)記語(yǔ)言的形式,再使用Beautifulsoup解析獲得需要的數(shù)據(jù),如圖2.
  • 中途可能利用的工具有:
    官方正則表達(dá)式學(xué)習(xí)網(wǎng)站
    HTML格式美化
    正則表達(dá)式測(cè)試

圖1
                                 圖1     
圖2
                     圖2

六、爬蟲(chóng)技術(shù)的拓展與提高

??經(jīng)歷了困難重重,終于得到了想要的數(shù)據(jù),對(duì)于異步請(qǐng)求,使用JS渲染頁(yè)面后才展示數(shù)據(jù)的網(wǎng)頁(yè),又或是使用JS代碼加密過(guò)的網(wǎng)頁(yè),如果花時(shí)間去分析JS代碼來(lái)解密,簡(jiǎn)單的公有的加密方法倒是無(wú)所謂,但對(duì)于特別難的加密就有點(diǎn)費(fèi)時(shí)費(fèi)力了,在要保持抓取效率的情況下可以使用能使用Splash框架:
??這是一個(gè)Javascript渲染服務(wù),它是一個(gè)實(shí)現(xiàn)了HTTP API的輕量級(jí)瀏覽器,Splash是用Python實(shí)現(xiàn)的,同時(shí)使用Twisted和QT。Twisted(QT)用來(lái)讓服務(wù)具有異步處理能力,以發(fā)揮webkit的并發(fā)能力。
??就比如像上面返回成績(jī)地址的表單參數(shù),格式為text,并且無(wú)規(guī)律,有大幾十行,如果要弄明白每個(gè)參數(shù)是什么意思,還不如加載瀏覽器的JS 或 使用瀏覽器自動(dòng)化測(cè)試軟件來(lái)獲取HTML了,所以,遇到這種情況,在那么大一段字符串中,只能去猜哪些參數(shù)是必要的,哪些參數(shù)是不必要的,比如上面的,我就看出兩個(gè)是有關(guān)于返回頁(yè)面結(jié)果的,其余的有可能存在驗(yàn)證身份的,時(shí)間的什么的。

??對(duì)于信息的獲取源,如果另外的網(wǎng)站也有同樣的數(shù)據(jù)并且抓取難度更低,那么換個(gè)網(wǎng)站爬可能是個(gè)更好的辦法,以及有的網(wǎng)站根據(jù)請(qǐng)求頭中的UA會(huì)產(chǎn)生不同的布局和處理,比如用手機(jī)的UA可能爬取會(huì)更加簡(jiǎn)單。

七、后記

??幾天后我發(fā)現(xiàn)了另一個(gè)格式較好的頁(yè)面,于是去爬那個(gè)網(wǎng)站,結(jié)果他是.jsp的,采用之前的方法跳轉(zhuǎn)幾個(gè)302之后就沒(méi)有后續(xù)了…后來(lái)才猜想了解到,最后一個(gè)302可能是由JS腳本跳轉(zhuǎn)的,而我沒(méi)有執(zhí)行JS腳本的環(huán)境,也不清楚他執(zhí)行的哪個(gè)腳本,傳入了什么參數(shù),于是各種嘗試和對(duì)比,最后發(fā)現(xiàn):正常請(qǐng)求時(shí),每次都多2個(gè)Cookie,開(kāi)始我想,Cookie不是由Session管理不用去插手的嗎?然后我想以正常方式獲得該Cookie,請(qǐng)求了N個(gè)地址,結(jié)果始終得不到想要的Cookie,于是我直接使用Session.cookies.set('COMPANY_ID','10122')添加了兩個(gè)Cookie,還真成了…神奇…
??當(dāng)然,過(guò)了一段時(shí)間后,又不行了,于是仔細(xì)觀察,發(fā)現(xiàn)每次就JSESSIONID這一個(gè)Cookie對(duì)結(jié)果有影響,傳遞不同的值到不同的頁(yè)面還…雖然我不認(rèn)同這種猜的,毫無(wú)邏輯效率的瞎試。但經(jīng)歷長(zhǎng)時(shí)間的測(cè)試和猜測(cè),對(duì)結(jié)果進(jìn)行總結(jié)和整理也是能發(fā)現(xiàn)其中規(guī)律的。

??關(guān)于判斷某動(dòng)作是不是JS,可以在Internet選項(xiàng)中設(shè)置禁止使用JS

??關(guān)于失敗了驗(yàn)證的方法,我強(qiáng)烈建議下載fiddler,利用新建視圖,把登錄過(guò)程中所有的圖片,CSS等文件去掉以后放到新視圖中,然后利用程序登錄的過(guò)程也放一個(gè)視圖當(dāng)中,如果沒(méi)有在響應(yīng)中找到需要的Cookie,還可以在視圖中方便的查看各個(gè)JS文件,比瀏覽器自帶的F12好用太多了。 如下圖:
這里寫(xiě)圖片描述

總之,經(jīng)過(guò)這段時(shí)間的嘗試,我對(duì)爬蟲(chóng)也有了個(gè)初步的了解,在這方面,也有了自己做法:
  
抓包請(qǐng)求 —> 模仿請(qǐng)求頭和表單—>如果請(qǐng)求失敗,則仔細(xì)對(duì)比正常訪問(wèn)和程序訪問(wèn)的數(shù)據(jù)包 —>成功則根據(jù)內(nèi)容結(jié)構(gòu)進(jìn)行解析—>清清洗數(shù)據(jù)并展示

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本一区二区三区黄色| 国内精品伊人久久久av高清| 久久久精品区二区三区| 中文字幕日韩欧美理伦片| 精品al亚洲麻豆一区| 人妻人妻人人妻人人澡| 精品日韩av一区二区三区| 亚洲欧美日韩国产成人| 亚洲中文字幕在线观看黑人| 最近最新中文字幕免费| 中文字幕日韩欧美一区| 懂色一区二区三区四区| 九九热在线视频观看最新| 欧美亚洲三级视频在线观看| 日本免费一本一二区三区| 91精品国产综合久久不卡| 色婷婷视频在线精品免费观看| 东京热男人的天堂社区| 亚洲国产欧美精品久久| 我想看亚洲一级黄色录像| 亚洲视频一级二级三级| 99久久婷婷国产亚洲综合精品| 中文久久乱码一区二区| 九九久久精品久久久精品| 国产av一区二区三区麻豆| 亚洲精品熟女国产多毛| 熟女免费视频一区二区| 国产成人亚洲欧美二区综| 操白丝女孩在线观看免费高清| 青青操视频在线播放免费| 99久久国产精品成人观看| 亚洲av日韩av高潮无打码| 97人妻人人揉人人躁人人| 亚洲成人免费天堂诱惑| 国产一区二区三区色噜噜| 亚洲一区二区欧美在线| 加勒比东京热拍拍一区二区| 日韩国产中文在线视频| 亚洲一区二区福利在线| 国产一区二区熟女精品免费| 99久久国产亚洲综合精品|