1. 程式人生 > >網路爬蟲筆記(Day4)

網路爬蟲筆記(Day4)

爬取今日頭條圖集 進入今日頭條首頁:https://www.toutiao.com/

      步驟:1、檢視網頁,查詢我們需要的URL,分析URL

                 2、獲取網頁內容,分析內容

                 3、定位我們需要的內容

                 4、將資料儲存

 

在搜素框 輸入要搜尋的內容(例如:街拍),然後選擇圖集,F12檢查,檢視Ajax請求:

第一次Ajax請求:

再往下拉,觸發第二次、第三次Ajax請求:(下圖第二次Ajax請求)

分析URL後發現發現規律只有offset不同(第一次offset=0,第二次offset=20,第三次offset=40、、),其他內容都相同,此時我們得到了當前頁面的所有圖片文章的URL(每條只可以看到四張,但是裡面本應該有8張,如下圖一),但是我們得不到具體一個裡面的所有圖片。故我們需要再進去此URL,再去分析具體一篇圖片文章的所有圖片URL(下圖二)。

然後我們再分析get請求的Response,我們去分析返回值,查找出每張圖片的URL,如下圖我們找出了圖片對應的URL路徑:

所有的分析到這裡就結束了,接下來就是程式碼實現。

完整程式碼如下:

import re
import requests
import json
import os
from urllib import request

filename = 'Download'
if not os.path.exists(filename):
    os.mkdir(filename)  # 新建資料夾用於存放圖片
i = 0
strdes = 0  
offset = 20
while i < 10:
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
        }
    # 第一層 url
    url = 'https://www.toutiao.com/search_content/?offset={}&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=3&from=gallery'.format(str(offset*i))
    response = requests.get(url, headers=headers)
    res_dict = response.json()
    # print(res_dict)
    # address_url =
    res_dict_data = res_dict['data']
    # print(res_dict_data)
    # print(type(res_dict_data))
    for url_dict in res_dict_data:
        # 獲取到的第二層url
        url = url_dict['article_url']
        print(url)
        
        response = requests.get(url, headers=headers)
        info = response.text

        re_m = r'gallery: JSON\.parse\((.*)\),'
        msg = re.search(re_m, info)
        if msg == None:
            break
        msg_info = msg.group(1)
        
            
        
        msg_str = json.loads(msg_info)
        msg_dict = json.loads(msg_str)
        # print(msg_dict)
        info_msg = msg_dict['sub_images']
        for j in info_msg:
            images_url = j['url']
            # print(images_url)
            # img_name = filename + '/' + images_url.split('/')[-1] + '.jpg'
            
            img_name = filename + '/' + str(strdes) + '.jpg'
            strdes += 1

            print(img_name)
            request.urlretrieve(images_url, img_name)
    
    i = i + 1