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

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

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

利用cookie
當(dāng)你登錄一個網(wǎng)站后,便會產(chǎn)生對應(yīng)的cookie,cookie是讓瀏覽器知道你曾經(jīng)登錄過,所以當(dāng)你訪問該站點的其它頁面便不用再進(jìn)行登錄操作,另外,并且當(dāng)你再次訪問該網(wǎng)站也無需進(jìn)行登錄。所以在進(jìn)行爬蟲操作時,將cookie加入你的請求的標(biāo)題頭即可。
獲取cookie有如下方法,第一種直接在開發(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) #用戶名
elem_pwd = driver.find_element_by_id("loginPassword")
elem_pwd.send_keys(password) #密碼
time.sleep(5) #sleep這個習(xí)慣其實不是很好,最好使用之前提過的顯式等待
elem_sub = driver.find_element_by_id("loginAction")
elem_sub.click() #點擊登陸
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)過處理后的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里之后隨請求一起發(fā)送,就可以得到登錄后的頁面
index_url = 'http://weibo.cn/ofobike?page=1'
request = urllib2.Request(url = index_url, headers = headers)