前言
本文以前文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')
最终效果如下图: