首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

【deepin 产品面对面】玲珑入门教程:从源代码开始构建玲珑格式应用

内容来源:deepin(深度)社区 请首先阅读玲珑官方文档ll-builder简介 | 玲珑,本文以构建desktop-entry-editor 为例,该项目依赖较为简单,仅需玲珑官方文档中默认提供的基础运行环境即可成功构建运行。 第一步:前期准备 在终端中执行 sudo apt install linglong-builder --no-install-recommends 安装ll-builder工具 由于推荐安装依赖较多,此处跳过推荐依赖不进行安装。如有需要,去除命令中--no-install-recommends参数即可 第二步:创建项目 由于需要从源代码构建玲珑格式应用,故可以跳过ll-builder create操作,无需创建玲珑对应文件夹,直接在工程源代码顶层目录编写linglong.yaml文件即可(可使用官网提供的完整的模板文件)。 第三步:编辑 Linglong.yaml version: "1" # linglong.yaml 文件语法的版本 package: # 软件包元信息配置 id: com.github.desktop-entry-editor # 软件包 appid,类似 deb 格式软件包包名,区分不同玲珑格式软件包 name: desktop-entry-editor # 应用名称 version: 1.4.6.1 # 软件包版本 kind: app # 软件包类型,多数应用为 app,基础环境和运行时为 runtime description: | # 软件包描述 desktop entry editor for deepin os. command: # 容器内可执行程序启动命令 - /opt/apps/com.github.desktop-entry-editor/files/bin/desktop-entey-editor base: org.deepin.foundation/23.0.0 # 基础环境 runtime: org.deepin.Runtime/23.0.1 # 运行时 source: # 构建来源 kind: local # 由于直接在工程源代码中构建,此处选择 local 即可,无需从 git 仓库拉取代码 build: | # 构建 rm -rf build-linglong mkdir -p build-linglong qmake BUILD_VERSION=1.4.6 \ PREFIX=${PREFIX} \ LIB_INSTALL_DIR=${PREFIX}/lib/${TRIPLET} \ INSTALL_ROOT=${PREFIX} \ -spec linux-g++ CONFIG+=qtquickcompiler \ -o build-linglong \ desktop-entry-editor.pro make -C build-linglong -j$(nproc) make -C build-linglong -j$(nproc) install 以此linglong.yaml为例,软件包元信息按需填写即可。 由于项目较为简单,仅需要基础的 Qt 和 Dtk 环境即可构建,使用模板文件中所示的base和runtime即可。更复杂的构建环境可参考构建计算器,在构建应用前拉取所需依赖代码,优先构建所需依赖。 理解安装位置“前缀” 以我们所熟知的方式来理解,一般可执行文件需要放到/usr/bin文件夹下,在终端尝试执行时才能被找到;.desktop文件提供了启动的入口,想在启动器中看到应用图标,一般放到/usr/share/applications文件夹下;而图片文件会放到/usr/share/icons文件夹中具体的图标主题及尺寸和分类文件夹下。这其中,/usr就是所有文件安装位置的前缀。 根据GNU 编码标准,前缀的默认值一般为/usr/local;而构建 deb 格式软件包时,一般会使用/usr前缀。 而玲珑容器启动时,会将容器内容files 文件夹挂载至/opt/apps/${appid}文件夹下,故可以近似认为前缀为/opt/apps/${appid}/files。以此类推,可执行文件的实际位置为/opt/apps/${appid}/files/bin/可执行文件名称,所以linglong.yaml中command启动指令部分也需要如此填写,而不是常见的/usr/bin/可执行文件名称。 检查修改工程源代码 理解了前缀的概念,就要检查工程源代码的安装位置前缀了。qmake工程中,默认安装位置前缀一般为/opt/$${TARGET}文件夹,如可执行文件就被放在/opt/$${TARGET}/bin文件夹中。此处可能需要修改.pro文件,将前缀修改为/opt/apps/${appid}/files文件夹,保证玲珑容器启动后文件位置正确。 或者如构建计算器所示,通过qmake参数从外部传入安装位置前缀,并在.pro文件中解析${PREFIX}以实现控制文件安装位置。 第四步:构建应用 在工程源代码顶层目录(linglong.yaml同级目录)打开终端,执行ll-builder build命令即可。 首次构建时需下载指定的base和runtime,耗时较长,需要耐心等待。 第五步:测试运行应用 在工程源代码顶层目录(linglong.yaml同级目录)打开终端,执行ll-builder run --exec 可执行程序名称,可测试在玲珑容器环境内启动应用。 若找不到可执行程序,请检查工程源代码中文件安装位置是否正确。可查看工程顶层目录下linglong/output/runtime/files/bin文件夹中是否生成可执行文件。 若启动应用失败,参考文档在容器内进行调试。 第六步:导出 layer 文件 在工程源代码顶层目录(linglong.yaml同级目录)打开终端,执行ll-builder export命令,即可在目录中生成${appid}_${version}_${arch}_develop.layer和${appid}_${version}_${arch}runtime.layer文件。 第七步:测试安装 layer 文件 在工程源代码顶层目录(linglong.yaml同级目录)打开终端,输入ll-cli install并输入空格分隔后,将文件夹中的runtime.layer文件拖入终端,按回车执行,将layer文件安装至本地玲珑环境中。 安装成功后,应该可以在启动器中看到该应用,并进行启动和使用测试。 若启动器中无法找到该应用,请检查工程源代码中文件安装位置是否正确。可查看工程顶层目录下linglong/output/runtime/entries/share/applications文件夹中是否生成.desktop文件。 若存在启动失败情况,可查看对应.desktop文件并复制 Exec 字段内容至终端中执行,观察启动输出日志。若提示缺少玲珑对应版本的base或runtime环境,需手动执行ll-cli install 环境名称/版本号进行安装以排除故障(e.g.ll-cli install org.deepin.Runtime/23.0.1)。 至此,从源代码构建玲珑格式应用已完成。 本文举例的项目使用 qmake构建,依赖简单,且支持构建时外部传入${PREFIX}设置文件安装位置,构建为玲珑格式应用非常简单。若项目使用cmake或其他工具构建,同理需在工程内修改安装前缀,或在linglong.yaml构建部分传入参数进行设置,否则即使构建成功,也会出现容器内无法找到可执行文件,或安装后启动器没有图标等各种问题。 关于【产品面对面】 【产品面对面】 deepin 社区 2024 年 5 月新推出的专题栏目,在本栏目中,我们将会邀请不同产品的产品经理来跟大家分享交流好玩好用的 deepin 或 Linux 相关应用,产品经理们也会在 deepin 论坛与所有用户进行交流答疑。今天分享的文章来自 deepin 社区应用产品经理,同时也是 deepin 社区的论坛用户【yicold】,希望大家持续关注 deepin 论坛专栏活动【产品面对面】。 附录: 1)玲珑官方文档:https://linglong.dev/guide/ll-builder/introduction.html 2)deepin 系统历史版本镜像获取(含 deepin V15):https://distrowatch.com/index.php?distribution=deepin

