新手学习指南:用Scala采集外卖平台

news2024/11/18 1:25:21

学习爬虫不是一蹴而就的,在掌握相关的知识点的同时,还要多加练习,学习是一部分,更多的还是需要自己上手操作,这里配合自己学习的基础,以及使用一些爬虫的专有库,就可以轻松达到自己想要的数据。那么今天我将用Scala编程一个爬外面平台的代码,并且做了相关的注释,希望能帮助更多的人。

在这里插入图片描述

在Scala中编写一个爬虫程序需要使用一些库,比如Akka HTTP和Scalaj-REST。首先,你需要在你的项目中添加这些库的依赖。

libraryDependencies += "akka-http" %% "akka-http" % "10.2.0"
libraryDependencies += "com.typesafe.akka" %% "akka-stream" % "2.6.14"
libraryDependencies += "com.typesafe.akka" %% "akka-http-spray-json" % "10.2.0"
libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.5.2"
libraryDependencies +="提取免费代理IP" jshk.com.cn/mb/reg.asp?kefu=xjy&csdn

然后,你可以使用以下代码来编写你的爬虫程序:

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.stream.ActorMaterializer
import com.typesafe.scalaj.http._
import spray.json.DefaultJsonProtocol

case class LoginForm(username: String, password: String)

case class LoginResponse(access_token: String, refresh_token: String)

case class Order(order_id: String, restaurant_name: String, total_price: String, delivery_address: String)

object Main extends App {
  implicit val system = ActorSystem("my-system")
  implicit val materializer = ActorMaterializer()

  val loginForm = LoginForm("your_username", "your_password")
  val loginResponse = Http().post("duomaimai/api/login", """{"username":"$loginForm.username", "password":"$loginForm.password"}""".stripMargin).asString

  val json = parse(loginResponse body)

  val accessToken = (json \ "access_token").as[String]
  val refreshToken = (json \ "refresh_token").as[String]

  val orders = Http()
    .post("duomaimai/api/orders", """{"access_token":"$accessToken"}""".stripMargin)
    .asString

  val jsonOrders = parse(orders body)

  val orderIds = (jsonOrders \ "orders").as[Seq[Order]]

  orderIds.foreach(order => println(s"订单ID: $order.order_id, 餐厅名称: $order.restaurant_name, 总价: $order.total_price, 送餐地址: $order.delivery_address"))
}

在这个例子中,我们首先定义了登录表单和登录响应的数据结构。然后,我们使用Http()创建一个新的http客户端,post()方法发送一个POST请求到外卖平台的登录接口,然后使用asString()方法获取响应的字符串内容。

接下来,我们使用parse()方法将字符串内容解析为json对象,然后使用as[String]方法获取json对象中的access_token和refresh_token。

接着,我们使用post()方法发送一个POST请求到外卖平台的订单接口,然后使用asString()方法获取响应的字符串内容。然后,我们使用parse()方法将字符串内容解析为json对象,然后使用as[Seq[Order]]方法获取json对象中的订单列表。

最后,我们遍历订单列表,打印出每个订单的ID、餐厅名称、总价和送餐地址。请注意,这只是一个简单的示例,实际的爬虫程序可能需要处理更复杂的情况,比如处理POST请求的正文,处理各种错误和异常,以及处理更复杂的json数据结构。

上面就是我本次编程的全部内容,其实只需要库的搭配使用以及相关的语法问题,正常来说入门采集也是很方便,如果有任何技术上的问题,可以这里留言讨论。

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

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

相关文章

DaisyDisk for mac 中文激活版 可视化磁盘清理工具

DaisyDisk 是一款专为 Mac 设计的磁盘空间分析工具。它以直观、图形化的方式展示硬盘使用情况,帮助用户迅速找到占用空间大的文件和文件夹。通过扫描磁盘,DaisyDisk 生成彩色的扇形图表,每个扇区代表一个文件或文件夹,大小直观反映…

leetcode 67. 二进制求和

