抓取今日头条spaceX图片(Ajax实例)

前言

本文以前文Ajax爬虫基本原理为理论基础,用python实现爬取今日头条图片(以spaceX为例,可任意选择)

提示:以下是本篇文章正文内容,下面案例可供参考

一、Ajax分析

第一步

以Google浏览器和今日头条网页版为例,打开网页版今日头条,搜索‘spaceX’,打开开发者工具,之前一般网页的爬取需要在Elements中进行结构性数据采集,但是Ajax的数据采集区域在Network选项卡中,因为对于这种页面数据不会在网页源码中显示;
在这里插入图片描述

第二步

打开Network选项卡,这里显示的内容是浏览器与服务器进行数据交换的全部记录,数据请求可以分为多种类型(下图中用红色的圈标出,如XHR,JS,CSS等),ajax作为一种无需重新加载整个网页的情况下,能够更新部分网页的数据交换技术,那么通过它的数据也必然在Network选项卡中出现,而且它的请求数据类型为XHR;
在这里插入图片描述

打开XHR选项卡,找到我们想要得到的请求,不难发现,随着我们的页面的刷新,下面的请求内容不断更新,但是找到规律,这些带红圈的数字在以整数倍递增,这也就意味着我们在不断获取一个个新的页面;
在这里插入图片描述
在这里插入图片描述

第三步

具体查看一下这些具有规律的请求,我们可以在Requests Header中找到)下面这个红圈中内容,前面ajax原理中讲到这个XMLHttpRequest正式ajax数据请求的标志,第二个图片response正是这个请求所返回的内容,这是页面的最原始的内容,未经过JavaScript渲染,我们可以点击preview看到最终的内容;
在这里插入图片描述
在这里插入图片描述

第四步

点击preview选项卡找到经过渲染过后的response的返回内容,通过我们的细心观察,我们可以在‘data’中观察到存在20组数据,再打开这20组数据中的任意一组,找到我们想要找的内容,这里我们以图片为例进行抓取,图片出现多个标签中,我们就选择其中一个‘large_image_url’标签(这个标签中图片高清而且比较大,当然也可以选择’image_list‘等)进行下载。

二、代码实现

1.实现对页面的数据请求

代码如下(示例):

import os
import requests
from urllib.parse import urlencode
def get_page(offset):
    base_url='https://www.toutiao.com/api/search/content/?'
    params={'aid':24,
            'app_name':'web_search',
            'offset':offset,
            'format':'json',
            'keyword':'spacex',}
    add_url=urlencode(params)#用于url编码
    url=base_url+add_url#组合形成目标url
    try:
        response=requests.get(url)
        if response.status_code==200:
            return response.json()#若请求成功,返回json格式的response
    except requests.RequestException:
        return None#若请求失败,返回None

2.处理返回数据进行数据提取,存贮

代码如下(示例):

def get_image(json):
    for item in json.get('data'):
        datetime=item.get('datetime')
        image= item.get('large_image_url')
        if image is not None:
            if 'pgc-image' in image:
                yield {'datetime':datetime,
                      'image':image} 
#提取图片url和时间,并调用yield,此时执行这个函数会返回一个迭代器对象,读者可以自行尝试
#再次请求获得url地址,进行图片数据存贮
def save_image(items):
    for item in items:
        try:
            response = requests.get(item.get('image'))
            image_path=os.path.join(os.getcwd()+'/'+item.get('image').split('/')[-1]+'.jpg')#此处用于定义图片名称
            if not os.path.exists(image_path):
                with open(image_path,'wb') as f:
                    f.write(response.content)
                    #response.content函数用于存贮二进制格式的图片
        except requests.ConnectionError:
            print('Can not be saved')

最终效果如下图:
在这里插入图片描述


总结

本文利用用今日头条网页版为例利用python进行网页图片采集,建立在对ajax原理的基础之上,欢迎大家提出问题!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值