内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

Python爬虫:抓取今日头条图集

2018-03-12 16:56 出处:清屏网 人气: 评论(0

今天我们来爬取今日头条图集,老司机以街拍为例。

运行平台:Windows

Python版本:Python3.6

IDE:Sublime Text

其他工具:Chrome浏览器

1、网页分析

从打开今日头条首页,搜索“街拍”,下面有四个标签页“综合”、“视频”、“图集”和“用户”,我们依次点击几个标签,页面虽然变化了,但是地址栏的网址并没有变化,说明网页内容是 动态加载 的。

1点击Tab页效果

按“F12”调出 Developer Tools ,并刷新页面,接下来分析Developer Tools:

2开发者工具抓包分析

①:点击Network

②:选择XHR

③:找以“?offset=“开头的一项并点击,右侧出现详情

④:点击右侧“Header”标签页

⑤:看到请求方式和请求地址

⑥:此处为请求的参数

接下来点击 Preview 标签页查看返回的数据:

3返回json文件分析

返回数据格式为json,展开“ data ”字段,并展开第一项,查找“title”,可以看到和网页第一个图集标题一致,说明找对地方了。

4返回json数据分析2

继续分析,“data”第一项里有一个“ image_detail ”字段,展开可以看到6项,并且每一项都有一个url,一看就是图片网址,不知是不是我们要找的,将该url复制到浏览器打开确实和第一张缩略图一样,那么这6个是不是该图集中所有的图像呢?

5返回json数据分析3

点击网页第一个图集,可以看到确实只有6张图片,而且与返回json数据中的图片一致。

6图集中图片数量

到这里分析完了吗?我们看一下网页中除了图片,文字和相关推荐占了那么多内容,图片显得有点小,我们在图片上右击选择“ 在新标签页中打开图片 ”,注意看地址栏:

7原图地址

发现其中奥秘了吗?图片地址“ large ”变成了“ origin ”,将两个图片分别保存,比较一下大小,origin比large大很多,这才是我们需要的,至此,网页分析全部完成,接下来开始写代码。

8图片比较

2、代码

采用requests库进行抓取,由于前面分析已经很详细,代码就不分开讲解,请看注释内容

```python

- - coding: utf-8 - -

import os

import re

import json

import requests

from urllib.parse import urlencode

def get_one_page(offset, keyword):

'''

获取网页html内容并返回

'''

paras = {

'offset': offset, # 搜索结果项开始的位置

'format': 'json', # 返回的数据格式

'keyword': keyword, # 搜索的关键字

'autoload': 'true', # 自动加载

'count': 20, # 每次加载结果的项目数

'cur_tab': 3, # 当前的tab页索引,3为“图集”

'from': 'gallery' # 来源,“图集”

}

今天我们来爬取今日头条图集,老司机以街拍为例。

运行平台:Windows

Python版本:Python3.6

IDE:Sublime Text

其他工具:Chrome浏览器

[TOC]

1、网页分析

从打开今日头条首页,搜索“街拍”,下面有四个标签页“综合”、“视频”、“图集”和“用户”,我们依次点击几个标签,页面虽然变化了,但是地址栏的网址并没有变化,说明网页内容是 动态加载 的。

按“F12”调出 Developer Tools ,并刷新页面,接下来分析Developer Tools:

①:点击Network

②:选择XHR

③:找以“?offset=“开头的一项并点击,右侧出现详情

④:点击右侧“Header”标签页

⑤:看到请求方式和请求地址

⑥:此处为请求的参数

接下来点击 Preview 标签页查看返回的数据:

返回数据格式为json,展开“ data ”字段,并展开第一项,查找“title”,可以看到和网页第一个图集标题一致,说明找对地方了。

继续分析,“data”第一项里有一个“ image_detail ”字段,展开可以看到6项,并且每一项都有一个url,一看就是图片网址,不知是不是我们要找的,将该url复制到浏览器打开确实和第一张缩略图一样,那么这6个是不是该图集中所有的图像呢?

点击网页第一个图集,可以看到确实只有6张图片,而且与返回json数据中的图片一致。

到这里分析完了吗?我们看一下网页中除了图片,文字和相关推荐占了那么多内容,图片显得有点小,我们在图片上右击选择“ 在新标签页中打开图片 ”,注意看地址栏:

发现其中奥秘了吗?图片地址“ large ”变成了“ origin ”,将两个图片分别保存,比较一下大小,origin比large大很多,这才是我们需要的,至此,网页分析全部完成,接下来开始写代码。

2、代码

采用requests库进行抓取,由于前面分析已经很详细,代码就不分开讲解,请看注释内容

#-*- coding: utf-8 -*-
import os
import re
import json
import requests
from urllib.parse import urlencode

def get_one_page(offset, keyword):
    '''
    获取网页html内容并返回
    '''
    paras = {
        'offset': offset,       # 搜索结果项开始的位置
        'format': 'json',       # 返回的数据格式
        'keyword': keyword,     # 搜索的关键字
        'autoload': 'true',     # 自动加载
        'count': 20,            # 每次加载结果的项目数
        'cur_tab': 3,           # 当前的tab页索引,3为“图集”
        'from': 'gallery'       # 来源,“图集”
    }

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

    url = 'https://www.toutiao.com/search_content/?' + urlencode(paras)
    try:
        # 获取网页内容,返回json格式数据
        response = requests.get(url, headers=headers)
        # 通过状态码判断是否获取成功
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):
    '''
    解析出组图网址,并将网页中所有图集的标题及图片地址返回
    '''
    urls = []
    data = json.loads(html)
    if data and 'data' in data.keys():
        for item in data.get('data'):
            page_urls = []
            title = item.get('title')
            image_detail = item.get('image_detail')
            for i in range(len(image_detail)):
                # 获取large图片地址
                url = image_detail[i]['url']
                # 替换URL获取高清原图
                url = url.replace('large', 'origin')
                page_urls.append(url)
            urls.append({'title': title,'url_list': page_urls})
    return urls

def save_image_file(url, path):
    '''
    保存图像文件
    '''
    ir = requests.get(url)
    if ir.status_code == 200:
        with open(path, 'wb') as f:
            f.write(ir.content)
            f.close()

def main(offset, word):
    html = get_one_page(offset, word)
    urls = parse_one_page(html)

    # 图像文件夹不存在则创建
    root_path = word
    if not os.path.exists(root_path):
        os.mkdir(root_path)

    for i in range(len(urls)):
        print('---正在下载 %s'%urls[i]['title'])
        folder = root_path + '/' + urls[i]['title'] 
        if not os.path.exists(folder):
            try:
                os.mkdir(folder)
            except NotADirectoryError:
                continue
            except OSError:
                continue

        url_list = urls[i]['url_list']
        for j in range(len(url_list)):
            path = folder + '/index_' + str("%02d"%j) + '.jpg' 
            if not os.path.exists(path):
                save_image_file(urls[i]['url_list'][j], path)

if __name__ == '__main__':
    # 抓取2000个图集,基本上包含全部图集
    for i in range(100):
        main(i*20, '街拍')

可以根据自己喜好替换关键词下载你喜欢的图集。

今天我们来爬取今日头条图集,老司机以街拍为例。

运行平台:Windows

Python版本:Python3.6

IDE:Sublime Text

其他工具:Chrome浏览器

[TOC]

1、网页分析

从打开今日头条首页,搜索“街拍”,下面有四个标签页“综合”、“视频”、“图集”和“用户”,我们依次点击几个标签,页面虽然变化了,但是地址栏的网址并没有变化,说明网页内容是 动态加载 的。

按“F12”调出 Developer Tools ,并刷新页面,接下来分析Developer Tools:

①:点击Network

②:选择XHR

③:找以“?offset=“开头的一项并点击,右侧出现详情

④:点击右侧“Header”标签页

⑤:看到请求方式和请求地址

⑥:此处为请求的参数

接下来点击 Preview 标签页查看返回的数据:

返回数据格式为json,展开“ data ”字段,并展开第一项,查找“title”,可以看到和网页第一个图集标题一致,说明找对地方了。

继续分析,“data”第一项里有一个“ image_detail ”字段,展开可以看到6项,并且每一项都有一个url,一看就是图片网址,不知是不是我们要找的,将该url复制到浏览器打开确实和第一张缩略图一样,那么这6个是不是该图集中所有的图像呢?

点击网页第一个图集,可以看到确实只有6张图片,而且与返回json数据中的图片一致。

到这里分析完了吗?我们看一下网页中除了图片,文字和相关推荐占了那么多内容,图片显得有点小,我们在图片上右击选择“ 在新标签页中打开图片 ”,注意看地址栏:

发现其中奥秘了吗?图片地址“ large ”变成了“ origin ”,将两个图片分别保存,比较一下大小,origin比large大很多,这才是我们需要的,至此,网页分析全部完成,接下来开始写代码。

2、代码

采用requests库进行抓取,由于前面分析已经很详细,代码就不分开讲解,请看注释内容

#-*- coding: utf-8 -*-
import os
import re
import json
import requests
from urllib.parse import urlencode

def get_one_page(offset, keyword):
    '''
    获取网页html内容并返回
    '''
    paras = {
        'offset': offset,       # 搜索结果项开始的位置
        'format': 'json',       # 返回的数据格式
        'keyword': keyword,     # 搜索的关键字
        'autoload': 'true',     # 自动加载
        'count': 20,            # 每次加载结果的项目数
        'cur_tab': 3,           # 当前的tab页索引,3为“图集”
        'from': 'gallery'       # 来源,“图集”
    }

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

    url = 'https://www.toutiao.com/search_content/?' + urlencode(paras)
    try:
        # 获取网页内容,返回json格式数据
        response = requests.get(url, headers=headers)
        # 通过状态码判断是否获取成功
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):
    '''
    解析出组图网址,并将网页中所有图集的标题及图片地址返回
    '''
    urls = []
    data = json.loads(html)
    if data and 'data' in data.keys():
        for item in data.get('data'):
            page_urls = []
            title = item.get('title')
            image_detail = item.get('image_detail')
            for i in range(len(image_detail)):
                # 获取large图片地址
                url = image_detail[i]['url']
                # 替换URL获取高清原图
                url = url.replace('large', 'origin')
                page_urls.append(url)
            urls.append({'title': title,'url_list': page_urls})
    return urls

def save_image_file(url, path):
    '''
    保存图像文件
    '''
    ir = requests.get(url)
    if ir.status_code == 200:
        with open(path, 'wb') as f:
            f.write(ir.content)
            f.close()

def main(offset, word):
    html = get_one_page(offset, word)
    urls = parse_one_page(html)

    # 图像文件夹不存在则创建
    root_path = word
    if not os.path.exists(root_path):
        os.mkdir(root_path)

    for i in range(len(urls)):
        print('---正在下载 %s'%urls[i]['title'])
        folder = root_path + '/' + urls[i]['title'] 
        if not os.path.exists(folder):
            try:
                os.mkdir(folder)
            except NotADirectoryError:
                continue
            except OSError:
                continue

        url_list = urls[i]['url_list']
        for j in range(len(url_list)):
            path = folder + '/index_' + str("%02d"%j) + '.jpg' 
            if not os.path.exists(path):
                save_image_file(urls[i]['url_list'][j], path)

if __name__ == '__main__':
    # 抓取2000个图集,基本上包含全部图集
    for i in range(100):
        main(i*20, '街拍')

可以根据自己喜好替换关键词下载你喜欢的图集。


分享给小伙伴们:
本文标签: 今日头条Python爬虫

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号