好了,現(xiàn)在講述針對(duì)Ajax異步請(qǐng)求內(nèi)容的爬蟲(chóng)實(shí)例,以新浪微博為例。
首先,新浪微博與前面講述的兩個(gè)網(wǎng)站不同的是,需登錄才能獲取內(nèi)容,否則只能看到幾條微博。
正題,模擬登錄的幾種方式
這里爬取的是新浪微博手機(jī)端網(wǎng)站,也就是m站,輸入http://m/weibo.cn,
你會(huì)看到如下界面,需要登錄后才能看到界面

1.利用用戶(hù)id
首先介紹一種最簡(jiǎn)單的方式跳過(guò)登錄界限,針對(duì)是爬取特定用戶(hù)的信息,僅需加上需爬取用戶(hù)id即可
如: http://m.weibo.cn/u/12337777 12337777為用戶(hù)id,這里是數(shù)字是隨意寫(xiě)的,可以加上自己的id,用戶(hù)id 可自行登錄后 ,在開(kāi)發(fā)者工具網(wǎng)絡(luò)中下圖X-Log-Uid中后面的那串?dāng)?shù)字就是你的id

同理,也可以看見(jiàn)你關(guān)注用戶(hù)的id,進(jìn)入你關(guān)注用戶(hù)的界面,打開(kāi)開(kāi)發(fā)者工具,重新載入一次界面,可在XHR中看到返回為json的請(qǐng)求,打開(kāi)響應(yīng),可看到各項(xiàng)參數(shù)。

利用cookie
當(dāng)你登錄一個(gè)網(wǎng)站后,便會(huì)產(chǎn)生對(duì)應(yīng)的cookie,cookie是讓瀏覽器知道你曾經(jīng)登錄過(guò),所以當(dāng)你訪(fǎng)問(wèn)該站點(diǎn)的其它頁(yè)面便不用再進(jìn)行登錄操作,另外,并且當(dāng)你再次訪(fǎng)問(wèn)該網(wǎng)站也無(wú)需進(jìn)行登錄。所以在進(jìn)行爬蟲(chóng)操作時(shí),將cookie加入你的請(qǐng)求的標(biāo)題頭即可。
獲取cookie有如下方法,第一種直接在開(kāi)發(fā)者工具中找

第二種方式可利用之前提到的selenium,模擬登錄之后獲取cookie
driver.get("https://passport.weibo.cn/signin/login?")
time.sleep(5)
elem_user = driver.find_element_by_id("loginName")
elem_user.send_keys(username) #用戶(hù)名
elem_pwd = driver.find_element_by_id("loginPassword")
elem_pwd.send_keys(password) #密碼
time.sleep(5) #sleep這個(gè)習(xí)慣其實(shí)不是很好,最好使用之前提過(guò)的顯式等待
elem_sub = driver.find_element_by_id("loginAction")
elem_sub.click() #點(diǎn)擊登陸
time.sleep(2)
cookies = driver.get_cookies() #獲取cookie
cookie = [item["name"] + "=" + item["value"] for item in cookies]
cookiestr = ';'.join(item for item in cookie) #處理cookie使其格式與標(biāo)題頭中要求一致
于是,經(jīng)過(guò)處理后的cookie就和上一圖片中cookie后面的值一樣啦。
獲取了cookie之后怎么使用呢?
user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0'
headers = { 'User-Agent' : user_agent , 'cookie': cookies}##把得到的cookie加在header里之后隨請(qǐng)求一起發(fā)送,就可以得到登錄后的頁(yè)面
index_url = 'http://weibo.cn/ofobike?page=1'
request = urllib2.Request(url = index_url, headers = headers)