一、题目 二、解答 1.思路 1.1 思路1 转成2个二进制数字相加,之后再转回字符串 1.2 思路2 遍历字符串挨个相加: 补齐2个字符串到同样长度 while循环,如果指针>0不断循环如果a短,给字符串前插入(a长度-b长度&a…

Chrome禁用第三方Cookie,有什么影响?

2024年,Chrome将要正式禁用第三方Cookie了,这个变化对Web开发者来说是非常重要的,因为它将改变开发者如何设计网站以及如何搜集和使用用户数据。这是怎么一回事,到底有什么具体影响? 什么是Cookie? 随着互…

python flask学生管理系统

预览 前端 jquery css html bootstrap: 4.x 后端 python: 3.6.x flask: 2.0.x 数据库 mysql: 5.7 学生管理模块 登录、退出查看个人信息、修改个人信息成绩查询查看已选课程选课、取消选课搜索课程课程列表分页功能 教师模块 登录、退出查看个人信息、修改个人信息录入…

Gazebo的模型下载。

git clone zouxu634866/gazebo_modelshttps://gitee.com/zouxu6348660/gazebo_models.git,并完成路径配置。 (本文提供了gitee下载,国外的Github下载较慢。)

JDK8-JDK17版本升级

局部变量类型推断 switch表达式 文本块 Records 记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类,但代码少得多;大多数开发人员使用 Lombok 生成 POJO 类,但是有了记录,你就不需要使…

通过生成mcs、bin文件将程序固化到FPGA

通过将程序固化到FPGA,可以做到断电不丢失程序,上电之后就自动启动程序的作用,整个固化步骤主要分为3步,一是修改约束文件,二是生成mcs或bin文件,三是将程序固化到开发板flash 1.修改约束文件 生成固化文…

meter报OOM错误,如何解决?

根据在之前的压测过程碰到的问题,今天稍微总结总结,以后方便自己查找。 一、单台Mac进行压测时候,压测客户端Jmeter启动超过2000个线程,Jmeter报OOM错误,如何解决? 解答:单台Mac配置内存为8G&…

蓝桥杯准备

书籍获取:Z-Library – 世界上最大的电子图书馆。自由访问知识和文化。 (zlibrary-east.se) 书评:(豆瓣) (douban.com) 一、观千曲而后晓声 别人常说蓝桥杯拿奖很简单,但是拿奖是一回事,拿什么奖又是一回事。况且,如果…

liunx安装redis

安装redis 1.向Xftp7上传Redis压缩包 进行解压:tar -zxvf redis-6.0.8.tar.gz 解压后预编译: cd redis-6.0.8 make 创建文件: mkdir -p /opt/redis 安装到指定目录: make install PREFIX/opt/redis 进入安装文件 bin 目录:cd /opt/redis/bin ./redis-se…

【python入门】day27: 模拟高铁售票系统

界面 代码 #-*- coding:utf-8 -*- import prettytable as pt#---------导入漂亮表格 import os.path filename ticket.txt#更新座位状态 def update(row_num):#------更新购票状态with open(filename,w,encodingutf-8) as wfile:for i in range(row_num):lst1 [f{i1},有票,有…

Springboot + websocket 实现 一对一 单人聊天

Springboot websocket 实现 一对一 单人聊天 要使用websocket ,需要添加 jar 打开项目中的pom.xml,添加以下内容 创建java端代码 配置websocke的endpoints 配置websocket的server ServerEndpoint(value "/websocket/{username}") 这句话 一定要注意, 这里 路…

寻找峰值题目解析

一、题目描述 162. 寻找峰值 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ …

hcip-4

ISIS:中央系统到中央系统 基于OSI模型开发; 集成的ISIS,基于OSI开发后转移到TCP/IP模型执行; 故集成的ISIS既可以在OSI模型,也可在TCP/IP模型工作; ISIS是在ISP中使用的一个IGP协议,其归属于无类别链路状…

x-cmd pkg | duf - df 命令的现代化替代品

目录 简介用户首次快速实验指南技术特点竞品和相关作品进一步探索 简介 Duf (Disk Usage/Free Utility)是一个磁盘分析工具。其直观的输出和多样化的自定义选项,帮助用户更好地管理和优化存储资源。 用户首次快速实验指南 使用 x duf 即可自…

系统性学习vue-组件及脚手架

书接上文 Vue组件及脚手架 初始化脚手架说明步骤 分析脚手架结构render函数修改默认配置ref属性props配置mixin 混入/混合定义混合局部混合全局混合 插件scoped样式安装less-loader 浏览器的本地存储 webStoragelocalStroage 本地存储sessionStorage 会话存储 组件自定义事件绑…

Spring高手之路-Spring的AOP失效场景详解

目录 前言 1.非Spring管理的对象 2.同一个Bean内部方法调用 3.静态方法 4.final方法 5.异步方法 总结 前言 Spring的AOP(面向切面编程)是一种强大的技术,用于在应用程序中实现横切关注点的模块化。虽然Spring的AOP在大多数情况下都是…

如何画出优秀的系统架构图-架构师系列-学习总结

--- 后之视今,亦犹今之视昔! 目录 早期系统架构图 早期系统架构视图 41视图解读 41架构视图缺点 现代系统架构图的指导实践 业务架构 例子 使用场景 画图技巧 客户端架构、前端架构 例子 使用场景 画图技巧 系统架构 例子 定义 使用场…

利用金属-有机配位聚合物精准放大胞内氧化风暴增强抗癌免疫

伴随活性氧(ROS)爆发的氧化应激控制免疫细胞在肿瘤微环境中的浸润、活化和分化,因此可以引发强大的抗肿瘤免疫。近期,中国药科大学药学院凌祥老师团队在ACS Nano(IF17.1)上发表了题为“Precisely Amplifyin…

uniapp中uview组件库的AlertTips 警告提示使用方法

目录 #使用场景 #平台差异说明 #基本使用 #图标 #可关闭的警告提示 #API #Props #Events 警告提示,展现需要关注的信息。 #使用场景 当某个页面需要向用户显示警告的信息时。非浮层的静态展现形式,始终展现,不会自动消失&#xff0…