前言
本博客主要記錄跟隨崔慶才老師的分析Ajax抓取今日頭條街拍美圖學(xué)習(xí)的整個(gè)過程,更多精品文章,請參閱崔老師的博客,再次感謝崔老師教導(dǎo)。
3月15日更新,14日代碼敲完了,今天主要總結(jié)整個(gè)過程
啰嗦心得
-
個(gè)人覺得在掌握了Python的基礎(chǔ)的前提下,爬蟲的難點(diǎn)在于兩點(diǎn):
- 分析網(wǎng)頁結(jié)構(gòu),看要獲取的數(shù)據(jù)獲取的方式
- 利用語言知識去匹配或者利用其它的方法,比如ajax等發(fā)起請求獲取數(shù)據(jù)等等
這兩點(diǎn)前者更為復(fù)雜,因?yàn)橛械木W(wǎng)頁比如本例中,街拍的索引頁面的詳情頁面中,詳情的數(shù)據(jù)是在頁面的一個(gè)js的變量中,但是在我跟隨視頻學(xué)習(xí)的過程中發(fā)現(xiàn),此時(shí)的頁面很多已經(jīng)不是存在一個(gè)變量中,而是存在于標(biāo)簽中,說明頁面是有過改版,此時(shí)同一個(gè)詳情頁面就不能一概而論,要寫不同的方法處理,不過由于爬蟲功底還很薄弱,所以對于存在于標(biāo)簽中的鏈接,我并沒有處理,而是進(jìn)行了過濾,待到基礎(chǔ)比較扎實(shí)以后,會對代碼進(jìn)行更新(
March 15)
開始爬取
索引頁面
- 前期要求
簡單來說此次抓取氛圍兩部分,一部分是圖片的索引頁面,另外一部分是通過點(diǎn)擊索引進(jìn)入詳情頁面,抓取具體的圖片的地址,并將其存儲,最后下載圖片資源
- 索引頁面分析
跟隨視頻學(xué)習(xí),打開谷歌的工具查看索引頁面的源代碼,沒有看到和素材相關(guān)的資源,這里略總結(jié)一下,以目前自己所學(xué)的這點(diǎn)知識,想要的鏈接信息主要存在于一下三方面的元素中
存在于HTML的標(biāo)簽的鏈接中
存在于CSS樣式中
存在于 頁面的js代碼中
存在于ajax的請求中(索引頁面就是這種)
-
索引頁數(shù)據(jù)分析
-
通過分析所以頁面是通過ajax請求獲取到的,通過Google瀏覽器的工具filter工具的XHR過濾項(xiàng)可以看出
xhr.png -
索引頁面數(shù)據(jù)分析,參看下圖
data
具體索引鏈接 - 經(jīng)過分析是通過ajax請求,獲取回來的數(shù)據(jù),其中article_url就是進(jìn)入詳情頁面的鏈接,我們通過構(gòu)建一個(gè)ajax請求,然后獲取返回?cái)?shù)據(jù),在獲取字段
-
-
索引頁抓取
構(gòu)建ajax請求獲取數(shù)據(jù)
-
代碼 <b>
由于markdown格式問題,我就不粘貼代碼,用圖片代替,博客末尾我會附上代碼地址
索引頁面數(shù)據(jù)獲取 -
代碼分析
-
data:是ajax的所需要的參數(shù),這個(gè)參數(shù)是參看XHR中的
參數(shù) - url : baseUrl + 經(jīng)過轉(zhuǎn)碼的參數(shù),成為完整的url【get請求】,其中轉(zhuǎn)碼函數(shù)urlencode包含在你
from urllib import urlencode - 請求:本次的請求框架是requests,我一直以為requests是Python的原生庫,其實(shí)屬于第三方框架 ,故安裝
sudo pip install requests,導(dǎo)入import requests,具體訪問參見代碼
-
-
解析索引頁面返回的json數(shù)據(jù)
- 根據(jù)之前的分析,ajax請求返回值的數(shù)據(jù)類型是json,故利用Python內(nèi)部的json模塊就可以解析
import json -
json 解析完成以后,就可以根據(jù)節(jié)點(diǎn)取出相應(yīng)的值,通過遍歷數(shù)據(jù)返回一個(gè)首頁的索引的ur列表
索引數(shù)據(jù)解析
- 根據(jù)之前的分析,ajax請求返回值的數(shù)據(jù)類型是json,故利用Python內(nèi)部的json模塊就可以解析
詳情頁面
- 詳情頁面分析
經(jīng)過分析,在圖片的詳情頁面圖片數(shù)據(jù)是存儲在頁面的
var gallery變量中,這變量后面也是一個(gè)json數(shù)據(jù),所以我們經(jīng)過正則匹配來或者這個(gè)變量后邊的json數(shù)據(jù)
-
詳情頁面抓取
這個(gè)比較簡單,根據(jù)索引頁的url,進(jìn)行頁面獲取,與索引頁的獲取基本相同
詳情頁面獲取 - 詳情頁面解析
這里要做的工作就是在頁面中通過正則匹配找到var gallery,然后獲取后面的json數(shù)據(jù)
gallery后邊的json數(shù)據(jù)結(jié)構(gòu)
詳情頁面解析- 由于詳情頁面就是普通的HTML頁面,可以通過BeautifulSoup框架解析, BeautifulSoup框架需要通過pip安裝,然后導(dǎo)入
from bs4 import BeautifulSoup
- 由于詳情頁面就是普通的HTML頁面,可以通過BeautifulSoup框架解析, BeautifulSoup框架需要通過pip安裝,然后導(dǎo)入
- 將匹配完獲取的數(shù)據(jù)用json框架進(jìn)行解析,由于圖片數(shù)據(jù)是一個(gè)數(shù)組,故需要遍歷取值
- 返回一個(gè)數(shù)組,包括詳情頁面的標(biāo)題,詳情頁面的url,圖片的url數(shù)組
存儲到數(shù)據(jù)庫
- 下載安裝mongoDB,這里不贅述
- 配置mongoDB,可以參見我的博客
- pycharm配置mongoDB
-
創(chuàng)建config.py配置文件,然后配置一些參數(shù),包括主機(jī),數(shù)據(jù)庫名,表名
- 創(chuàng)建數(shù)據(jù)庫,主要利用
pymongo(import pymongo)框架,因?yàn)檠芯康牟皇呛軓氐?,這里只寫一些簡單的代碼,不要忘記導(dǎo)入配置文件from config import *
創(chuàng)建數(shù)據(jù)庫 -
存儲數(shù)據(jù)
存儲數(shù)據(jù)
-
下載圖片
-
通過url下載圖片數(shù)據(jù),是Python相關(guān)知識,不贅述
下載圖片 -
將圖片數(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()
最后
無論從接觸爬蟲還是博客的編寫都顯得匆忙和粗糙,以后隨著知識的完善,博客也會進(jìn)行相應(yīng)的更新,希望大家不吝賜教,提出問題指正,謝謝














