爬虫入门到精通_实战篇8(分析Ajax请求并抓取今日头条美食美图)_界面上抓取Ajax方式

news2024/11/15 11:03:35

1 目标

目标:
抓取今日头条美食美图,如下:
在这里插入图片描述
一些网页直接请求得到的HTML代码并没有在网页中看到的内容,因为一些信息是通过Ajax加载,并通过js渲染生成的,这时就需要通过分析网页的请求来获取想要爬取的内容。

直接请求得到的HTML代码并没有在网页中看到的内容:
在这里插入图片描述
右击空白处->审查->Network->勾选Preserve log->刷新网页:
点击XHR,再选中一个URL,查看请求的方法,发现是用get方法,所以使用requests库。
在这里插入图片描述
向下更新的过程中,作出url不断更新:
在这里插入图片描述
分析查找图集详细页的代码,来找到图片的url,这个图片url隐藏的比较深,都在JS代码中:
在这里插入图片描述
变量并不是在html代码里的,所以不能使用BeautifulSoup和PyQuery来解析了,只能通过正则表达式来解析。

2 流程框架

  1. 抓取索引页内容:利用requests请求目标战点,得到索引页面HTML代码,返回结果。
  2. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息。
  3. 下载图片与保存数据库:将图片下载到本地,并把页面信息及图片URL保存至MongoDB。
  4. 开启循环及多线程:对多页内容遍历,开启多线程提取抓取速度。

3 实战

1 抓取索引页内容

看一下索引页的请求方式:
在这里插入图片描述
街拍界面更新了方式,了解了Ajax就行,后面写法同上一章相似,暂时不仔细研究。
旧版形式的详情。

4 整体代码

import  requests
from urllib.parse import urlencode
from requests.exceptions import RequestException
import json
from bs4 import BeautifulSoup
import re
from config import *
import  pymongo
import os
from hashlib import md5
from multiprocessing import Pool
from json.decoder import JSONDecodeError
from pathlib import Path

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
#声明mongodb数据库对象
client = pymongo.MongoClient(MONGO_URL,connect=False)
db = client[MONGO_DB]

#请求索引页(索引页中包含着许多图集的url)
def get_page_index(offset,keyword):
    data = {#定义一个data字典,用于Ajax请求
        'offset': offset,
        'format': 'json',
        'keyword': keyword,
        'autoload': 'true',
        'count': '20',
        'cur_tab': '3',
        'from': 'gallery'
    }
    url='http://www.toutiao.com/search_content/?'+urlencode(data)
    try:
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        print('请求索引页出错')
        return None


#传入索引页的html,解析出每个图集的url
def parse_page_index(html):
    try:#加入异常处理
        data = json.loads(html)#对html进行解析,转换为字典。
        if data and 'data' in data.keys():#data.keys()返回的是这个json的所有的键名,这里判断'data'在这些键名中
            for item in data.get('data'):#data对应还有许多值,遍历这些值
                yield item.get('article_url')#构造一个生成器,取出data中的每一个article_url对应的url
    except JSONDecodeError:
        pass

#请求每个图集的详情页
def get_page_detail(url):
    try:
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        print('请求详情页出错',url)
        return None

#解析详情页,获取图集中每张图片的url
def parse_page_detail(html,url):
    soup = BeautifulSoup(html, 'lxml')
    # 用BeautifulSoup来提取title信息
    title = soup.select('title')[0].get_text()
    print(title)
    #下面提取json串,串中包含了图片信息
    images_pattern = re.compile('JSON.parse\("(.*?)"\),', re.S)#注意对括号进行转义
    result=re.search(images_pattern,html)
    if result:
        result = result.group(1).replace('\\', '')
        data = json.loads(result)#转换成json对象
        if data and 'sub_images' in data.keys():
            sub_images = data.get('sub_images')
            #每个sub_images都是一个字典,需要遍历它来提取url元素
            # 用一句话来构造一个list,把item赋值为sub_images的每一个子元素
            # 再取得sub_images的每一个item对象的url属性,完成列表的构建,这个列表名为images,里面是sub_images下所有的url
            images = [item.get('url') for item in sub_images]
            root_dir=create_dir('E:\spider\jiepai')
            download_dir = create_dir(root_dir/title)
            for image in images: download_image(download_dir,image)#通过循环把图片下载下来
            return {#以一个字典形式返回
                'title':title,
                'url':url,#这是当前详情页的url
                'images':images
            }

