ajax分析-今日头条街拍美图抓取

  

  我们知道,有时候直接利用requests请求得到的原始数据是无效的,因为很多时候,这样获取的一个网页的源代码很可能就几行,明显不是我们想要的东西,这个时候,我们就可以分析,这样的网页中是不是加入了ajax请求,即原始页面加载完成后,会再向服务器请求某个接口去获取数据,然后才被呈现到网上的。

  ajax并不是一门语言,而是一门技术,它可以在页面不被刷新的情况下,利用javascript进行数据交换,渲染网页进而呈现,我们平时用手机刷微博,往下拉就会出现加载的小圆圈,那个就是加入了ajax请求。

  所以,我们要想爬取这类网页,就必须要知道ajax的工作原理,爬取之前,安装好必要的库。

import requests
from urllib.parse import urlencode
from requests import codes
import os
from hashlib import md5
from multiprocessing.pool import Pool

#我们进入今日头条的网页后,打开开发者工具,找到ajax请求后,发现它的url里面有以下几个参数,滑动鼠标下拉网页,
#我们发现,除了offset这个参数会改变以外,其他的参数都不会改变,而offset正是每页显示的数据条数,即偏移量
#由此,我们传入offset参数。
def get_page(offset):
    params = {
        ‘offset‘: offset,
        ‘format‘: ‘json‘,
        ‘keyword‘: ‘街拍‘,
        ‘autoload‘: ‘true‘,
        ‘count‘: ‘20‘,
        ‘cur_tab‘: ‘1‘,
        ‘from‘: ‘search_tab‘
    }
    base_url = ‘https://www.toutiao.com/search_content/?‘
    #这里我们将构造出来的新的url作为请求对象
    url = base_url + urlencode(params)
    try:
        resp = requests.get(url)
        if codes.ok == resp.status_code:
            return resp.json()
    except requests.ConnectionError:
        return None

#这里我们再定义一个方法,加入了一个生成器,用于提取每条数据的图片链接和标题,一并返回。
def get_images(json):
    if json.get(‘data‘):
        data = json.get(‘data‘)
        for item in data:
            title = item.get(‘title‘)
            images = item.get(‘image_list‘)
            for image in images:
                yield {
                    ‘image‘: ‘https:‘ + image.get(‘url‘),
                    ‘title‘: title
                }

#这里我们定义一个保存数据的方法,引入os模块,以图片的标题来创建文件夹,并请求图片链接获得二进制数据,以二进制数据的形式写入,此处的md5可以做到加密及去重的作用。
def save_image(item):
    if not os.path.exists(item.get(‘title‘)):
        os.makedirs(item.get(‘title‘))
    try:
        resp = requests.get(item.get(‘image‘))
        if codes.ok == resp.status_code:
            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)
                print(‘Downloaded image path is %s‘ % file_path)
            else:
                print(‘Already Downloaded‘, file_path)
    except requests.ConnectionError:
        print(‘Failed to Save Image,item %s‘ % item)

#这里定义的一个主方法,构造offset变量数组,下面的方法就可以被调用了。
def main(offset):
    json = get_page(offset)
    for item in get_images(json):
        print(item)
        save_image(item)

GROUP_START = 0
GROUP_END = 20

#此处用到了进程池,调用了map方法,pool.close()表示不加入新的任务,pool.join()表示等待所有子进程结束后再向下执行,也就是整个爬虫的结束。
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()

原文地址:https://www.cnblogs.com/houziaipangqi/p/9649131.html

时间: 2024-11-06 03:54:28

ajax分析-今日头条街拍美图抓取的相关文章

芝麻HTTP:分析Ajax爬取今日头条街拍美图

本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节开始之前,请确保已经安装好requests库. 2.实战演练 首先,实现方法get_page()来加载单个Ajax请求的结果.其中唯一变化的参数就是offset,所以我们将它当作参数传递,实现如下: import requests from urllib.parse import urlencode def

【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 准备工作在本节开始之前,请确保已经安装好requests库.如果没有安装,可以参考第1章.另外如果你对python的库不是很熟的话,建议先去小编的Python交流.裙 :一久武其而而流

分析Ajax请求并抓取今日头条街拍美图

通常我们从网页上爬取内容时,都是HTML代码,内容都已经写好了,直接从页面获取想要的信息即可,但是有的网页是通过ajax获取的数据,将ajax获取的数据通过json格式接受,然后展示在页面上的,也就是说,当我们打开一个页面时,首先请求的是他的html,然后HTML里面通过ajax获取后端数据,将数据以json格式展示在页面上.而近日头条就是这样.下面我们来看看. 我们打开链接:https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D,我

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

1 import os 2 import requests 3 from urllib.parse import urlencode 4 from hashlib import md5 5 from multiprocessing.pool import Pool 6 7 GROUP_START = 1 8 GROUP_END = 5 9 10 def get_page(offset): 11 params = { 12 'offset': offset, 13 'format': 'json'

Ajax爬取今日头条街拍美图

1.打开今日头条:https://www.toutiao.com 2.搜索街拍 3.检查元素,查看请求发现在URL中每次只有offset发生改变,是一个get请求 1 import requests 2 from urllib.parse import urlencode 3 import os 4 from hashlib import md5 5 from multiprocessing.pool import Pool 6 7 def get_page(offset): 8 params

多线程高容错爬头条街拍美图

分析头条的ajax,通过正则表达式,python3多线程高容错爬取头条的街拍美图,保存到mongodb,并下载图片 头条的内容网页较之前已经改版,图床页不仅有ajax的还有html的内容网页 所以使用了两种正则,根据条件调用 #!/usr/bin/env python # -*- coding:utf-8 -*- """ @author:Aiker @file:toutiao.py @time:下午9:35 """ import json imp

php+phantomjs实现今日头条的首页推送抓取

第一次搞爬虫,经验不足,爬出来的效果也不是很好,记录一下吧. 认识的哥们最近在爬今日头条的数据,不过他是做java的.之前也想用php做点爬数据的东西,于是直接也搞今日头条,万一有不明白的地方还能有个人商量.话不多说,上点干货. 关于爬虫,我之前的认知是,curl+正则,有点模糊,下面一步一步说吧  一.观察页面 今日头条的首页推送数据,是通过ajax获取的,打开页面调试我们可以看到下图 请求是每次滚动条滚动到底部触发的,然后我们右键新页面打开这个链接 不难发现这是个接口,返回json数据,在线

ajax爬取今日头条街拍图片——data出现none的解决

之前爬取总是出现如图的结果:手动打开url显示的是想要的结果,但是爬取的时候data为空 尝试了多种方法,偶然得到了想要的结果: 这是多次实验中成功与不成功结果中构造的url 发现 1)得到想要结果,所构造的url中keyword=******与下一参数间没有&链接 2)同样的keyword=%E8%A1%97%E6%8B%8D,参用不同的方式:‘https://www.toutiao.com/api/search/content/?keyword=%E8%A1%97%E6%8B%8D’+url

今日头条街拍图片爬取

import re import requests import os from urllib import request import json from mysql_tu import mysql_conn headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } for