Ajax抓取今日头条街拍美图

这个实例是抓取今日头条街拍美图,然后将每组图片分文件夹下载的到本地并保存下来。

在抓取之前先要分析抓取逻辑:
首先在搜索框中输入街拍:

Ajax抓取今日头条街拍美图_第1张图片

然后打开Preview查看Pesponse Body,在搜索框中查找:车控街拍车之一定有些情怀系列,发现并没有找到:

                                    Ajax抓取今日头条街拍美图_第2张图片

说明这些数据是由Ajax加载然后通过Javascript渲染出来的,然后打开XHR过滤选项卡:

                     Ajax抓取今日头条街拍美图_第3张图片

打开data:

                                 Ajax抓取今日头条街拍美图_第4张图片

发现title字段对应的数据正好是第一条数据。而每条数据都有一个large_image_url字段:

                     Ajax抓取今日头条街拍美图_第5张图片

因此我们只需要将url提取出来并下载下来。在提取之前,我们还需要分析url的规律:

Ajax抓取今日头条街拍美图_第6张图片

我们发现url有offset、count等参数,因此需要找出这些参数的规律,接下来滑动页面多加载一些数据:

Ajax抓取今日头条街拍美图_第7张图片发现只有offset变了,因此可以写出下面的代码:

import requests
from urllib.parse import urlencode

#加载单个Ajax请求
def get_page(offset):
    params = {
        'offset':offset,
        'format':'json',
        'keyword':'街拍',
        'autoload':'true',
        'count':'20',
        'cur_tab':'1',
        'from':'search',
        'pd':'synthesis'
    }
    url = 'https://www.toutiao.com/search_content/?'+urlencode(params)#urlencode()方法用于构造请求的GET参数
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError:
        return None

"""解析方法用于提取每条数据的image_url字段中的每一张图片链接,
   将图片链接和图片所属的标题一并返回
"""
def get_images(json):
    Img = []
    Title = []
    if json.get('data'):
        for item in json.get('data'):
            title = item.get('title')
            Title.append(title)
            images = item.get('large_image_url')
            Img.append(images)
    return Title,Img

'''
保存图片的方法,参数item是get_images()方法返回的字典
'''
def save_image(title,imag):
    try:
        response = requests.get(imag)#请求图片链接
        if response.status_code == 200:
            try:
                file_path = '图片/{0}.{1}'.format(title,'jpg')
                with open(file_path, 'wb') as f:
                    f.write(response.content)  # 将图片的二进制数据写入文件
            except OSError:
                pass
            else:
                print('下载完毕',file_path)
    except requests.ConnectionError:
        print('保存图片失败')

def main(offset):
    json = get_page(offset)
    title,img = get_images(json)
    for i in range(len(title)):
        if title[i] != None and img[i] != '':
            save_image(title[i],img[i])

GROUP_START = 1
GROUP_END = 20

if __name__ == '__main__':
    groups = [x*20 for x in range(GROUP_START,GROUP_END+1)]
    for group in groups:
        main(group)

 

你可能感兴趣的:(爬虫,Ajax)