#把url存储到数据库
def save_to_mongo(result):
    if db[MONGO_TABLE].insert(result):
        print('存储到MongoDB成功',result)
        return  True
    return False

#通过url来请求图片
def download_image(save_dir,url):
    print('正在下载',url)
    try:
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            save_image(save_dir,response.content)#content返回的是二进制内容,一般处理图片都用二进制流
            return response.text
        return None
    except RequestException:
        print('请求图片出错',url)
        return None

def create_dir(name):
    #根据传入的目录名创建一个目录,这里用到了 python3.4 引入的 pathlib 。
    directory = Path(name)
    if not directory.exists():
         directory.mkdir()
    return directory

def save_image(save_dir,content):
    file_path = '{0}/{1}.{2}'.format(save_dir,md5(content).hexdigest(),'jpg')
    if not os.path.exists(file_path):#如果文件不存在
        with open(file_path,'wb') as f :
            f.write(content)
            f.close()

def main(offset):
    html=get_page_index(offset, KEYWORD)
    for url in parse_page_index(html):#获得每个图集的url
         html=get_page_detail(url)#用某个图集的url来请求详情页
         if html:
            result=parse_page_detail(html,url)#解析详情页的信息
            if result:save_to_mongo(result)





if __name__ == '__main__':

    groups = [x*20 for x in range(GROUP_START,GROUP_END+1)]#20,40,60...
    pool=Pool()
    pool.map(main,groups)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于高德地图及其APP获取地图数据的研究

刚过完春节没几天,有个客户提出要获取高德地图的数据。 我看了下,回复说:这不是很简单嘛,高德有公开的开放平台,有足够的API支持用户获取数据,开发自己基于高德数据库的应用。 客户回复说:他的要…

【前端素材】推荐优质现代医院办公后台管理系统网页XRay平台模板(附源码)

一、需求分析 在线后台管理系统是指供管理员或运营人员使用的Web应用程序,用于管理和监控网站、应用程序或系统的运行和数据。它通常包括一系列工具和功能,用于管理用户、内容、权限、数据等。下面是关于在线后台管理系统的详细分析: 1、功…

【JavaSE】实用类——String、日期等

目录 String类常用方法String类的equals()方法String中equals()源码展示 “”和equals()有什么区别呢? StringBuffer类常用构造方法常用方法代码示例 面试题:String类、StringBuffer类和StringBuilder类的区别?日期类Date类Calendar类代码示例…

边缘计算与任务卸载基础知识

目录 边缘计算简介任务卸载简介参考文献 边缘计算简介 边缘计算是指利用靠近数据生成的网络边缘侧的设备(如移动设备、基站、边缘服务器、边缘云等)的计算能力和存储能力,使得数据和任务能够就近得到处理和执行。 一个典型的边缘计算系统为…

用GGUF和Llama.cpp量化Llama模型

用GGUF和Llama .cpp量化Llama模型 什么是GGML如何用GGML量化llm使用GGML进行量化NF4 vs. GGML vs. GPTQ结论 由于大型语言模型(LLMS)的庞大规模,量化已成为有效运行它们的必要技术。通过降低其权重的精度,您可以节省内存并加快推理…

uniapp npx update-browserslist-db@lates 问题解决

在uniapp运行项目时,会有这种报错,其实这是表明browserslistlatest版本低了,在催你升级版本,browserslistlatest是用来支持解析css用的,当然,你也可以直接忽略这个报错提示,也可以正常运行项目。…

【Git教程】(四)版本库 —— 存储系统,存储目录,提交对象及其命名、移动与复制~

Git教程 版本库 1️⃣ 一种简单而高效的存储系统2️⃣ 存储目录:Blob 与 Tree3️⃣ 相同数据只存储一次4️⃣ 压缩相似内容5️⃣ 不同文件的散列值相同6️⃣ 提交对象7️⃣ 提交历史中的对象重用8️⃣ 重命名、移动与复制🌾 总结 事实上,我们…

带你玩转java封装和继承(上)

上次带大家学习了java里面比较重要的知识点类和对象,而且我们知道java是一门面向对象的语言,有时一个程序里可能有很多类,那么这么多类他们之间有什么联系吗?今天就带大家学习一下java类之间的关系。 什么是继承: 我们…

摄像机LookDirection参数对模型缩放灵敏度的影响

