首页 文章 精选 留言 我的

精选列表

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

Spark RDD/Core 编程 API入门系列之动手实战和调试Spark文件操作、动手实战操作搜狗日志文件、搜狗日志文件深入实战(二)

1、动手实战和调试Spark文件操作 这里,我以指定executor-memory参数的方式,启动spark-shell。 启动hadoop集群 spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ jps 8457 Jps spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$sbin/start-dfs.sh 启动spark集群 spark@SparkSingleNode:/usr/local/spark/spark-1.5.2-bin-hadoop2.6$sbin/start-all.sh spark@SparkSingleNode:/usr/local/spark/spark-1.5.2-bin-hadoop2.6/bin$./spark-shell --master spark://SparkSingleNode:7077 --executor-memory 1g 在命令行中,我指定了spark-shell运行时暂时用的每个机器上executor的内存大小为1GB。 从HDFS上读取该文件 scala> val rdd1 = sc.textFile("/README.md") 或 scala> val rdd1 = sc.textFile("hdfs:SparkSingleNode:9000/README.md") 返回,MapPartitionsRDD 使用,toDebugString,可以查看其lineage的关系。 rdd1: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:21 scala>rdd1.toDebugString 16/09/26 22:47:01 INFO mapred.FileInputFormat: Total input paths to process : 1 res0: String = (2)MapPartitionsRDD[1] at textFile at <console>:21 [] | /README.mdHadoopRDD[0] at textFile at <console>:21 [] scala> 可以看出,MapPartitionsRDD是HadoopRDD转换而来的。 hadoopFile,这个方法,产生HadoopRDD map,这个方法,产生MapPartitionsRDD 从源码分析过程 scala>val result = rdd1.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect le>:23, took 15.095588 s result: Array[(String, Int)] = Array((package,1), (this,1), (Version"](http://spark.apache.org/docs/latest/building-spark.html#specifying-the-hadoop-version),1), (Because,1), (Python,2), (cluster.,1), (its,1), ([run,1), (general,2), (have,1), (pre-built,1), (locally.,1), (locally,2), (changed,1), (sc.parallelize(1,1), (only,1), (several,1), (This,2), (basic,1), (Configuration,1), (learning,,1), (documentation,3), (YARN,,1), (graph,1), (Hive,2), (first,1), (["Specifying,1), ("yarn-client",1), (page](http://spark.apache.org/documentation.html),1), ([params]`.,1), (application,1), ([project,2), (prefer,1), (SparkPi,2), (<http://spark.apache.org/>,1), (engine,1), (version,1), (file,1), (documentation,,1), (MASTER,1), (example,3), (distribution.,1), (are,1), (params,1), (scala>,1), (DataFram... scala> 不可这样使用toDebugString scala> result.toDebugString <console>:26: error: value toDebugString is not a member of Array[(String, Int)] result.toDebugString scala>val wordcount = rdd1.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_) wordcount: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[10] at reduceByKey at <console>:23 scala>wordcount.toDebugString res3: String = (2) ShuffledRDD[10] at reduceByKey at <console>:23 [] +-(2) MapPartitionsRDD[9] at map at <console>:23 [] | MapPartitionsRDD[8] at flatMap at <console>:23 [] | MapPartitionsRDD[1] at textFile at <console>:21 [] | /README.md HadoopRDD[0] at textFile at <console>:21 [] scala> 或者 疑问:为什么没有MappedRDD?难道是版本问题?? 2、动手实战操作搜狗日志文件 本节中所用到的内容是来自搜狗实验室,网址为:http://www.sogou.com/labs/dl/q.html 我们使用的是迷你版本的tar.gz格式的文件,其大小为87K,下载后如下所示: 因为,考虑我的机器内存的自身情况。 或者 spark@SparkSingleNode:~$wget http://download.labs.sogou.com/dl/sogoulabdown/SogouQ/SogouQ2012.mini.tar.gz spark@SparkSingleNode:~$tar -zxvf SogouQ2012.mini.tar.gz 查看它的部分内容 spark@SparkSingleNode:~$head SogouQ.mini 该文件的格式如下所示:访问时间 \t 用户ID \t 查询词 \t 该URL在返回结果中的排名 \ t用户点击的顺序号 \t 用户点击的URL 开启hdfs和spark集群 把解压后的文件上传到hdfs的/目录下 spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$bin/hadoop fs -copyFromLocal ~/SogouQ.mini / 开启spark-shell spark@SparkSingleNode:/usr/local/spark/spark-1.5.2-bin-hadoop2.6/bin$./spark-shell --master spark://SparkSingleNode:7077 接下来 我们使用Spark获得搜索结果排名第一同时点击结果排名也是第一的数据量,也就是第四列值为1同时第五列的值也为1的总共的记录的个数。 读取SogouQ.mini文件 scala>val soGouQRdd = sc.textFile("hdfs://SparkSingleNode:9000/SogouQ.mini") scala>soGouQRdd.count took 10.753423 s res0: Long = 2000 可以看出,count之后有2000条记录 首先过滤出有效的数据: scala>val mapSoGouQRdd = soGouQRdd.map((_.split("\t"))).filter(_.length == 6) mapSoGouQRdd: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[3] at filter at <console>:23 scala>mapSoGouQRdd.count took 2.175379 s res1: Long = 2000 可以发现该文件中的数据都是有效数据。 该文件的格式如下所示: 访问时间 \t 用户ID \t查询词\t该URL在返回结果中的排名\ t用户点击的顺序号 \t 用户点击的URL 下面使用spark获得搜索结果排名第一同时点击结果排名也是第一的数据量: scala>val filterSoGouQRdd = mapSoGouQRdd.filter(_(3).toInt == 1).filter(_(4).toInt == 1) filterSoGouQRdd: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[5] at filter at <console>:25 scala>filterSoGouQRdd.count 可以发现搜索结果排名第一同时点击结果排名也是第一的数据量为794条; 使用toDebugString查看一下其lineage: scala>filterSoGouQRdd.toDebugString res3: String = (2) MapPartitionsRDD[5] at filter at <console>:25 [] | MapPartitionsRDD[4] at filter at <console>:25 [] | MapPartitionsRDD[3] at filter at <console>:23 [] | MapPartitionsRDD[2] at map at <console>:23 [] | MapPartitionsRDD[1] at textFile at <console>:21 [] | hdfs://SparkSingleNode:9000/SogouQ.mini HadoopRDD[0] at textFile at <console>:21 [] scala> 为什么没有? HadoopRDD->MappedRDD->MappedRDD->FilteredRDD->FilteredRDD->FilteredRDD 3、搜狗日志文件深入实战 下面看,用户ID查询次数排行榜: 该文件的格式如下所示: 访问时间 \t用户ID\t查询词\t该URL在返回结果中的排名\ t用户点击的顺序号 \t 用户点击的URL scala>val sortedSoGouQRdd = mapSoGouQRdd.map(x => (x(1),1)).reduceByKey(_+_).map(x => (x._2,x._1)).sortByKey(false).map(x => (x._2,x._1)) 对sortedSogouQRdd进行collect操作:(不要乱collect 会出现OOM的) scala>sortedSoGouQRdd.collect res4: Array[(String, Int)] = Array((f6492a1da9875f20e01ff8b5804dcc35,14), (e7579c6b6b9c0ea40ecfa0f425fc765a,11), (d3034ac9911c30d7cf9312591ecf990e,11), (5c853e91940c5eade7455e4a289722d6,10), (ec0363079f36254b12a5e30bdc070125,10), (828f91e6717213a65c97b694e6279201,9), (2a36742c996300d664652d9092e8a554,9), (439fa809ba818cee624cc8b6e883913a,9), (45c304b5f2dd99182451a02685252312,8), (5ea391fd07dbb616e9857a7d95f460e0,8), (596444b8c02b7b30c11273d5bbb88741,8), (a06830724b809c0db56263124b2bd142,8), (6056710d9eafa569ddc800fe24643051,7), (bc8cc0577bb80fafd6fad1ed67d3698e,7), (8897bbb7bdff69e80f7fb2041d83b17d,7), (41389fb54f9b3bec766c5006d7bce6a2,7), (b89952902d7821db37e8999776b32427,6), (29ede0f2544d28b714810965400ab912,6), (74033165c877f4082e14c1e94d1efff4,6), (833f242ff430c83d293980ec10a42484,6... scala> 把结果保存在hdfs上: scala>sortedSoGouQRdd.saveAsTextFile("hdfs://SparkSingleNode:9000/soGouQSortedResult.txt") 把这些,输出信息,看懂,深入,是大牛必经之路。 scala> sortedSoGouQRdd.saveAsTextFile("hdfs://SparkSingleNode:9000/soGouQSortedResult.txt") 16/09/27 10:08:34 INFO Configuration.deprecation: mapred.tip.id is deprecated. Instead, use mapreduce.task.id 16/09/27 10:08:34 INFO Configuration.deprecation: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id 16/09/27 10:08:34 INFO Configuration.deprecation: mapred.task.is.map is deprecated. Instead, use mapreduce.task.ismap 16/09/27 10:08:34 INFO Configuration.deprecation: mapred.task.partition is deprecated. Instead, use mapreduce.task.partition 16/09/27 10:08:34 INFO Configuration.deprecation: mapred.job.id is deprecated. Instead, use mapreduce.job.id 16/09/27 10:08:35 INFO spark.SparkContext: Starting job: saveAsTextFile at <console>:28 16/09/27 10:08:35 INFO spark.MapOutputTrackerMaster: Size of output statuses for shuffle 0 is 155 bytes 16/09/27 10:08:35 INFO scheduler.DAGScheduler: Got job 5 (saveAsTextFile at <console>:28) with 2 output partitions 16/09/27 10:08:35 INFO scheduler.DAGScheduler: Final stage: ResultStage 10(saveAsTextFile at <console>:28) 16/09/27 10:08:35 INFO scheduler.DAGScheduler: Parents of final stage: List(ShuffleMapStage 9) 16/09/27 10:08:35 INFO scheduler.DAGScheduler: Missing parents: List() 16/09/27 10:08:35 INFO scheduler.DAGScheduler: Submitting ResultStage 10 (MapPartitionsRDD[13] at saveAsTextFile at <console>:28), which has no missing parents 16/09/27 10:08:35 INFO storage.MemoryStore: ensureFreeSpace(128736) called with curMem=105283, maxMem=560497950 16/09/27 10:08:35 INFO storage.MemoryStore: Block broadcast_8 stored as values in memory (estimated size 125.7 KB, free 534.3 MB) 16/09/27 10:08:36 INFO storage.MemoryStore: ensureFreeSpace(43435) called with curMem=234019, maxMem=560497950 16/09/27 10:08:36 INFO storage.MemoryStore: Block broadcast_8_piece0 stored as bytes in memory (estimated size 42.4 KB, free 534.3 MB) 16/09/27 10:08:36 INFO storage.BlockManagerInfo: Added broadcast_8_piece0 in memory on 192.168.80.128:33999 (size: 42.4 KB, free: 534.5 MB) 16/09/27 10:08:36 INFO spark.SparkContext: Created broadcast 8 from broadcast at DAGScheduler.scala:861 16/09/27 10:08:36 INFO scheduler.DAGScheduler: Submitting 2 missing tasks from ResultStage 10 (MapPartitionsRDD[13] at saveAsTextFile at <console>:28) 16/09/27 10:08:36 INFO scheduler.TaskSchedulerImpl: Adding task set 10.0 with 2 tasks 16/09/27 10:08:36 INFO scheduler.TaskSetManager: Starting task 0.0 in stage 10.0 (TID 14, 192.168.80.128, PROCESS_LOCAL, 1901 bytes) 16/09/27 10:08:36 INFO storage.BlockManagerInfo: Added broadcast_8_piece0 in memory on 192.168.80.128:59936 (size: 42.4 KB, free: 534.5 MB) 16/09/27 10:08:41 INFO scheduler.TaskSetManager: Starting task 1.0 in stage 10.0 (TID 15, 192.168.80.128, PROCESS_LOCAL, 1901 bytes) 16/09/27 10:08:41 INFO scheduler.TaskSetManager: Finished task 0.0 in stage 10.0 (TID 14) in 5813 ms on 192.168.80.128 (1/2) 16/09/27 10:08:43 INFO scheduler.DAGScheduler: ResultStage 10 (saveAsTextFile at <console>:28) finished in 7.719 s 16/09/27 10:08:43 INFO scheduler.DAGScheduler: Job 5 finished: saveAsTextFile at <console>:28, took 8.348232 s 16/09/27 10:08:43 INFO scheduler.TaskSetManager: Finished task 1.0 in stage 10.0 (TID 15) in 2045 ms on 192.168.80.128 (2/2) 16/09/27 10:08:43 INFO scheduler.TaskSchedulerImpl: Removed TaskSet 10.0, whose tasks have all completed, from pool scala> hdfs命令行查询: part-0000: spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$bin/hadoop fs -text /soGouQSortedResult.txt/part-00000 hdfs命令行查询: part-0000: spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$bin/hadoop fs -text /soGouQSortedResult.txt/part-00001 我们通过hadoop命令把上述两个文件的内容合并起来: spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$bin/hadoop fs -getmerge hdfs://SparkSingleNode:9000/soGouQSortedResult.txt combinedSortedResult.txt //注意,第二个参数,是本地文件的目录 spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ bin/hadoop fs -ls / Found 6 items -rw-r--r-- 1 spark supergroup 3593 2016-09-18 10:15 /README.md -rw-r--r-- 1 spark supergroup 216118 2016-09-27 09:17 /SogouQ.mini drwxr-xr-x - spark supergroup 0 2016-09-26 21:17 /result drwxr-xr-x - spark supergroup 0 2016-09-26 21:49 /resultDescSorted drwxr-xr-x - spark supergroup 0 2016-09-27 10:08 /soGouQSortedResult.txt drwx-wx-wx - spark supergroup 0 2016-09-09 16:28 /tmp spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ ls bin etc libexec NOTICE.txt share combinedSortedResult.txt include LICENSE.txt README.txt tmp dfs lib logs sbin spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ 或者 spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$bin/hdfs dfs -getmerge hdfs://SparkSingleNode:9000/soGouQSortedResult.txt combinedSortedResult.txt //两者是等价的 spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ ls bin etc lib LICENSE.txt NOTICE.txt sbin tmp dfs include libexec logs README.txt share spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ cd bin spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0/bin$ ls container-executor hdfs mapred.cmd yarn hadoop hdfs.cmd rcc yarn.cmd hadoop.cmd mapred test-container-executor spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0/bin$ cd hdfs bash: cd: hdfs: Not a directory spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0/bin$ cd .. spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ bin/hdfs dfs -getmerge hdfs://SparkSingleNode:9000/soGouQSortedResult.txt combinedSortedResult.txt spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ ls bin etc libexec NOTICE.txt share combinedSortedResult.txt include LICENSE.txt README.txt tmp dfs lib logs sbin spark@SparkSingleNode:/usr/local/hadoop/hadoop-2.6.0$ 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5911131.html,如需转载请自行联系原作者

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