优秀的个人博客,低调大师

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

前言 资源是影响 Spark 应用执行效率的一个重要因素。Spark 应用中真正执行 task 的组件是 Executor,可以通过spark.executor.instances 指定 Spark 应用的 Executor 的数量。在运行过程中,无论 Executor上是否有 task 在执行,都会被一直占有直到此 Spark 应用结束。 上篇我们从动态优化的角度讲述了 Spark 3.0 版本中的自适应查询特性,它主要是在一条 SQL 执行过程中不断优化执行逻辑,选择更好的执行策略,从而达到提升性能的目的。本篇我们将从整个 Spark 集群资源的角度讨论一个常见痛点:资源不足。 在 Spark 集群中的一个常见场景是,随着业务的不断发展,需要运行的 Spark 应用数和数据量越来越大,靠资源堆砌的优化方式也越来越显得捉襟见肘。当一个长期运行的 Spark 应用,若分配给它多个 Executor,可是却没有任何 task 分配到这些 Executor 上,而此时有其他的 Spark 应用却资源紧张,这就造成了资源浪费和调度不合理。 要是每个 Spark 应用的 Executor 数也能动态调整那就太好了。 动态资源分配(Dynamic Resource Allocation)就是为了解决这种场景而产生。Spark 2.4 版本中 on Kubernetes 的动态资源并不完善,在 Spark 3.0 版本完善了 Spark on Kubernetes 的功能,其中就包括更灵敏的动态分配。我们 Erda 的 FDP 平台(Fast Data Platform)从 Spark 2.4 升级到 Spark 3.0,也尝试了动态资源分配的相关优化。本文将针对介绍 Spark 3.0 中 Spark on Kubernetes 的动态资源使用。 原理 一个 Spark 应用中如果有些 Stage 稍微数据倾斜,那就有大量的 Executor 是空闲状态,造成集群资源的极大浪费。通过动态资源分配策略,已经空闲的 Executor 如果超过了一定时间,就会被集群回收,并在之后的 Stage 需要时可再次请求 Executor。 如下图所示,固定 Executor 个数情况,Job1 End 和 Job2 Start 之间,Executor 处于空闲状态,此时就造成集群资源的浪费。 开启动态资源分配后,在 Job1 结束后,Executor1 空闲一段时间便被回收;在 Job2 需要资源时再申Executor2,实现集群资源的动态管理。 动态分配的原理很容易理解:“按需使用”。当然,一些细节还是需要考虑到: 何时新增/移除 Executor Executor 数量的动态调整范围 Executor 的增减频率 Spark on Kubernetes 场景下,Executor 的 Pod 销毁后,它存储的中间计算数据如何访问 这些注意点在下面的参数列表中都有相应的说明。 参数一览 spark.dynamicAllocation.enabled=true #总开关,是否开启动态资源配置,根据工作负载来衡量是否应该增加或减少executor,默认false spark.dynamicAllocation.shuffleTracking.enabled=true #spark3新增,之前没有官方支持的on k8s的Dynamic Resouce Allocation。启用shuffle文件跟踪,此配置不会回收保存了shuffle数据的executor spark.dynamicAllocation.shuffleTracking.timeout #启用shuffleTracking时控制保存shuffle数据的executor超时时间,默认使用GC垃圾回收控制释放。如果有时候GC不及时,配置此参数后,即使executor上存在shuffle数据,也会被回收。暂未配置 spark.dynamicAllocation.minExecutors=1 #动态分配最小executor个数,在启动时就申请好的,默认0 spark.dynamicAllocation.maxExecutors=10 #动态分配最大executor个数,默认infinity spark.dynamicAllocation.initialExecutors=2 #动态分配初始executor个数默认值=spark.dynamicAllocation.minExecutors spark.dynamicAllocation.executorIdleTimeout=60s #当某个executor空闲超过这个设定值,就会被kill,默认60s spark.dynamicAllocation.cachedExecutorIdleTimeout=240s #当某个缓存数据的executor空闲时间超过这个设定值,就会被kill,默认infinity spark.dynamicAllocation.schedulerBacklogTimeout=3s #任务队列非空,资源不够,申请executor的时间间隔,默认1s(第一次申请) spark.dynamicAllocation.sustainedSchedulerBacklogTimeout #同schedulerBacklogTimeout,是申请了新executor之后继续申请的间隔,默认=schedulerBacklogTimeout(第二次及之后) spark.specution=true #开启推测执行,对长尾task,会在其他executor上启动相同task,先运行结束的作为结果 实战演示 无图无真相,下面我们将动态资源分配进行简单演示。 1.配置参数 动态资源分配相关参数配置如下图所示: 如下图所示,Spark 应用启动时的 Executor 个数为 2。因为配置了 spark.dynamicAllocation.initialExecutors=2 <center>![5.png](https://ucc.alicdn.com/pic/developer-ecology/d8b8fffe6179483b8fe0ae153fb88d68.png)</center> 运行一段时间后效果如下,executorNum 会递增,因为空闲的 Executor 被不断回收,新的 Executor 不断申请。 2. 验证快慢 SQL 执行 使用 SparkThrfitServer 会遇到的问题是一个数据量很大的 SQL 把所有的资源全占了,导致后面的 SQL 都等待,即使后面的 SQL 只需要几秒就能完成。我们开启动态分配策略,再来看 SQL 执行顺序。 先提交慢 SQL: 再提交快 SQL: 如下图所示,开启动态资源分配后,因为 SparkThrfitServer 可以申请新的 Executor,后面的 SQL 无需等待便可执行。Job7(慢 SQL)还在运行中,后提交的 Job8(快 SQL)已完成。这在一定程度上缓解了资源分配不合理的情况。 3. 详情查看 我们在 SparkWebUI 上可以看到动态分配的整个流程。 登陆 SparkWebUI 页面,Jobs -> Event Timeline,可以看到 Driver 对整个应用的 Executor 调度。如下图所示,显示了每个 Executor 的创建和回收。 同时也能看到此 Executor 的具体创建和回收时间。 在 Executors 标签页,我们可以看到所有历史 Executor 的当前状态。如下图所示,之前的 Executor 都已被回收,只有 Executor-31 状态为 Active。 总结 动态资源分配策略在空闲时释放 Executor,繁忙时申请 Executor,虽然逻辑比较简单,但是和任务调度密切相关。它可以防止小数据申请大资源,Executor 空转的情况。在集群资源紧张,有多个 Spark 应用的场景下,可以开启动态分配达到资源按需使用的效果。 以上是我们在 Spark 相关优化的一点经验,希望能够对大家有所帮助😄。 注:文中部分图片源自于网络,侵删。 更多技术干货请关注【尔达 Erda】公众号,与众多开源爱好者共同成长~