继续整上回的wpf 3d obj模型程序; 它用HelixToolKit加载了以后,默认可以用鼠标操作模型,中键缩放模型; 有的时候中键稍微滚动几下模型就不见了; 用不同的模型试了一下;中键缩放的灵敏度,就是…

FreeRTOS学习笔记-基于STM32(1)基础知识

一、裸机与RTOS 我们使用的32板子是裸机,又称前后台系统。裸机有如下缺点: 1、实时性差。只能一步一步执行任务,比如在一个while循环中,要想执行上一个任务,就必须把下面的任务执行完,循环一遍后才能执行…

BUGKU bp

打开环境,他提示了弱密码top1000,随便输入密码123抓包爆破 发现长度都一样,看一下响应发现一段js代码,若r值为{code: bugku10000},则会返回错误,通过这一句“window.location.href success.php?coder.cod…

StarRocks——Stream Load 事务接口实现原理

目录 前言 一、StarRocks 数据导入 二、StarRocks 事务写入原理 三、InLong 实时写入StarRocks原理 3.1 InLong概述 3.2 基本原理 3.3 详细流程 3.3.1 任务写入数据 3.3.2 任务保存检查点 3.3.3 任务如何确认保存点成功 3.3.4 任务如何初始化 3.4 Exactly Once 保证…

【MATLAB】 ICEEMDAN信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码,请转文末观看代码获取方式~ 展示出图效果 1 ICEEMDAN信号分解算法 ICEEMDAN 分解又叫改进的自适应噪声完备集合经验模态分解,英文全称为 Improved Complete Ensemble Empirical Mode Decomposition with Adaptive Noise。 ICEEMDAN (I…

【书生·浦语大模型实战营】第 2 节 -课后作业

第二节 -轻松玩转书生浦语大模型趣味 Demo-课后作业 0.课程体验0.1 鸡兔同笼0.2 逻辑推理0.3 AI会毁灭人类吗? 1.课后作业1.1 基础作业1.1.1 作业11.1.2 作业2 0.课程体验 课程链接:https://github.com/internLM/tutorial 首先,这个课程是免费…

《Spring Security 简易速速上手小册》第7章 REST API 与微服务安全(2024 最新版)

文章目录 7.1 保护 REST API7.1.1 基础知识详解7.1.2 重点案例:使用 JWT 进行身份验证和授权案例 Demo 7.1.3 拓展案例 1:API 密钥认证案例 Demo测试API密钥认证 7.1.4 拓展案例 2:使用 OAuth2 保护 API案例 Demo测试 OAuth2 保护的 API 7.2 …

vue 之 Quill编辑器封装

安装 npm install vue-quill-editor --save <template><div><el-upload:action"uploadUrl":before-upload"handleBeforeUpload":on-success"handleUploadSuccess":on-error"handleUploadError"name"file":sh…

家政行业的数字转型:开发智能化家政预约APP的挑战与机遇

为了适应这一变化&#xff0c;许多家政企业开始积极探索数字化转型&#xff0c;其中包括开发智能化预约APP。本文将探讨开发智能化预约APP所面临的挑战与机遇。 ​一、挑战&#xff1a; 1.用户体验设计&#xff1a; -开发智能化预约APP需要注重用户体验设计&#xff0c;包括…

Pytest插件pytest-selenium-让自动化测试更简洁

在现代Web应用的开发中&#xff0c;自动化测试成为确保网站质量的重要手段之一。而Pytest插件 pytest-selenium 则为开发者提供了简单而强大的工具&#xff0c;以便于使用Python进行Web应用的自动化测试。本文将深入介绍 pytest-selenium 插件的基本用法和实际案例&#xff0c;…

Web Tomcat

目录 1 前言2 Tomcat的安装3 Tomcat文件的构成4 Tomcat的使用步骤 1 前言 Tomcat是一个 http(web)的容器&#xff0c;笼统的理解一下所有的网站都叫做web。这个web容器可以把我们的前端(htmlcssjs)和后端(servlet)代码都运行起来。 Tomcat是一个免费的开源的Servlet容器&#…

可视化场景(1):销售业绩大屏-是骡子是马,牵出溜溜

销售业绩可视化大屏的是一种有力的销售数据管理工具&#xff0c;贝格前端工场分享一批给友友们&#xff0c;如需要定制&#xff0c;可以与我们联络&#xff0c;开始了。 销售业绩可视化大屏是一种将销售数据以图表、数字、文字等形式展示在大屏幕上的数据可视化工具。它的作用主…