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)記,就像這樣:
之后會(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的審查很容易找到需要爬取信息的特征:
見(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é)果如下:
乍一看,就這么個(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)站,登錄地方的代碼如下:
可以看到驗(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
圖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ù),即 url 和 data :
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)他們的。
三、查找表單隱藏參數(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
圖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好用太多了。 如下圖:
總之,經(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ù)并展示
|