目標(biāo):爬取虎嗅網(wǎng)24小時新聞,存入數(shù)據(jù)庫。分析熱詞
方案:爬蟲有多種方案,我們采取requests + lxml/xpath的方案。
1. 使用到的工具
requests
一個簡單好用的網(wǎng)絡(luò)請求庫
lxml/xpath
lxml是python的一個解析庫,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高
XPath,全稱XML Path Language,即XML路徑語言,它是一門在XML文檔中查找信息的語言,它最初是用來搜尋XML文檔的,但是它同樣適用于HTML文檔的搜索
XPath的選擇功能十分強(qiáng)大,它提供了非常簡明的路徑選擇表達(dá)式,另外,它還提供了超過100個內(nèi)建函數(shù),用于字符串、數(shù)值、時間的匹配以及節(jié)點、序列的處理等,幾乎所有我們想要定位的節(jié)點,都可以用XPath來選擇
django
一個web框架,此處用來操作數(shù)據(jù)庫。
2. 大致步驟
- 分析目標(biāo)網(wǎng)頁,制定爬取策略。
- 寫代碼爬取數(shù)據(jù)。
- 保存數(shù)據(jù)。
1. 分析目標(biāo)網(wǎng)頁,制定爬取策略。
分析網(wǎng)頁源碼,使用瀏覽器、charles等分析接口請求。一般大量列表的網(wǎng)頁的分頁大致有兩種:
- 網(wǎng)址分頁,即網(wǎng)址中傳page來請求,一頁一個鏈接。https://www.kuaidaili.com
- 使用ajax一個界面實現(xiàn)分頁。https://www.huxiu.com/moment
虎嗅的24小時列表采用的是ajax加載的。
#接口:
https://www.huxiu.com/moment/ajaxGetList
#參數(shù):
last_dateline
#返回數(shù)據(jù)
{
"success": true,
"data": {
"msg": "獲取成功",
"pagesize": 20,
"total_page": 149,
"last_dateline": "1558238914",
"data": " html內(nèi)容 "
}
}
他們是以時間來分頁的,返回結(jié)果包含下次的請請求時間,可以以此來循環(huán)請求獲取數(shù)據(jù)。
返回的數(shù)據(jù)是一個<li>新聞列表,我們只需要遍歷每個li,從中取到數(shù)據(jù)即可。
2. 寫代碼爬取數(shù)據(jù)
-
獲取源碼:
res = requests.post(url, headers=headers, data=data)
res.encoding = 'utf-8'
return res.text
- Xpath 重要: 要熟悉Xpath的使用,http://www.w3school.com.cn/xpath/index.asp
路徑表達(dá)式
nodename選取此節(jié)點的所有直子節(jié)點,相當(dāng)于./
/ 選取子節(jié)點
// 選取子孫節(jié)點
. 從當(dāng)前節(jié)點
.. 從當(dāng)前節(jié)點的父節(jié)點
@選取屬性
-
創(chuàng)建數(shù)據(jù)庫:
使用Django框架操作數(shù)據(jù)庫,步驟:
1,創(chuàng)建好model。
2,執(zhí)行創(chuàng)建命令。
python manage.py makemigrations
python manage.py migrate
3. 爬取注意
有道德,注意爬取速度
應(yīng)對反爬蟲:
代理分類
判斷是否使用成功:http://httpbin.org/get
4. 生成詞云圖,分析熱點
1, 數(shù)據(jù)庫讀取數(shù)據(jù);
2,wordcloud分析;
image