這兩周花了點(diǎn)時(shí)間讀了《Python網(wǎng)絡(luò)數(shù)據(jù)采集》,內(nèi)容不多,不到200頁(yè),但是非常豐富,有入門(mén),有提高,有注意事項(xiàng),有經(jīng)驗(yàn)之談,有原理,有分析,讀完受益匪淺。書(shū)中講了很多反爬蟲(chóng)、圖片驗(yàn)證碼之類的東西,不過(guò)感謝csdn的開(kāi)放性,這些都沒(méi)有。所以第一個(gè)練習(xí),就是爬取csdn的極客頭條的更新文章。
1、思路
思路比較簡(jiǎn)單,首先是登錄,然后爬取頁(yè)面的更新文章名稱和鏈接。要注意的一點(diǎn)是,極客頭條的列表刷新是動(dòng)態(tài)的,只有頁(yè)面有滾動(dòng)條并且往下拉的時(shí)候,才會(huì)加載新的文章列表。我用豎屏顯示器試了下,沒(méi)有滾動(dòng)條的情況下,默認(rèn)顯示20條的文章列表,結(jié)果不能加載新的文章列表,應(yīng)該算是bug。
2、準(zhǔn)備
通過(guò)瀏覽器的開(kāi)發(fā)人員工具抓包,可以發(fā)現(xiàn)極客頭條申請(qǐng)新列表的時(shí)候URL格式如下:
http://geek.csdn.net/service/news/get_news_list?jsonpcallback=jQuery203014439105321047596_1516862462757&username=[賬戶名]&from=-&size=20&type=hackernewsv2_new&_=1516862462758
請(qǐng)求參數(shù):
jsonpcallback:
jQuery20302827217349787545_1516863701413 #該參數(shù)是jQuery框架自動(dòng)生成的匿名回調(diào)函數(shù)的函數(shù)名,用于ajax獲取數(shù)據(jù)時(shí)的數(shù)據(jù)處理,看網(wǎng)頁(yè)源代碼,應(yīng)該是利用getJSON,所以是頁(yè)面端生成的參數(shù),可以隨意填寫(xiě)
username: [賬戶名]
from:
6:252765 #這個(gè)參數(shù)代表的是下一次請(qǐng)求文章列表時(shí),文章的起始編號(hào),如果是第一次請(qǐng)求列表,則這里填‘-’(短杠),和上面例子中一樣,下次編號(hào)會(huì)在本次請(qǐng)求返回的JSON數(shù)據(jù)中攜帶
size:
20 #本次請(qǐng)求的文章條目數(shù),我試過(guò)1000都成功了。。。
type:
hackernewsv2_new #文章類型,類型在首頁(yè)的“最熱 最新 業(yè)界”等等那一行小標(biāo)題,選擇的分類不同,這個(gè)參數(shù)不同,具體抓包可見(jiàn)
_:
1516863701415 #沒(méi)什么用,就是第一個(gè)參數(shù)下短杠后面的數(shù)字累加,實(shí)際測(cè)試沒(méi)有也可以
通過(guò)查找資料和抓包,發(fā)現(xiàn)csdn的登錄還是很簡(jiǎn)單的,只要用戶名密碼,不需要驗(yàn)證碼等等,抓包可以看到請(qǐng)求參數(shù):
gps:
39.890503,116.431339
username:
[賬戶名]
password:
[密碼] #抓包的話這里是明碼,發(fā)出去的話應(yīng)該是加密的
rememberMe:
true #是否記住密碼
lt:
LT-448149-vgNusKFi3i7wBRIZUrzCFLDfoDVP34 #這個(gè)參數(shù)是在登錄主頁(yè)面中的,需要自己解析出來(lái),數(shù)值隨機(jī),每次登錄需要獲取
execution:
e3s1 #目前是固定值,和網(wǎng)文對(duì)比這個(gè)值不同,所以還是每次登錄獲取的好
_eventId:
submit #固定值,就是代表提交
登錄時(shí)要注意的是,csdn為了防爬蟲(chóng),要求HTTP頭的User-Agent字段必須是真實(shí)的,所以我用了抓包里面真實(shí)的瀏覽器填充的字段,否則會(huì)一直登錄失敗,返回登錄頁(yè)。
通過(guò)抓包可以看到,請(qǐng)求文章后,返回的是json數(shù)據(jù),其中‘from’自動(dòng)用于下次請(qǐng)求,‘html’字段就是返回的網(wǎng)頁(yè),utf-8編碼的Unicode字符串,Python默認(rèn)用的就是Unicode,所以取出html字段的數(shù)據(jù)后自動(dòng)轉(zhuǎn)為了漢字、符號(hào)等,然后解析其中的class類型為‘title’的鏈接,就可以獲得文章鏈接和名稱。
3、代碼(非常短)
-
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627 -
csdn
+關(guān)注
關(guān)注
2文章
16瀏覽量
6844
原文標(biāo)題:Python 爬取CSDN的極客頭條
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論