首先詳細(xì)說(shuō)明一下什么是cookies?
當(dāng)用戶通過(guò)瀏覽器首次訪問(wèn)一個(gè)域名時(shí),訪問(wèn)的WEB服務(wù)器會(huì)給客戶端發(fā)送數(shù)據(jù)尤蒿,以保持WEB服務(wù)器與客戶端之間的狀態(tài)保持(Http協(xié)議是一個(gè)無(wú)狀態(tài)的面向連接的協(xié)議,客戶端再一次訪問(wèn)該服務(wù)器時(shí)怠堪,會(huì)繼續(xù)使用上一次建立的連接揽乱,但是,由于Http協(xié)議是無(wú)狀態(tài)的粟矿,WEB服務(wù)器并不知道這兩個(gè)請(qǐng)求是否同一個(gè)客戶端凰棉,這兩次請(qǐng)求之間是獨(dú)立的。 為了解決這個(gè)問(wèn)題嚷炉, Web程序引入了Cookie機(jī)制來(lái)維護(hù)狀態(tài)渊啰。),這些數(shù)據(jù)就是Cookie申屹,它是 Internet 站點(diǎn)創(chuàng)建的 ,為了辨別用戶身份而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)绘证,Cookie中的信息一般都是經(jīng)過(guò)加密的,Cookie存在緩存中或者硬盤(pán)中哗讥,在硬盤(pán)中的是一些小文本文件,當(dāng)你訪問(wèn)該網(wǎng)站時(shí)嚷那,就會(huì)讀取對(duì)應(yīng)網(wǎng)站的Cookie信息,Cookie有效地提升了我們的上網(wǎng)體驗(yàn)杆煞。
Request.Cookies 是客戶端通過(guò) Cookie 標(biāo)頭形式由客戶端傳輸?shù)椒?wù)器的 Cookie魏宽;
Response.Cookies 在服務(wù)器上創(chuàng)建并以 Set-Cookie 標(biāo)頭的形式傳輸?shù)娇蛻舳恕R簿褪钦f(shuō)决乎,一個(gè)是客戶端向服務(wù)器端發(fā)送的來(lái)的队询,一個(gè)是服務(wù)器發(fā)送到客戶端的。
會(huì)話對(duì)象requests.Session能夠跨請(qǐng)求地保持某些參數(shù)构诚,比如cookies蚌斩,即在同一個(gè)Session實(shí)例發(fā)出的所有請(qǐng)求都保持同一個(gè)cookies,而requests模塊每次會(huì)自動(dòng)處理cookies,這樣就很方便地處理登錄時(shí)的cookies問(wèn)題范嘱。
使用requests.Session的用法一般如下:
s= requests.session()
login_data = {'user':'用戶名','passdw':'密碼'}
headers={xx}
s.post(' http://xxx' , data=login_data,headers=headers) #這里post地址為登錄頁(yè)面地址送膳;
web_data=s.get('http://www.xxx.net/archives/155/'); #這里是想要抓取頁(yè)面的地址。
今天是5.5號(hào)丑蛤。
對(duì)于模擬登錄一般有兩種方法:一叠聋、直接使用登錄成功后頁(yè)面里的cookies,然后加入到requests.get(url,cookies=cookies)中實(shí)現(xiàn)跳轉(zhuǎn)到登錄后的頁(yè)面受裹。二碌补、使用構(gòu)造表單的形式,表單里應(yīng)該提交哪些內(nèi)容棉饶,則是主要要研究的地方脑慧。一般采用F12查看network下的login頁(yè)的headers,如果看不到Form data這一欄砰盐,那么故意輸錯(cuò)密碼試一次,就能查看到坑律,接下來(lái)就是根據(jù)表單的構(gòu)成去構(gòu)造相應(yīng)內(nèi)容來(lái)實(shí)現(xiàn)登錄岩梳。
下面使用第一種方法分別用于登錄新浪微博和QQ空間囊骤。
一、利用cookies模擬登錄
有時(shí)候在chrome中若看不到相應(yīng)的cookies冀值,則可用fiddler來(lái)抓取也物。
兩者使用cookies登錄時(shí)的方式一樣,均為:
# !/usr/bin/env python
# _*_ coding: utf-8 _*_
__author__ = 'guohuaiqi'
import requests
from bs4 import BeautifulSoup
url='http://user.qzone.qq.com/2544526560'
headers={
'Host': 'user.qzone.qq.com', #一般headers里最好不要加host
'Connection': 'keep-alive',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36',
'Referer': 'http://qzs.qq.com/qzone/v5/loginsucc.html?para=izone',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cookie': '_gscu_661903259=43107127kqbeya46; __Q_w_s__appDataSeed=1; hasShowWeiyun2544526560=1; luin=o0547991664; lskey=0001000012501c1ee782995df2b1023b7a002d9df119459a1e2edd061ddb927329bd8869a297c99346bf0c88; __Q_w_s_hat_seed=1; RK=lJPTixPn78; pgv_pvi=3677243392; __Q_w_s__QZN_TodoMsgCnt=1; qz_screen=1366x768; QZ_FE_WEBP_SUPPORT=1; cpu_performance_v8=16; pgv_pvid=3740166140; o_cookie=547991664; _qz_referrer=www.baidu.com; pgv_info=ssid=s4432010900; ptui_loginuin=2544526560; ptisp=edu; ptcz=4bec8c1683a35352bb0e283e126172e7dc5fe732d6c83b97582ba81f2e32e76a; pt2gguin=o2544526560; uin=o2544526560; skey=@MsHLbnMJC; p_uin=o2544526560; p_skey=mbwScLxeHFXh8-Dzhc1ZW96z03nEJinbwd1sJ5*ORvo_; pt4_token=h0621trCtnTA1u*csRokPwDkN4T6VmUlmlDWEGqswAI_; fnc=2'
}
web_data=requests.get(url,headers=headers)
soup=BeautifulSoup(web_data.text,'lxml')
shuoshuo=soup.select('#menuContainer > div > ul > li.menu_item_311 > a')[0].get_text()
href=soup.select('#menuContainer > div > ul > li.menu_item_311 > a')[0].get('href')
print(shuoshuo,href)
其中headers部分是直接把瀏覽器里面的request headers全部復(fù)制進(jìn)來(lái)了列疗。在soup=BeautifulSoup(web_data.text,'lxml')之后若直接print(soup)滑蚯,會(huì)一直提示:'gbk' codec can't encode character '\u2764'之類的編碼錯(cuò)誤,所以直接select自己想要抓取的部分的內(nèi)容再print出來(lái)了抵栈。
另外當(dāng)href是javascript時(shí)告材,如下:
<a href="javascript:;" title="日志" tabindex="1" accesskey="r">日志</a>
這時(shí)應(yīng)該怎樣獲取跳轉(zhuǎn)連接還是不太清楚,若后面爬取相關(guān)內(nèi)容遇到相應(yīng)問(wèn)題時(shí)可仔細(xì)學(xué)習(xí)古劲。
二斥赋、第二種方法由于在weibo和qq中均涉及到加密的相關(guān)知識(shí),所以直接選擇放棄产艾。
還有最后一個(gè)點(diǎn)就是:一般爬取網(wǎng)站時(shí)首先考慮爬取手機(jī)端疤剑,再考慮爬取pc端。