前言
本博客主要記錄跟隨崔慶才老師的分析Ajax抓取今日頭條街拍美圖學(xué)習(xí)的整個(gè)過程睛廊,更多精品文章,請(qǐng)參閱崔老師的博客抡砂,再次感謝崔老師教導(dǎo)。
3月15日更新恬涧,14日代碼敲完了注益,今天主要總結(jié)整個(gè)過程
啰嗦心得
-
個(gè)人覺得在掌握了Python的基礎(chǔ)的前提下,爬蟲的難點(diǎn)在于兩點(diǎn):
- 分析網(wǎng)頁(yè)結(jié)構(gòu)溯捆,看要獲取的數(shù)據(jù)獲取的方式
- 利用語(yǔ)言知識(shí)去匹配或者利用其它的方法聊浅,比如ajax等發(fā)起請(qǐng)求獲取數(shù)據(jù)等等
這兩點(diǎn)前者更為復(fù)雜,因?yàn)橛械木W(wǎng)頁(yè)比如本例中现使,街拍的索引頁(yè)面的詳情頁(yè)面中低匙,詳情的數(shù)據(jù)是在頁(yè)面的一個(gè)js的變量中,但是在我跟隨視頻學(xué)習(xí)的過程中發(fā)現(xiàn)碳锈,此時(shí)的頁(yè)面很多已經(jīng)不是存在一個(gè)變量中顽冶,而是存在于標(biāo)簽中,說明頁(yè)面是有過改版售碳,此時(shí)同一個(gè)詳情頁(yè)面就不能一概而論强重,要寫不同的方法處理绞呈,不過由于爬蟲功底還很薄弱,所以對(duì)于存在于標(biāo)簽中的鏈接间景,我并沒有處理佃声,而是進(jìn)行了過濾,待到基礎(chǔ)比較扎實(shí)以后倘要,會(huì)對(duì)代碼進(jìn)行更新(
March 15
)
開始爬取
索引頁(yè)面
- 前期要求
簡(jiǎn)單來說此次抓取氛圍兩部分圾亏,一部分是圖片的索引頁(yè)面,另外一部分是通過點(diǎn)擊索引進(jìn)入詳情頁(yè)面封拧,抓取具體的圖片的地址志鹃,并將其存儲(chǔ),最后下載圖片資源
- 索引頁(yè)面分析
跟隨視頻學(xué)習(xí)泽西,打開谷歌的工具查看索引頁(yè)面的源代碼曹铃,沒有看到和素材相關(guān)的資源,這里略總結(jié)一下捧杉,以目前自己所學(xué)的這點(diǎn)知識(shí)陕见,想要的鏈接信息主要存在于一下三方面的元素中
存在于HTML的標(biāo)簽的鏈接中
存在于CSS樣式中
存在于 頁(yè)面的js代碼中
存在于ajax的請(qǐng)求中(索引頁(yè)面就是這種)
-
索引頁(yè)數(shù)據(jù)分析
-
通過分析所以頁(yè)面是通過ajax請(qǐng)求獲取到的,通過Google瀏覽器的工具filter工具的XHR過濾項(xiàng)可以看出
xhr.png -
索引頁(yè)面數(shù)據(jù)分析味抖,參看下圖
data
具體索引鏈接 - 經(jīng)過分析是通過ajax請(qǐng)求评甜,獲取回來的數(shù)據(jù),其中article_url就是進(jìn)入詳情頁(yè)面的鏈接非竿,我們通過構(gòu)建一個(gè)ajax請(qǐng)求蜕着,然后獲取返回?cái)?shù)據(jù)谋竖,在獲取字段
-
-
索引頁(yè)抓取
構(gòu)建ajax請(qǐng)求獲取數(shù)據(jù)
-
代碼 <b>
由于markdown格式問題红柱,我就不粘貼代碼,用圖片代替蓖乘,博客末尾我會(huì)附上代碼地址
索引頁(yè)面數(shù)據(jù)獲取 -
代碼分析
-
data:是ajax的所需要的參數(shù)锤悄,這個(gè)參數(shù)是參看XHR中的
參數(shù) - url : baseUrl + 經(jīng)過轉(zhuǎn)碼的參數(shù),成為完整的url【get請(qǐng)求】嘉抒,其中轉(zhuǎn)碼函數(shù)urlencode包含在你
from urllib import urlencode
- 請(qǐng)求:本次的請(qǐng)求框架是requests零聚,我一直以為requests是Python的原生庫(kù),其實(shí)屬于第三方框架 些侍,故安裝
sudo pip install requests
,導(dǎo)入import requests
,具體訪問參見代碼
-
-
解析索引頁(yè)面返回的json數(shù)據(jù)
- 根據(jù)之前的分析隶症,ajax請(qǐng)求返回值的數(shù)據(jù)類型是json,故利用Python內(nèi)部的json模塊就可以解析
import json
-
json 解析完成以后岗宣,就可以根據(jù)節(jié)點(diǎn)取出相應(yīng)的值蚂会,通過遍歷數(shù)據(jù)返回一個(gè)首頁(yè)的索引的ur列表
索引數(shù)據(jù)解析
- 根據(jù)之前的分析隶症,ajax請(qǐng)求返回值的數(shù)據(jù)類型是json,故利用Python內(nèi)部的json模塊就可以解析
詳情頁(yè)面
- 詳情頁(yè)面分析
經(jīng)過分析,在圖片的詳情頁(yè)面圖片數(shù)據(jù)是存儲(chǔ)在頁(yè)面的
var gallery
變量中耗式,這變量后面也是一個(gè)json數(shù)據(jù)胁住,所以我們經(jīng)過正則匹配來或者這個(gè)變量后邊的json數(shù)據(jù)
-
詳情頁(yè)面抓取
這個(gè)比較簡(jiǎn)單趁猴,根據(jù)索引頁(yè)的url,進(jìn)行頁(yè)面獲取,與索引頁(yè)的獲取基本相同
詳情頁(yè)面獲取 - 詳情頁(yè)面解析
這里要做的工作就是在頁(yè)面中通過正則匹配找到var gallery
彪见,然后獲取后面的json數(shù)據(jù)
gallery后邊的json數(shù)據(jù)結(jié)構(gòu)
詳情頁(yè)面解析- 由于詳情頁(yè)面就是普通的HTML頁(yè)面儡司,可以通過BeautifulSoup框架解析, BeautifulSoup框架需要通過pip安裝余指,然后導(dǎo)入
from bs4 import BeautifulSoup
- 由于詳情頁(yè)面就是普通的HTML頁(yè)面儡司,可以通過BeautifulSoup框架解析, BeautifulSoup框架需要通過pip安裝余指,然后導(dǎo)入
- 將匹配完獲取的數(shù)據(jù)用json框架進(jìn)行解析捕犬,由于圖片數(shù)據(jù)是一個(gè)數(shù)組,故需要遍歷取值
- 返回一個(gè)數(shù)組浪规,包括詳情頁(yè)面的標(biāo)題或听,詳情頁(yè)面的url,圖片的url數(shù)組
存儲(chǔ)到數(shù)據(jù)庫(kù)
- 下載安裝mongoDB笋婿,這里不贅述
- 配置mongoDB誉裆,可以參見我的博客
- pycharm配置mongoDB
-
創(chuàng)建config.py配置文件,然后配置一些參數(shù)缸濒,包括主機(jī)足丢,數(shù)據(jù)庫(kù)名,表名
- 創(chuàng)建數(shù)據(jù)庫(kù)庇配,主要利用
pymongo(import pymongo)
框架斩跌,因?yàn)檠芯康牟皇呛軓氐祝@里只寫一些簡(jiǎn)單的代碼捞慌,不要忘記導(dǎo)入配置文件from config import *
創(chuàng)建數(shù)據(jù)庫(kù) -
存儲(chǔ)數(shù)據(jù)
存儲(chǔ)數(shù)據(jù)
-
下載圖片
-
通過url下載圖片數(shù)據(jù)耀鸦,是Python相關(guān)知識(shí),不贅述
下載圖片 -
將圖片數(shù)據(jù)轉(zhuǎn)換為圖片
轉(zhuǎn)換數(shù)據(jù)
將以上代碼整體串接調(diào)用
def main(offset):
html = get_page_index(offset, KEYWORD)
for url in parse_page_index(html):
detail = get_page_detail(url)
# 這里進(jìn)行一下判斷啸澡,如果能正常返回在進(jìn)行解析
if detail and parse_page_detail(detail, url):
result = parse_page_detail(detail, url)
if result:
save_to_db(result)
if __name__ == "__main__":
main()
最后
無(wú)論從接觸爬蟲還是博客的編寫都顯得匆忙和粗糙袖订,以后隨著知識(shí)的完善,博客也會(huì)進(jìn)行相應(yīng)的更新嗅虏,希望大家不吝賜教洛姑,提出問題指正,謝謝