美文网首页
分析Ajax爬取今日头条街拍美图

分析Ajax爬取今日头条街拍美图

作者: 何苦_python_java | 来源:发表于2018-04-26 16:43 被阅读0次

    我以今日头条为例来尝试通过分析 Ajax 请求来抓取网页数据的方法,我们这次要抓取的目标是今日头条的街拍美图,抓取完成之后将每组图片分文件夹下载到本地保存下来。

    1. 准备工作

    在本节开始之前请确保已经安装好了 Requests 库,如没有安装可以参考第一章的安装说明。

    2. 抓取分析

    在抓取之前我们首先要分析一下抓取的逻辑,首先打开今日头条的首页:http://www.toutiao.com/,如图 所示:

    #

    首页内容
    在右上角有一个搜索入口,在这里我们尝试抓取街拍美图,所以输入“街拍”二字搜索一下,结果图所示:


    image.png

    搜索结果

    这样我们就跳转到了搜索结果页面。

    这时打开开发者工具,查看一下所有网络请求,我们首先打开第一个网络请求,这个请求的 URL 就是当前的链接:http://www.toutiao.com/search/?keyword=街拍,打开 Preview 选项卡查看 Response Body,如果页面中的内容是直接请求直接加载出来的,那么这第一个请求的源代码中必然包含了页面结果中的文字,为了验证,我们可以尝试尝试搜索一下搜索结果的标题,比如“路人”二字,如图 所示:

    image.png
    import os
    import requests
    from urllib.parse import urlencode
    from hashlib import md5
    from multiprocessing.pool import Pool
    import redis
    import json
    
    GROUP_START = 1
    GROUP_END = 5
    
    rediscli = redis.StrictRedis(host='192.168.199.108', port=6379, db=0)
    
    
    def get_page(offset):
        params = {
            'offset': offset,
            'format': 'json',
            'keyword': '街拍',
            'autoload': 'true',
            'count': '20',
            'cur_tab': '3',
            'from': 'gallery',
        }
        url = 'https://www.toutiao.com/search_content/?' + urlencode(params)
        try:
            response = requests.get(url)
            if response.status_code == 200:
                return response.json()
        except requests.ConnectionError:
            return None
    
    
    def get_images(json):
        data = json.get('data')
        if data:
            for item in data:
                # print(item)
                image_list = item.get('image_list')
                title = item.get('title')
                # print(image_list)
                for image in image_list:
                    yield {
                        'image': image.get('url'),
                        'title': title
                    }
    
    
    def save_image(item):
        if not os.path.exists(item.get('title')):
            os.mkdir(item.get('title'))
        try:
            local_image_url = item.get('image')
            new_image_url = local_image_url.replace('list','large')
            response = requests.get('http:' + new_image_url)
            if response.status_code == 200:
                file_path = '{0}/{1}.{2}'.format(item.get('title'), md5(response.content).hexdigest(), 'jpg')
                if not os.path.exists(file_path):
                    with open(file_path, 'wb')as f:
                        f.write(response.content)
                else:
                    print('Already Downloaded', file_path)
        except requests.ConnectionError:
            print('Failed to save image')
    
    
    def main(offset):
        json = get_page(offset)
        for item in get_images(json):
            print(item)
            save_image(item)
    
    
    if __name__ == '__main__':
        pool = Pool()
        groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)])
        pool.map(main, groups)
        pool.close()
        pool.join()
    

    结语

    以上便是抓取今日头条街拍美图的过程,通过本节我们可以了解 Ajax 分析的流程、Ajax 分页的模拟以及图片的下载过程。
    需要熟练掌握,在后面的实战中我们还会用到很多次这样的分析和抓取。

    相关文章

      网友评论

          本文标题:分析Ajax爬取今日头条街拍美图

          本文链接:https://www.haomeiwen.com/subject/fklmlftx.html