用Ajax爬取今日头条图片集

Ajax原理

? 在用requests抓取页面时,得到的结果可能和浏览器中看到的不一样:在浏览器中可以正常显示的页面数据,但用requests得到的结果并没有。这是因为requests获取的都是原始 HTML文档,而浏览器中页面

则是经过Ajax处理数据后生成的。这些数据可能在HTML文档中,也可能是经过JavaScript和特定算法后生成的。

? 刚开始HTML文档中不包含某些数据,当原始页面加载完后,会向服务器发送Ajax请求获取数据,这些数据被JavaScript处理形成一些新页面。

? Ajax: 即异步的JavaScript和XML,是利用JavaScript在保证页面不刷新、链接不改变的情况下与服务器交换数据的并更新

部分网页的技术。

示例:用Ajax爬取今日头条图片

最近想买工装裤穿,可又不知道怎么搭配,所以就用爬虫爬下头条上工装裤的穿搭图片啦

(1) 获取网页页面的JSON文档
import os
import requests
from urllib.parse import urlencode           #来构造url参数的
from hashlib import md5                      #用来解析图片二进制的

#获取页面json
def get_page(offest):
    params={
            ‘aid‘:‘24‘,
            ‘offest‘:offest,
            ‘format‘:‘json‘,
            ‘keyword‘:‘%E5%B7%A5%E8%A3%85%E8%A3%A4‘,
            ‘autoload‘:‘true‘,
            ‘count‘:‘20‘,
            ‘cur_tab‘:‘1‘,
            ‘from‘:‘search_tab‘,
            ‘pd‘:‘synthesis‘
            }
    url=‘https://www.toutiao.com/api/search/content/?aid=24&offset=0&format=json&keyword=%E5%B7%A5%E8%A3%85%E8%A3%A4&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis‘+urlencode(params)
        #用urlencode构造url中参数
    try:
        response=requests.get(url)
        if response.status_code==200:                #当请求成功时(status_code=200时)才继续下面代码
            return response.json()                   #用json方法将结果转化成JSON格式
    except requests.ConnectionError:
        return None

注意:

1)构造Ajax请求时,先探索清楚当前页面中Ajax请求链接的结构和规律。这里是Offest改变,其他参数不变。

2)使用urlencode方法构造请求的GET参数

3)发现只有offest发生改变,第一页0,第二页20,第三页40,依次增加20

(2)构造包含图片链接和标题的字典
#提取图片url和标题
def parse_page(json):
    if json.get(‘data‘):
        for item in json.get(‘data‘):      #找到所需数据所处位置
            if item.get(‘title‘)==None:    #运行后发现不是每个item里都有图片链接和title,没有的直接跳过
                continue
            title=item.get(‘title‘)        #找到标题
            print(title)
            images=item.get(‘image_list‘)
            print(images)
            for image in images:
                yield{
                    ‘image‘:image.get(‘url‘), #找到这个标题下的所以图片url 形成字典生成器
                    ‘title‘:title
                }

注意:

1)yield{}方法构造字典生成器非常简单,快速。

2)用json.get()方法在json文档中找取参数值非常快。

(3)把数据保存到本地
#实现保存图片的方法
def save_image(item):
    if not os.path.exists(item.get(‘title‘)):      #创建以标题为名称的文件夹
        os.mkdir(item.get(‘title‘))
    try:
        response=requests.get(item.get(‘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):     #名称file_path使用其内容的md5值,可以去除重复
                with open(file_path,‘wb‘) as f:  #访问成功后,将其二进制代码存入file_path.jpg中
                    f.write(response.content)
            else:
                print(‘Already Download‘,file_path)
    except requests.ConnectionError:
        print(‘Failed to save image‘)

注意:

1)这里的item就是(2)中得到的包含url和标题的字典

1)是以二进制写的方式存入文件,‘wb‘

(4)构造offest 进行遍历
def main(offest):
    json=get_page(offest)
    for item in parse_page(json):
        print(item)
        save_image(item)

if __name__==‘__main__‘:
    for i in range(0,4):
        offest=i*20
        main(offest)
PS:代码叙述有不完整的地方,欢迎大家私信我。完整代码链接https://github.com/xubin97

原文地址:https://www.cnblogs.com/xubin97/p/10358699.html

时间: 2024-10-10 21:49:28

用Ajax爬取今日头条图片集的相关文章

用Ajax爬取今日头条图片

Ajax原理 ? 在用requests抓取页面时,得到的结果可能和浏览器中看到的不一样:在浏览器中可以正常显示的页面数据,但用requests得到的结果并没有.这是因为requests获取的都是原始 HTML文档,而浏览器中页面 则是经过Ajax处理数据后生成的.这些数据可能在HTML文档中,也可能是经过JavaScript和特定算法后生成的. ? 刚开始HTML文档中不包含某些数据,当原始页面加载完后,会向服务器发送Ajax请求获取数据,这些数据被JavaScript处理形成一些新页面. ?

芝麻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爬取今日头条街拍美图

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爬取今日头条街拍图片——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

分析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'

Python3爬取今日头条有关《人民的名义》文章

Python3爬取今日头条有关<人民的名义>文章 最近一直在看Python的基础语法知识,五一假期手痒痒想练练,正好<人民的名义>刚结束,于是决定扒一下头条上面的人名的名义文章,试试技术同时可以集中看一下大家的脑洞也是极好的. 首先,我们先打开头条的网页版,在右上角搜索框输入关键词,通过chrome调试工具,我们定位到头条的search栏调用的的API为: http://www.toutiao.com/search_content/?offset=0&format=json

使用python-aiohttp爬取今日头条

http://blog.csdn.net/u011475134/article/details/70198533 原出处 在上一篇文章<使用python-aiohttp爬取网易云音乐>中,我们给自己的微信公众号添加了在线点歌的功能,这次我们再增加一个新闻浏览的功能.由于我平时浏览新闻用的是今日头条,所以在这里就想通过爬取今日头条来获取新闻.不过遗憾的是,这一次我在网上没有找到满意的方法,所以还是自己动手吧. 打开抓包软件Fiddler并设置Filters.  打开今日头条网页,选择热点. ur

使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)

爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 得到了今日头条的推荐新闻的接口地址:https://www.toutiao.com/api/pc/focus/ 单独访问这个地址得到 此接口得到的数据格式为json数据 我们用scrapy+selenium+PhantomJS的方式获取今日头条推荐的内容 下面是是scrapy中最核心的代码,位于s