优秀的个人博客,低调大师

入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法

作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya 总览 Web抓取是一种从网站提取数据的高效方法(取决于网站的规定) 了解如何使用流行的BeautifulSoup库在Python中执行网页抓取 我们将介绍可以抓取的不同类型的数据,例如文本和图像 介绍 我们拥有的数据太少,无法建立机器学习模型。我们需要更多数据! 如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题。我们无法在数据科学项目中获得可以直接使用的Excel或.csv文件,对吗? 那么,如何应对数据匮乏的问题呢? 实现此目的最有效,最简单的方法之一就是通过网页抓取。我个人发现网络抓取是一种非常有用的技术,可以从多个网站收集数据。如今,某些网站还为你可能希望使用的许多不同类型的数据提供API,例如Tweets或LinkedIn帖子。 但是有时你可能需要从不提供特定API的网站收集数据。这就是web抓取能力派上用场的地方。作为数据科学家,你可以编写一个简单的Python脚本并提取所需的数据。 因此,在本文中,我们将学习Web抓取的不同组件,然后直接研究Python,以了解如何使用流行且高效的BeautifulSoup库执行Web抓取。 我们还为本文创建了一个免费课程: 使用Python进行Web爬网简介。这种结构化的格式将帮助你更好地学习。 https://courses.analyticsvidhya.com/courses/introduction-to-web-scraping 请注意,网页抓取要遵守许多准则和规则。并非每个网站都允许用户抓取内容,因此存在一定的法律限制。在尝试执行此操作之前,请务必确保已阅读网站的网站条款和条件。 目录 3个流行的工具和库,用于Python中的Web爬虫 Web爬网的组件 Crawl Parse and Transform Store 从网页中爬取URL和电子邮件ID 爬取图片 在页面加载时抓取数据 3个流行的工具和库,用于Python中的Web爬虫 你将在Python中遇到多个用于Web抓取的库和框架。以下是三种高效完成任务的热门工具: BeautifulSoup BeautifulSoup是Python中一个了不起的解析库,可用于从HTML和XML文档进行Web抓取。 BeautifulSoup会自动检测编码并优雅地处理HTML文档,即使带有特殊字符也是如此。我们可以浏览已解析的文档并找到所需的内容,这使得从网页中提取数据变得快捷而轻松。在本文中,我们将详细学习如何使用Beautiful Soup构建web Scraper Scrapy Scrapy是用于大规模Web抓取的Python框架。它为你提供了从网站中高效提取数据,根据需要进行处理并以你喜欢的结构和格式存储数据所需的所有工具。你可以在这里阅读更多有关Scrapy的信息。 https://www.analyticsvidhya.com/blog/2017/07/web-scraping-in-python-using-scrapy Selenium Selenium是另一个使浏览器自动化的流行工具。它主要用于行业中的测试,但也非常方便进行网页抓取。看看这篇很棒的文章,以了解更多有关使用Selenium进行Web抓取的工作方式的信息。 https://www.analyticsvidhya.com/blog/2019/05/scraping-classifying-youtube-video-data-python-selenium Web爬网的组件 这是构成网页抓取的三个主要组成部分的出色说明: 让我们详细了解这些组件。我们将通过goibibo网站抓取酒店的详细信息,例如酒店名称和每间客房的价格,以实现此目的: 注意:请始终遵循目标网站的robots.txt文件,该文件也称为漫游器排除协议。这可以告诉网络漫游器不要抓取哪些页面。 https://www.goibibo.com/robots.txt 因此,我们被允许从目标URL中抓取数据。我们很高兴去写我们的网络机器人的脚本。让我们开始! 第1步:Crawl(抓取) Web抓取的第一步是导航到目标网站并下载网页的源代码。我们将使用请求库来执行此操作。http.client和urlib2是另外两个用于发出请求和下载源代码的库。 http.client:https://docs.python.org/3/library/http.client.html#module-http.client urlib2:https://docs.python.org/2/library/urllib2.html 下载了网页的源代码后,我们需要过滤所需的内容: """ Web Scraping - Beautiful Soup """ # importing required libraries import requests from bs4 import BeautifulSoup import pandas as pd # target URL to scrap url = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/" # headers headers = { 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" } # send request to download the data response = requests.request("GET", url, headers=headers) # parse the downloaded data data = BeautifulSoup(response.text, 'html.parser') print(data) 步骤2:Parse and Transform(解析和转换) Web抓取的下一步是将这些数据解析为HTML解析器,为此,我们将使用BeautifulSoup库。现在,如果你已经注意到我们的目标网页,则与大多数网页一样,特定酒店的详细信息也位于不同的卡片上。 因此,下一步将是从完整的源代码中过滤卡片数据。接下来,我们将选择该卡片,然后单击“Inspect Element”选项以获取该特定卡的源代码。你将获得如下内容: 所有卡的类名都相同,我们可以通过传递标签名称和属性(如<class>标签)来获得这些卡的列表,其名称如下所示: # find all the sections with specifiedd class name cards_data = data.find_all('div', attrs={'class', 'width100 fl htlListSeo hotel-tile-srp-container hotel-tile-srp-container-template new-htl-design-tile-main-block'}) # total number of cards print('Total Number of Cards Found : ', len(cards_data)) # source code of hotel cards for card in cards_data: print(card) 我们从网页的完整源代码中过滤出了卡数据,此处的每张卡都包含有关单独酒店的信息。仅选择酒店名称,执行“Inspect Element”步骤,并对房间价格执行相同操作: 现在,对于每张卡,我们必须找到上面的酒店名称,这些名称只能从<p>标签中提取。这是因为每张卡和房价只有一个 < p > 标签和 < class > 标签和类名: # extract the hotel name and price per room for card in cards_data: # get the hotel name hotel_name = card.find('p') # get the room price room_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'}) print(hotel_name.text, room_price.text) 步骤3:Store(储存数据) 最后一步是将提取的数据存储在CSV文件中。在这里,对于每张卡,我们将提取酒店名称和价格并将其存储在Python字典中。然后,我们最终将其添加到列表中。 接下来,让我们继续将此列表转换为Pandas数据框,因为它允许我们将数据框转换为CSV或JSON文件: # create a list to store the data scraped_data = [] for card in cards_data: # initialize the dictionary card_details = {} # get the hotel name hotel_name = card.find('p') # get the room price room_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'}) # add data to the dictionary card_details['hotel_name'] = hotel_name.text card_details['room_price'] = room_price.text # append the scraped data to the list scraped_data.append(card_details) # create a data frame from the list of dictionaries dataFrame = pd.DataFrame.from_dict(scraped_data) # save the scraped data as CSV file dataFrame.to_csv('hotels_data.csv', index=False) 恭喜!我们已经成功创建了一个基本的网页抓取工具。我希望你尝试这些步骤,并尝试获取更多数据,例如酒店的等级和地址。现在,让我们看看如何执行一些常见任务,例如在页面加载时抓取URL,电子邮件ID,图像和抓取数据。 从网页中抓取URL和电子邮件ID 我们尝试使用网络抓取功能抓取的两个最常见的功能是网站URL和电子邮件ID。我敢肯定你曾经参与过需要大量提取电子邮件ID的项目或挑战。因此,让我们看看如何在Python中抓取这些内容。 使用Web浏览器的控制台 假设我们要跟踪我们的Instagram关注者,并想知道取消关注我们帐户的人的用户名。首先,登录到你的Instagram帐户,然后单击关注者以查看列表: 一直向下滚动,以便将所有用户名都加载到浏览器内存中的后台 右键单击浏览器窗口,然后单击“检查元素” 在控制台窗口中,键入以下命令: urls = $$(‘a’); for (url in urls) console.log ( urls[url].href); 仅需一行代码,我们就可以找到该特定页面上存在的所有URL: 接下来,将此列表保存在两个不同的时间戳中,一个简单的Python程序将使你知道两者之间的区别。我们将能够知道取消了我们的帐户的用户名! 我们可以使用多种方法来简化此任务。主要思想是,只需一行代码,我们就可以一次性获得所有URL。 使用Chrome扩展程序电子邮件提取器 电子邮件提取器是一个Chrome插件,可捕获我们当前正在浏览的页面上显示的电子邮件ID 它甚至允许我们下载CSV或文本文件中的电子邮件ID列表: BeautifulSoup和正则表达式 仅当我们只想从一页抓取数据时,以上解决方案才有效。但是,如果我们希望对多个网页执行相同的步骤怎么办? 有许多网站可以通过收费为我们做到这一点。但这里有个好消息——我们还可以使用Python编写自己的Web爬虫!让我们在下面的实时编码窗口中查看操作方法。 https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2019/10/web-scraping-hands-on-introduction-python 在Python中爬取图片 在本节中,我们将从同一个Goibibibo网页抓取所有图片。第一步是导航到目标网站并下载源代码。接下来,我们将使用 < img > 标签查找所有图像: """ Web Scraping - Scrap Images """ # importing required libraries import requests from bs4 import BeautifulSoup # target URL url = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/" headers = { 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" } response = requests.request("GET", url, headers=headers) data = BeautifulSoup(response.text, 'html.parser') # find all with the image tag images = data.find_all('img', src=True) print('Number of Images: ', len(images)) for image in images: print(image) 从所有图像标签中,仅选择src部分。另外,请注意,酒店图片以jpg格式提供。因此,我们将仅选择那些: # select src tag image_src = [x['src'] for x in images] # select only jp format images image_src = [x for x in image_src if x.endswith('.jpg')] for image in image_src: print(image) 现在我们有了图像URL的列表,我们要做的就是请求图像内容并将其写入文件中。确保打开文件“ wb”(写二进制文件)形式 image_count = 1 for image in image_src: with open('image_'+str(image_count)+'.jpg', 'wb') as f: res = requests.get(image) f.write(res.content) image_count = image_count+1 你还可以按页码更新初始页面URL,并反复请求它们以收集大量数据。 在页面加载时抓取数据 让我们看一下Steam社区Grant Theft Auto V Reviews的网页。你会注意到网页的完整内容不会一口气加载。 https://steamcommunity.com/app/271590/reviews/?browsefilter=toprated&snr=1_5_100010_ 我们需要向下滚动以在网页上加载更多内容。这是网站后端开发人员使用的一种称为“延迟加载”的优化技术。 但是对我们来说,问题是,当我们尝试从该页面抓取数据时,我们只会得到该页面的有限内容: 一些网站还创建了“加载更多”按钮,而不是无休止的滚动想法。仅当你单击该按钮时,它将加载更多内容。内容有限的问题仍然存在。因此,让我们看看如何抓取这些网页。 导航到目标URL并打开“检查元素网络”窗口。接下来,点击重新加载按钮,它将为你记录网络,如图像加载,API请求,POST请求等的顺序。 清除当前记录并向下滚动。你会注意到,向下滚动时,该网页正在发送更多数据的请求: 进一步滚动,你将看到网站发出请求的方式。查看以下URL——仅某些参数值正在更改,你可以通过简单的Python代码轻松生成这些URL: 你需要按照相同的步骤来抓取和存储数据,方法是将请求一页一页地发送到每个页面。 尾注 这是使用功能强大的BeautifulSoup库对Python中的网络抓取进行的简单且对初学者友好的介绍。老实说,当我正在寻找一个新项目或需要一个现有项目的信息时,我发现网络抓取非常有用。 注意:如果你想以更结构化的形式学习本教程,我们有一个免费课程,我们将教授网络抓取BeatifulSoup。你可以在此处查看—— 使用Python进行Web爬网简介。 https://courses.analyticsvidhya.com/courses/introduction-to-web-scraping 如前所述,还有其他一些库可用于执行Web抓取。我很想听听你更喜欢的库的想法(即使你使用R语言!),以及你对该主题的经验。在下面的评论部分中告诉我,我们将与你联系! 原文链接:https://www.analyticsvidhya.com/blog/2019/10/web-scraping-hands-on-introduction-python/ 欢迎关注磐创AI博客站: http://panchuang.net/ sklearn机器学习中文官方文档: http://sklearn123.com/ 欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

