Python爬蟲:抓取今日頭條圖集
今天我們來爬取今日頭條圖集,老司機以街拍為例。
運行平台: Windows
Python版本: Python3.6IDE: Sublime Text
其他工具: Chrome瀏覽器1、網頁分析
從打開今日頭條首頁,搜索「街拍」,下面有四個標籤頁「綜合」、「視頻」、「圖集」和「用戶」,我們依次點擊幾個標籤,頁面雖然變化了,但是地址欄的網址並沒有變化,說明網頁內容是動態載入的。
按「F12」調出Developer Tools,並刷新頁面,接下來分析Developer Tools:
①:點擊Network
②:選擇XHR
③:找以「?offset=「開頭的一項並點擊,右側出現詳情
④:點擊右側「Header」標籤頁
⑤:看到請求方式和請求地址
⑥:此處為請求的參數
接下來點擊Preview標籤頁查看返回的數據:
返回數據格式為json,展開「data」欄位,並展開第一項,查找「title」,可以看到和網頁第一個圖集標題一致,說明找對地方了。
繼續分析,「data」第一項里有一個「image_detail」欄位,展開可以看到6項,並且每一項都有一個url,一看就是圖片網址,不知是不是我們要找的,將該url複製到瀏覽器打開確實和第一張縮略圖一樣,那麼這6個是不是該圖集中所有的圖像呢?
點擊網頁第一個圖集,可以看到確實只有6張圖片,而且與返回json數據中的圖片一致。
到這裡分析完了嗎?我們看一下網頁中除了圖片,文字和相關推薦佔了那麼多內容,圖片顯得有點小,我們在圖片上右擊選擇「在新標籤頁中打開圖片」,注意看地址欄:
發現其中奧秘了嗎?圖片地址「large」變成了「origin」,將兩個圖片分別保存,比較一下大小,origin比large大很多,這才是我們需要的,至此,網頁分析全部完成,接下來開始寫代碼。
2、代碼
採用requests庫進行抓取,由於前面分析已經很詳細,代碼就不分開講解,請看注釋內容
#-*- coding: utf-8 -*-import osimport reimport jsonimport requestsfrom urllib.parse import urlencodedef get_one_page(offset, keyword): 獲取網頁html內容並返回 paras = { offset: offset, # 搜索結果項開始的位置 format: json, # 返回的數據格式 keyword: keyword, # 搜索的關鍵字 autoload: true, # 自動載入 count: 20, # 每次載入結果的項目數 cur_tab: 3, # 當前的tab頁索引,3為「圖集」 from: gallery # 來源,「圖集」 } headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36} url = https://www.toutiao.com/search_content/? + urlencode(paras) try: # 獲取網頁內容,返回json格式數據 response = requests.get(url, headers=headers) # 通過狀態碼判斷是否獲取成功 if response.status_code == 200: return response.text return None except RequestException: return Nonedef parse_one_page(html): 解析出組圖網址,並將網頁中所有圖集的標題及圖片地址返回 urls = [] data = json.loads(html) if data and data in data.keys(): for item in data.get(data): page_urls = [] title = item.get(title) image_detail = item.get(image_detail) for i in range(len(image_detail)): # 獲取large圖片地址 url = image_detail[i][url] # 替換URL獲取高清原圖 url = url.replace(large, origin) page_urls.append(url) urls.append({title: title,url_list: page_urls}) return urlsdef save_image_file(url, path): 保存圖像文件 ir = requests.get(url) if ir.status_code == 200: with open(path, wb) as f: f.write(ir.content) f.close()def main(offset, word): html = get_one_page(offset, word) urls = parse_one_page(html) # 圖像文件夾不存在則創建 root_path = word if not os.path.exists(root_path): os.mkdir(root_path) for i in range(len(urls)): print(---正在下載 %s%urls[i][title]) folder = root_path + / + urls[i][title] if not os.path.exists(folder): try: os.mkdir(folder) except NotADirectoryError: continue except OSError: continue url_list = urls[i][url_list] for j in range(len(url_list)): path = folder + /index_ + str("%02d"%j) + .jpg if not os.path.exists(path): save_image_file(urls[i][url_list][j], path)if __name__ == __main__: # 抓取2000個圖集,基本上包含全部圖集 for i in range(100): main(i*20, 街拍)
可以根據自己喜好替換關鍵詞下載你喜歡的圖集。
推薦閱讀:
※初識Scrapy,在充滿爬蟲的世界裡做一個好公民
※網易雲音樂Ajax Post參數加密方法
※PYTHON爬蟲將相對路徑轉化為絕對路徑
※python爬取QQ音樂
※四、BeautifulSoup庫