网络爬虫笔记(Day4)

爬取今日头条图集 进入今日头条首页:https://www.toutiao.com/

      步骤:1、查看网页,查找我们需要的URL,分析URL

                 2、获取网页内容,分析内容

                 3、定位我们需要的内容

                 4、将数据存储

在搜素框 输入要搜索的内容(例如:街拍),然后选择图集,F12检查,查看Ajax请求:

第一次Ajax请求:

再往下拉,触发第二次、第三次Ajax请求:(下图第二次Ajax请求)

扫描二维码关注公众号,回复: 3871166 查看本文章

分析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

猜你喜欢

转载自blog.csdn.net/Clany888/article/details/81749400