优秀的个人博客,低调大师

Apache Flink 极客挑战赛入门指南(附Demo)

最近在参加第二届 Apache Flink 极客挑战赛,比赛要求各队利用大数据 + AI 技术来帮助解决疫情防控的挑战,官方提供的计算框架是 Apache Flink + Analytics Zoo。 由于本次大赛既要用到大数据技术,又要用到 AI 技术,这使得只有单一技术背景的同学在搭建本地调试环境时遇到了不少问题。所以我把自己配置本地环境的流程和需要注意的地方记录下来,以供各位参赛同学参考,希望大家能将自己的精力更多集中在算法开发和迭代上。 注:希望大家在参考环境搭建流程时,不要直接照搬照抄;多理解其中的原理,针对自己的机器,要能做出一些细节上的调整。 环境搭建 Linux 18.04 官方要求的操作系统是 Linux 18.04,我本地配置环境用的是 Linux 16.04,亲测也能成功。 注:千万不要在 macOS 或者 windows 上直接配置环境,因为本次比赛依赖的 pyproxima 只提供了 linux 的安装包。如果只有 macOS 或者 windows,可以搭一个 linux 18.04 的虚拟机,或者使用 docker。 Java 1.8+ 建议安装 java1.8 (java 8)。 java 1.8+ 包括 java 8,java 9,······,java 14,我开始装的是 java 14,出现了 kafka 2.3 不能启动等异常,最后换成了 java 8。 从 java 官网下载 jdk-8u261-linux-x64.tar.gz 解压上面下载的压缩包:tar xzf jdk-8u261-linux-x64.tar.gz 配置环境变量: export JAVA_HOME=/data/gaohongjie1/usr/local/jdk1.8.0_261 # jdk-8u261-linux-x64.tar.gz 解压后的路径 export PATH=$JAVA_HOME/bin:$PATH 运行 java -version 测试是否安装成功 Python 3.7 如果系统中的 Python 恰好为 3.7,直接使用系统中的 Python 即可。 如果系统默认 Python 不是 3.7,则需要搭建自己的 Python 环境。我这里用的是 Anaconda。 安装 Anaconda:https://docs.anaconda.com/anaconda/install/linux/ 创建一个名为 Flink 的 Python 虚拟环境: create -n flink python=3.7 -y 激活虚拟环境: activate flink 运行 which python 测试是否激活成功 Flink 1.11.0 下载压缩包并解压 wget https://archive.apache.org/dist/flink/flink-1.11.0/flink-1.11.0-bin-scala_2.11.tgz tar xzf flink-1.11.0-bin-scala_2.11.tgz 配置环境变量 export FLINK_HOME=/data/gaohongjie1/usr/local/flink-1.11.0 export PATH=$PATH:$FLINK_HOME/bin 根据本机的资源(CPU、内存大小)修改 flink-1.11.0/conf/flink-conf.yaml taskmanager.numberOfTaskSlots: 120 jobmanager.memory.process.size: 4096m taskmanager.memory.process.size: 409600m taskmanager.memory.task.off-heap.size: 204800m 测试 Start: 运行 start-cluster.sh Stop: 运行 stop-cluster.sh Pyflink 1.11.0 pip install apache-flink==1.11.0 如果下载速度太慢,可以考虑使用清华源或者阿里源等。 使用清华源安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple apache-flink==1.11.0 Kafka 2.x 下载压缩包并解压 wget https://archive.apache.org/dist/kafka/2.3.0/kafka_2.11-2.3.0.tgz tar xzf kafka_2.11-2.3.0.tgz 配置环境变量 export KAFKA_HOME=/data/gaohongjie1/usr/local/kafka_2.11-2.3.0 export PATH=$PATH:$KAFKA_HOME/bin 测试 启动 zookeeper 选做:修改 kafka_2.11-2.3.0/config/zookeeper.properties 中的 dataDir 运行 zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties 启动 Kafka 不要关闭 Zookeeper,另开一个 terminal 进行以下操作 选做:修改 kafka_2.11-2.3.0/config/server.properties 中的 log.dirs 运行:kafka-server-start.sh $KAFKA_HOME/config/server.properties AI Flow wget https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531800/ai_flow/ai_flow-0.1-py3-none-any.whl pip install ai_flow-0.1-py3-none-any.whl # pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ai_flow-0.1-py3-none-any.whl Pyproxima wget https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531800/proxima-tianchi-master-668a0a87cb2a4aa1c68443b1ab05ee5a80008cb4.zip unzip proxima-tianchi-master-668a0a87cb2a4aa1c68443b1ab05ee5a80008cb4.zip pip install proxima-tianchi-master-668a0a87cb2a4aa1c68443b1ab05ee5a80008cb4/python/pyproxima2-2.2.0_lite-cp37-cp37m-linux_x86_64.whl ■ Redis 5.0.5 安装 wget http://download.redis.io/releases/redis-5.0.5.tar.gz tar xzf redis-5.0.5.tar.gz cd redis-5.0.5 make 选做:make test 运行 redis 的单元测试 配置环境变量 export REDIS_HOME=/data/gaohongjie1/usr/local/redis-5.0.5 export PATH=$PATH:$REDIS_HOME/src 测试:运行 redis-server ■ Flink 1.11.0 见上文「Flink 1.11.0」。 ■ cluster serving 安装 wget https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531800/analytics_zoo_serving-0.9.0.dev0-py3-none-any.whl pip install analytics_zoo_serving-0.9.0.dev0-py3-none-any.whl # pip install -i https://pypi.tuna.tsinghua.edu.cn/simple analytics_zoo_serving-0.9.0.dev0-py3-none-any.whl mkdir cluster-serving cd cluster-serving cluster-serving-init # 这里会下载两个jar文件,生成config.yaml 修改 config.yaml # 修改cluster-serving/config.yaml model: path: /data/gaohongjie1/projects/tianchi-flink/package/python_codes/model 配置环境变量 export CS_PATH=/data/gaohongjie1/usr/local/cluster-serving export SERVING_HTTP_PATH=$CS_PATH/analytics-zoo-bigdl_0.10.0-spark_2.4.3-0.9.0-20200812.210515-69-http.jar export CLUSTER_SERVING_PATH=/tmp/cluster_serving Kafka-python pip install kafka-python 运行 Demo 下载官方提供的 demo我的 demo 存放路径:/data/gaohongjie1/projects/tianchi_ai_flow) 下载数据集 train_data.csv 和 label_file.csv 文件到 data_set 目录(/data/gaohongjie1/projects/tianchi_ai_flow/data_set)https://tianchi.aliyun.com/competition/entrance/531800/information 配置环境变量 export PYTHONPATH=/data/gaohongjie1/projects/tianchi_ai_flow/package/python_codes export ENV_HOME=/data/gaohongjie1/projects/tianchi_ai_flow export TASK_ID=000 修改 source.yaml dataset_uri: /data/gaohongjie1/projects/tianchi_ai_flow/data_set/second_test_data.csv 修改 demo 代码 tianchi_main.py: job_1_cluster_serving_channel = af.cluster_serving(model_info=train_model_meta, parallelism=4) tianchi_executor.py: stream_env.set_parallelism(20) demo中出现的所有 /usr/bin/python3 都改成自己的python路径 启动依赖的服务 redis-server --daemonize yes start-cluster.sh zookeeper-server-start.sh -daemon $KAFKA_HOME/config/zookeeper.properties kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties python /data/gaohongjie1/projects/tianchi_ai_flow/ai_flow_master.py python /data/gaohongjie1/projects/tianchi_ai_flow/kafka-source.py 这里可能会报错,报错信息包含 return '' % self.async 字样。这是因为前面在执行 pip install ai_flow-0.1-py3-none-any.whl 的时候,AI Flow 的依赖包有kafka-1.3.5。而 kafka-1.3.5 与 python 3.7 是不兼容的。 解决方案:先执行 pip uninstall kafka kafka-python,再执行 pip install kafka-python python/data/gaohongjie1/projects/tianchi_ai_flow/package/python_codes/tianchi_main.py 总结 本文主要记录了我搭建本地调试环境的流程,介绍了如何跑通 Demo。希望本文对大家能有所帮助,让大家早日投入到算法的开发和迭代中去。