《Android App开发入门:使用Android Studio 2.X开发环境》——2-8 修改项目的程序包名称和应用程序 ID

2-8 修改项目的程序包名称和应用程序 ID 如果用户将第 2-5 节的 Ch02_Button 范例部署到手机上执行,然后又把第 2-6 节的范例 Ch02_EditText 部署到手机上执行,会发现手机的应用程序列表中只有 Ch02_ExitText,却没有 Ch02_Button。 在第1章曾经提过,程序包名称是 Android App 在手机上的身份证 ID,而 Ch02_ExitText 项目是从 Ch02_Button 复制而来的,它们的程序包名称相同(?ag.com.ch02_button),因此后来部署到手机上的 Ch02_ExitText 会覆盖掉之前的 Ch02_Button。 其实在 Android Studio 的项目中,有 3 个地方和程序包名称有关。 Java 类程序的程序包名称 所有的 Java 程序(如

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

Python爬虫入门教程 62-100 30岁了,想找点文献提高自己,还被反爬了,Python搞起,反爬第2篇

学术搜索 学习理论的知识少不了去检索文献,好多文献为你的实操提供了合理的支撑,我所在的大学内网默认是有知网账户的,非常NICE 今天要完成的网站是 http://ac.scmor.com/ Google学术搜索是一个文献检索服务,目前主要是提供维普资讯、万方数据等几个学术文献资源库的检索服务。通过Google学术搜索只能够查找到这些学术资料的“报告、摘要及引用内容... 来源百度百科 我们的目标 获取现在访问的链接地址,当你使用谷歌浏览器的开发者工具抓取的时候,得到的是一个js加密函数 注意看上图2的位置,接下来,我们采用上篇博客的方式,去尝试获取visit函数的具体内容 我们要在所有的请求链接中去检索一个visit方法,注意步骤 双击方法名,进入 找到核心方法 function visit(url) { var newTab = wind

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

Python爬虫入门教程 51-100 Python3爬虫通过m3u8文件下载ts视频-Python爬虫6操作

什么是m3u8文件 M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。 原视频数据分割为很多个TS流,每个TS流的地址记录在m3u8文件列表中 比如我这里有一个m3u8文件,文件内容如下 #EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:15 #EXTINF:6.916667, out000.ts #EXTINF:10.416667, out001.ts #EXTINF:10.416667, out002.ts #EXTINF:1.375000, out003.ts #EXTIN

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

车联网上云最佳实践(一):车联网行业特性致使新的应用架构必须满足快速增长的用户量和爆发式的流量访问

前言:阿里云总监系列课重磅上线!聚焦人工智能、弹性计算、数据库等热门领域,首次集齐12位阿里云技术高管,耗时半年精心打磨,从理论到实践倾囊相授,从零开始绘制技术大牛成长路径,限时直播课程免费报名中!每个人都是未来的技术大牛! 正文: 最近两年车联网发展受到政府部门、科研院以及各大互联网巨头的广泛关注和积极推动。从应用来看,主要包括两种模式:一是前装模式(即车辆出厂前安装),是乘用车厂主导或者与有相关能力的公司合作,例如上汽和阿里巴巴的合作。另一种就是后装模式(通常是将车机设备安装在汽车的OBD接口上例如各类汽车盒子等等。原理是利用智能终端(即车机)采集汽车OBD接口CAN总线上的所有原始数据进行诊断,数据分析,记录行车信息,并将数据解析出其具体意义(汽车内部电控系统的各项传感器数值)后通过串口输出,供用户读取、解析、开发等使用。将读取

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

20、 Python快速开发分布式搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scr...

编写spiders爬虫文件循环抓取内容 Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数, 参数: url='url' callback=页面处理函数 使用时需要yield Request() parse.urljoin()方法,是urllib库下的方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接 #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest#导入url返回给下载器的方法 fromurllibimportparse#导入urllib库里的parse模块 classPachSpider(scrapy.Spider): name='pach' allowed_domains=['blog.jobbole.com']#起始域名 start_urls=['http://blog.jobbole.com/all-posts/']#起始url defparse(self,response): """ 获取列表页的文章url地址,交给下载器 """ #获取当前页文章url lb_url=response.xpath('//a[@class="archive-title"]/@href').extract()#获取文章列表url foriinlb_url: #print(parse.urljoin(response.url,i))#urllib库里的parse模块的urljoin()方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接 yieldRequest(url=parse.urljoin(response.url,i),callback=self.parse_wzhang)#将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环 x_lb_url=response.xpath('//a[@class="nextpage-numbers"]/@href').extract()#获取下一页文章列表url ifx_lb_url: yieldRequest(url=parse.urljoin(response.url,x_lb_url[0]),callback=self.parse)#获取到下一页url返回给下载器,回调给parse函数循环进行 defparse_wzhang(self,response): title=response.xpath('//div[@class="entry-header"]/h1/text()').extract()#获取文章标题 print(title) Request()函数在返回url时,同时可以通过meta属性返回一个自定义字典给回调函数 #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest#导入url返回给下载器的方法 fromurllibimportparse#导入urllib库里的parse模块 fromadc.itemsimportAdcItem#导入items数据接收模块的接收类 classPachSpider(scrapy.Spider): name='pach' allowed_domains=['blog.jobbole.com']#起始域名 start_urls=['http://blog.jobbole.com/all-posts/']#起始url defparse(self,response): """ 获取列表页的文章url地址,交给下载器 """ #获取当前页文章url lb=response.css('div.post.floated-thumb')#获取文章列表区块,css选择器 #print(lb) foriinlb: lb_url=i.css('.archive-title::attr(href)').extract_first('')#获取区块里文章url #print(lb_url) lb_img=i.css('.post-thumbimg::attr(src)').extract_first('')#获取区块里文章缩略图 #print(lb_img) yieldRequest(url=parse.urljoin(response.url,lb_url),meta={'lb_img':parse.urljoin(response.url,lb_img)},callback=self.parse_wzhang)#将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环 x_lb_url=response.css('.next.page-numbers::attr(href)').extract_first('')#获取下一页文章列表url ifx_lb_url: yieldRequest(url=parse.urljoin(response.url,x_lb_url),callback=self.parse)#获取到下一页url返回给下载器,回调给parse函数循环进行 defparse_wzhang(self,response): title=response.css('.entry-headerh1::text').extract()#获取文章标题 #print(title) tp_img=response.meta.get('lb_img','')#接收meta传过来的值,用get获取防止出错 #print(tp_img) shjjsh=AdcItem()#实例化数据接收类 shjjsh['title']=title#将数据传输给items接收模块的指定类 shjjsh['img']=tp_img yieldshjjsh#将接收对象返回给pipelines.py处理模块 * Scrapy内置图片下载器使用 Scrapy给我们内置了一个图片下载器在crapy.pipelines.images.ImagesPipeline,专门用于将爬虫抓取到图片url后将图片下载到本地 第一步、爬虫抓取图片URL地址后,填充到items.py文件的容器函数 爬虫文件 #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest#导入url返回给下载器的方法 fromurllibimportparse#导入urllib库里的parse模块 fromadc.itemsimportAdcItem#导入items数据接收模块的接收类 classPachSpider(scrapy.Spider): name='pach' allowed_domains=['blog.jobbole.com']#起始域名 start_urls=['http://blog.jobbole.com/all-posts/']#起始url defparse(self,response): """ 获取列表页的文章url地址,交给下载器 """ #获取当前页文章url lb=response.css('div.post.floated-thumb')#获取文章列表区块,css选择器 #print(lb) foriinlb: lb_url=i.css('.archive-title::attr(href)').extract_first('')#获取区块里文章url #print(lb_url) lb_img=i.css('.post-thumbimg::attr(src)').extract_first('')#获取区块里文章缩略图 #print(lb_img) yieldRequest(url=parse.urljoin(response.url,lb_url),meta={'lb_img':parse.urljoin(response.url,lb_img)},callback=self.parse_wzhang)#将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环 x_lb_url=response.css('.next.page-numbers::attr(href)').extract_first('')#获取下一页文章列表url ifx_lb_url: yieldRequest(url=parse.urljoin(response.url,x_lb_url),callback=self.parse)#获取到下一页url返回给下载器,回调给parse函数循环进行 defparse_wzhang(self,response): title=response.css('.entry-headerh1::text').extract()#获取文章标题 #print(title) tp_img=response.meta.get('lb_img','')#接收meta传过来的值,用get获取防止出错 #print(tp_img) shjjsh=AdcItem()#实例化数据接收类 shjjsh['title']=title#将数据传输给items接收模块的指定类 shjjsh['img']=[tp_img] yieldshjjsh#将接收对象返回给pipelines.py处理模块 第二步、设置items.py文件的容器函数,接收爬虫获取到的数据填充 #-*-coding:utf-8-*- #Defineherethemodelsforyourscrapeditems # #Seedocumentationin: #http://doc.scrapy.org/en/latest/topics/items.html importscrapy #items.py,文件是专门用于,接收爬虫获取到的数据信息的,就相当于是容器文件 classAdcItem(scrapy.Item):#设置爬虫获取到的信息容器类 title=scrapy.Field()#接收爬虫获取到的title信息 img=scrapy.Field()#接收缩略图 img_tplj=scrapy.Field()#图片保存路径 第三步、在pipelines.py使用crapy内置的图片下载器 1、首先引入内置图片下载器 2、自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类 3、使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径 4、在settings.py设置文件里,注册自定义图片下载器类,和设置图片保存路径 #-*-coding:utf-8-*- #Defineyouritempipelineshere # #Don'tforgettoaddyourpipelinetotheITEM_PIPELINESsetting #See:http://doc.scrapy.org/en/latest/topics/item-pipeline.html fromscrapy.pipelines.imagesimportImagesPipeline#导入图片下载器模块 classAdcPipeline(object):#定义数据处理类,必须继承object defprocess_item(self,item,spider):#process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yielditem来的数据对象 print('文章标题是:'+item['title'][0]) print('文章缩略图url是:'+item['img'][0]) print('文章缩略图保存路径是:'+item['img_tplj'])#接收图片下载器填充的,图片下载后的路径 returnitem classimgPipeline(ImagesPipeline):#自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类 defitem_completed(self,results,item,info):#使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径 forok,valueinresults: img_lj=value['path']#接收图片保存路径 #print(ok) item['img_tplj']=img_lj#将图片保存路径填充到items.py里的字段里 returnitem#将item给items.py文件的容器函数 #注意:自定义图片下载器设置好后,需要在 在settings.py设置文件里,注册自定义图片下载器类,和设置图片保存路径 IMAGES_URLS_FIELD设置要下载图片的url地址,一般设置的items.py里接收的字段IMAGES_STORE设置图片保存路径 #Configureitempipelines #Seehttp://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES={ 'adc.pipelines.AdcPipeline':300,#注册adc.pipelines.AdcPipeline类,后面一个数字参数表示执行等级, 'adc.pipelines.imgPipeline':1,#注册自定义图片下载器,数值越小,越优先执行 } IMAGES_URLS_FIELD='img'#设置要下载图片的url字段,就是图片在items.py里的字段里 lujin=os.path.abspath(os.path.dirname(__file__)) IMAGES_STORE=os.path.join(lujin,'img')#设置图片保存路径 【转载自:http://www.lqkweb.com】

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

【分布式与虚拟化技术入门】分布式架构、分布式计算、分布式数据库、分布式存储、虚拟化技术

本文从阿里云大学课程中精选出分布式与虚拟化相关的课程,希望能够为你的云计算学习之路带来一些帮助。 1. 企业级互联网分布式系统应用架构学习 免费课程:https://edu.aliyun.com/course/33 本课程主要讲解当前网络环境下互联网应用架构设计,课程针对阿里云平台所提供的分步式系统架构支持来分层说明如何搭建一个高可用的应用架构。 **2. 分布式计算技术与实现**免费课程:https://edu.aliyun.com/course/39 本课程针对大数据分步式计算中的相关技术进行讲解,核心讲解流式计算和内存计算技术,阐述阿里云在处理这些功能时所使用的技术,并对阿里在这里的技术优化方式进行了详细的讲解。 3. 分布式数据库技术与实现 免费课程:https://edu.aliyun.com/course/37 本课程主要讲解分步式数

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

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文件系统,支持十年生命周期更新。

用户登录
用户注册