优秀的个人博客,低调大师

invoke 十分钟入门指南

接着前面的《tox 教程》,以及刚翻译好的《nox文档》,我们继续聊聊 Python 任务自动化的话题。 nox 的作者在去年的 Pycon US 上,做了一场题为《Break the Cycle: Three excellent Python tools to automate repetitive tasks》的分享(B站观看地址:https://b23.tv/av86640235),她介绍了三个任务自动化工具:tox、nox 和 invoke,本文的话题正好就是最后的 invoke。 1、invoke 可以做什么? invoke 是从著名的远程部署工具 Fabric 中分离出来的,它与 paramiko 一起是 Fabric 的两大最核心的基础组件。 除了作为命令行工具,它专注于“任务执行”(task execution),可以标注和组织任务,并通过 CLI(command-line interface,即命令行界面) 和 shell 命令来执行任务。 同样是任务自动化工具,invoke 与我们之前介绍过的 tox/nox 在侧重点上有所不同: tox/nox 主要是在打包、测试、持续集成等方面的自动化(当然它们能做的还不止于此) invoke 则更具普遍性,可以用在任何需要“执行任务”的场景,可以是无相关性的任务组,也可以是有顺序依赖的分步骤的工作流 invoke 在 Github 上有 2.7K star,十分受欢迎,接下来我们看看它如何使用? 2、怎么使用 invoke? 首先,安装很简单:pip install invoke。 其次,简单使用时有以下要素: 任务文件。创建一个 tasks.py 文件。 @task 装饰器。在一个函数上添加 @task 装饰器,即可将该函数标记为一个任务,接受 invoke 的调度管理。 上下文参数。给被装饰的函数添加一个上下文参数(context argument),注意它必须作为第一个参数,而命名按约定可以是c 或ctx 或context 。 命令行执行。在命令行中执行invoke --list 来查看所有任务,运行invoke xxx 来执行名为 xxx 的任务。命令行中的“invoke”可以简写成“inv”。 以下是一个简单的示例: # 文件名:tasks.py from invoke import task @task def hello(c): print("Hello world!") @task def greet(c, name): c.run(f"echo {name}加油!") 在上述代码中,我们定义了两个任务: ”hello“任务调用了 Python 内置的 print 函数,会打印一个字符串“Hello world!” “greet”任务调用了上下文参数的 run() 方法,可以执行 shell 命令,同时本例中还可以接收一个参数。在 shell 命令中,echo 可理解成打印,所以这也是一个打印任务,会打印出“xxx加油!”(xxx 是我们传的参数) 以上代码写在 tasks.py 文件中,首先导入装饰器 from invoke import task,@task 装饰器可以不带参数,也可以带参数(参见下一节),被它装饰了的函数就是一个任务。 上下文参数(即上例的“c”)必须要显式地指明,如果缺少这个参数,执行时会抛出异常:“TypeError: Tasks must have an initial Context argument!” 然后在 tasks.py 文件的同级目录中,打开命令行窗口,执行命令。如果执行的位置找不到这个任务文件,则会报错:“Can't find any collection named 'tasks'!” 正常情况下,通过执行inv --list 或者inv -l ,可以看到所有任务的列表(按字母表顺序排序): &gt;&gt;&gt; inv -l Available tasks: greet hello 我们依次执行这两个任务,其中传参时可以默认按位置参数传参,也可以指定关键字传参。结果是: &gt;&gt;&gt; inv hello Hello world! &gt;&gt;&gt; inv greet 武汉 武汉加油! &gt;&gt;&gt; inv greet --name="武汉" 武汉加油! 缺少传参时,报错:'greet' did not receive required positional arguments: 'name';多余传参时,报错:No idea what '???' is! 3、 如何用好 invoke? 介绍完 invoke 的简单用法,我们知道了它所需的几项要素,也大致知道了它的使用步骤,接下来是它的其它用法。 3.1 添加帮助信息 在上例中,“inv -l”只能看到任务名称,缺少必要的辅助信息,为了加强可读性,我们可以这样写: @task(help={'name': 'A param for test'}) def greet(c, name): """ A test for shell command. Second line. """ c.run(f"echo {name}加油!") 其中,文档字符串的第一行内容会作为摘录,在“inv -l”的查询结果中展示,而且完整的内容与 @task 的 help 内容,会对应在“inv --help”中展示: &gt;&gt;&gt; inv -l Available tasks: greet A test for shell command. &gt;&gt;&gt; inv --help greet Usage: inv[oke] [--core-opts] greet [--options] [other tasks here ...] Docstring: A test for shell command. Second line. Options: -n STRING, --name=STRING A param for test 3.2 任务的分解与组合 通常一个大任务可以被分解成一组小任务,反过来,一系列的小任务也可能被串连成一个大任务。在对任务作分解、抽象与组合时,这里有两种思路: 对内分解,对外统一:只定义一个 @task 的任务,作为总体的任务入口,实际的处理逻辑可以抽象成多个方法,但是外部不感知到它们 多点呈现,单点汇总:定义多个 @task 的任务,外部可以感知并分别调用它们,同时将有关联的任务组合起来,调用某个任务时,也执行其它相关联的任务 第一种思路很容易理解,实现与使用都很简单,但是其缺点是缺少灵活性,难于单独执行其中的某个/些子任务。适用于相对独立的单个任务,通常也不需要 invoke 就能做到(使用 invoke 的好处是,拥有命令行的支持)。 第二种思路更加灵活,既方便单一任务的执行,也方便多任务的组合执行。实际上,这种场景才是 invoke 发挥最大价值的场景。 那么,invoke 如何实现分步任务的组合呢?可以在 @task 装饰器的“pre”与“post”参数中指定,分别表示前置任务与后置任务: @task def clean(c): c.run("echo clean") @task def message(c): c.run("echo message") @task(pre=[clean], post=[message]) def build(c): c.run("echo build") clean 与 message 任务作为子任务,可以单独调用,也可以作为 build 任务的前置与后置任务而组合使用: &gt;&gt;&gt; inv clean clean &gt;&gt;&gt; inv message message &gt;&gt;&gt; inv build clean build message 这两个参数是列表类型,即可设置多个任务。另外,在默认情况下,@task 装饰器的位置参数会被视为前置任务,接着上述代码,我们写一个: @task(clean, message) def test(c): c.run("echo test") 然后执行,会发现两个参数都被视为了前置任务: &gt;&gt;&gt; inv test clean message test 3.3 模块的拆分与整合 如果要管理很多相对独立的大型任务,或者需要多个团队分别维护各自的任务,那么,就有必要对 tasks.py 作拆分与整合。 例如,现在有多份 tasks.py,彼此是相对完整而独立的任务模块,不方便把所有内容都放在一个文件中,那么,如何有效地把它们整合起来管理呢? invoke 提供了这方面的支持。首先,只能保留一份名为“tasks.py”的文件,其次,在该文件中导入其它改名后的任务文件,最后,使用 invoke 的 Collection 类把它们关联起来。 我们把本文中第一个示例文件改名为 task1.py,并新建一个 tasks.py 文件,内容如下: # 文件名:tasks.py from invoke import Collection, task import task1 @task def deploy(c): c.run("echo deploy") namespace = Collection(task1, deploy) 每个 py 文件拥有独立的命名空间,而在此处,我们用 Collection 可以创建出一个新的命名空间,从而实现对所有任务的统一管理。效果如下: &gt;&gt;&gt; inv -l Available tasks: deploy task1.greet task1.hello &gt;&gt;&gt; inv deploy deploy &gt;&gt;&gt; inv task1.hello Hello world! &gt;&gt;&gt; inv task1.greet 武汉 武汉加油! 关于不同任务模块的导入、嵌套、混合、起别名等内容,还有不少细节,请查阅官方文档了解。 3.4 交互式操作 某些任务可能需要交互式的输入,例如要求输入“y”,按回车键后才会继续执行。如果在任务执行期间需要人工参与,那自动化任务的能力将大打折扣。 invoke 提供了在程序运行期的监控能力,可以监听stdout 和stderr ,并支持在stdin 中输入必要的信息。 例如,假设某个任务(excitable-program)在执行时会提示“Are you ready? [y/n]”,只有输入了“y”并按下回车键,才会执行后续的操作。 那么,在代码中指定 responses 参数的内容,只要监听到匹配信息,程序会自动执行相应的操作: responses = {r"Are you ready? \[y/n\] ": "y\n"} ctx.run("excitable-program", responses=responses) responses 是字典类型,键值对分别为监听内容及其回应内容。需注意,键值会被视为正则表达式,所以像本例中的方括号就要先转义。 3.5 作为命令行工具库 Python 中有不少好用的命令行工具库,比如标准库中的argparse、Flask 作者开源的click 与谷歌开源的fire 等等,而 invoke 也可以作为命令行工具库使用。 (PS:有位 Prodesire 同学写了“Python 命令行之旅”的系列文章,详细介绍了其它几个命令行工具库的用法,我在公众号“Python猫”里转载过大部分,感兴趣的同学可查看历史文章。) 事实上,Fabric 项目最初把 invoke 分离成独立的库,就是想让它承担解析命令行与执行子命令的任务。所以,除了作为自动化任务管理工具,invoke 也可以被用于开发命令行工具。 官方文档中给出了一个示例,我们可以了解到它的基本用法。 假设我们要开发一个 tester 工具,让用户pip install tester 安装,而此工具提供两个执行命令:tester unit 和tester intergration 。 这两个子命令需要在 tasks.py 文件中定义: # tasks.py from invoke import task @task def unit(c): print("Running unit tests!") @task def integration(c): print("Running integration tests!") 然后在程序入口文件中引入它: # main.py from invoke import Collection, Program from tester import tasks program = Program(namespace=Collection.from_module(tasks), version='0.1.0') 最后在打包文件中声明入口函数: # setup.py setup( name='tester', version='0.1.0', packages=['tester'], install_requires=['invoke'], entry_points={ 'console_scripts': ['tester = tester.main:program.run'] } ) 如此打包发行的库,就是一个功能齐全的命令行工具了: $ tester --version Tester 0.1.0 $ tester --help Usage: tester [--core-opts] <subcommand> [--subcommand-opts] ... Core options: ... core options here, minus task-related ones ... Subcommands: unit integration $ tester --list No idea what '--list' is! $ tester unit Running unit tests! 上手容易,开箱即用,invoke 不失为一款可以考虑的命令行工具库。更多详细用法,请查阅文档 。 4、小结 invoke 作为从 Fabric 项目中分离出来的独立项目,它自身具备一些完整而强大的功能,除了可用于开发命令行工具,它还是著名的任务自动化工具。 本文介绍了它的基础用法与 5 个方面的中级内容,相信读者们会对它产生一定的了解。invoke 的官方文档十分详尽,限于篇幅,本文不再详细展开,若感兴趣,请自行查阅文档哦。 -------------- 公众号:Python猫(ID: python_cat) 头条号:Python猫 知乎:豌豆花下猫 掘金:豌豆花下猫 公众号【Python猫】, 本号连载优质的系列文章,有喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。</subcommand>

优秀的个人博客,低调大师

从零开始入门 K8s | 详解 K8s 容器基本概念

作者| 阿里巴巴高级开发工程师 傅伟 一、容器与镜像 什么是容器? 在介绍容器的具体概念之前,先简单回顾一下操作系统是如何管理进程的。 首先,当我们登录到操作系统之后,可以通过 ps 等操作看到各式各样的进程,这些进程包括系统自带的服务和用户的应用进程。那么,这些进程都有什么样的特点? 第一,这些进程可以相互看到、相互通信; 第二,它们使用的是同一个文件系统,可以对同一个文件进行读写操作; 第三,这些进程会使用相同的系统资源。 这样的三个特点会带来什么问题呢? 因为这些进程能够相互看到并且进行通信,高级权限的进程可以攻击其他进程; 因为它们使用的是同一个文件系统,因此会带来两个问题:这些进程可以对于已有的数据进行增删改查,具有高级权限的进程可能会将其他进程的数据删除掉,破坏掉其他进程的正常运行;此外,进程与进程之间的依赖可能会存在冲突,如此一来就会给

优秀的个人博客,低调大师

Python爬虫入门教程 55-100 python爬虫高级技术之验证码篇

验证码探究 如果你是一个数据挖掘爱好者,那么验证码是你避免不过去的一个天坑,和各种验证码斗争,必然是你成长的一条道路,接下来的几篇文章,我会尽量的找到各种验证码,并且去尝试解决掉它,中间有些技术甚至我都没有见过,来吧,一起Coding吧 数字+字母的验证码 我随便在百度图片搜索了一个验证码,如下 今天要做的是验证码识别中最简单的一种办法,采用pytesseract解决,它属于Python当中比较简单的OCR识别库 库的安装 使用pytesseract之前,你需要通过pip 安装一下对应的模块 ,需要两个 pytesseract库还有图像处理的pillow库了 pip install pytesseract pip install pillow 如果你安装了这两个库之后,编写一个识别代码,一般情况下会报下面这个错误 pytesseract.pytes

优秀的个人博客,低调大师

Python爬虫入门教程 54-100 博客园等博客网站自动评论器

爬虫背景 爬虫最核心的问题就是解决重复操作,当一件事情可以重复的进行的时候,就可以用爬虫来解决这个问题,今天要实现的一个基本需求是完成“博客园“ 博客的自动评论,其实原理是非常简单的,提炼一下需求 基本需求 登录博客园<不实现,登录单独编写博客> 调用评论接口 返回请求结果 确定流程之后,基本就是找突破口的环节了 实际的去评论一下,然后不管你用什么抓包工具都可以,只要抓取到你想要的数据,即可 评论API如下 Request URL: https://www.cnblogs.com/mvc/PostComment/Add.aspx Request Method: POST POST URL 有了,下面就是参数的问题 我随便找了一个请求的参数 {"blogApp":"wuxiaobin","postId":10510784,"body":"继续

优秀的个人博客,低调大师

Python爬虫入门教程 44-100 Charles的安装与使用-手机APP爬虫部分

1. 第二款抓包工具Charles安装与使用 Charles和Fiddler一样,也是一款抓包工具,比Fiddler界面更加清晰,支持多平台 1.1 官方网址 https://www.charlesproxy.com/ 1.2 下载地址 Charles工具下载地址:https://www.charlesproxy.com/download/ 自己去百度一款,我找了2个百度网盘的 链接挂了就不补了啊~ 链接: https://pan.baidu.com/s/1pMawsEv 密码:meuk 链接: https://pan.baidu.com/s/1kV3h0gf 密码: nqaa 下载之后,安装就比较简单了,常规操作即可 2. Charles基本操作 打开Charles在电脑上就可以使用了 2.1 PC设置抓包,包括HTTP和HTTPS 软件安装好了之

优秀的个人博客,低调大师

Python爬虫入门教程 37-100 云沃客项目外包网数据爬虫 scrapy

爬前叨叨 2019年开始了,今年计划写一整年的博客呢~,第一篇博客写一下 一个外包网站的爬虫,万一你从这个外包网站弄点外快呢,呵呵哒 数据分析 官方网址为 https://www.clouderwork.com/ 进入全部项目列表页面,很容易分辨出来项目的分页方式 get异步请求 Request URL:https://www.clouderwork.com/api/v2/jobs/search?ts=1546395904852&keyword=&budget_range=&work_status=&pagesize=20&pagenum=3&sort=1&scope= Request Method:GET Status Code:200 OK 参数如下 ts:1546395904

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册