当前位置: 首页 > news >正文

湖南微网站开发郑州做网站公司哪家好

湖南微网站开发,郑州做网站公司哪家好,定制网站和模板建站,合肥网站建设找佳达文章目录 前言项目#xff1a;寻找周杰伦分析过程代码实现重新分析过程什么是NetworkNetwork怎么用什么是XHR#xff1f;XHR怎么请求#xff1f;json是什么#xff1f;json数据如何解析#xff1f;实操#xff1a;完成代码实现 一个总结一个复习 前言 这关让我们一起来寻… 文章目录 前言项目寻找周杰伦分析过程代码实现重新分析过程什么是NetworkNetwork怎么用什么是XHRXHR怎么请求json是什么json数据如何解析实操完成代码实现 一个总结一个复习 前言 这关让我们一起来寻找周杰伦如果你已经满怀期待。那么毫无疑问你和我一样都非常喜欢他的音乐。 当然还要有复习。在上一关我们使用两种方式爬取了热门菜谱清单内含菜名、原材料、详细烹饪流程的URL。代码如下 # 引用requests库 import requests # 引用BeautifulSoup库 from bs4 import BeautifulSoup# 获取数据 res_foods requests.get(http://www.xiachufang.com/explore/) # 解析数据 bs_foods BeautifulSoup(res_foods.text,html.parser)# 查找包含菜名和URL的p标签 tag_name bs_foods.find_all(p,class_name) # 查找包含食材的p标签 tag_ingredients bs_foods.find_all(p,class_ing ellipsis) # 创建一个空列表用于存储信息 list_all [] # 启动一个循环次数等于菜名的数量 for x in range(len(tag_name)):# 提取信息封装为列表。此处[18:-14]切片的主要功能是切掉空格list_food [tag_name[x].text[18:-14],tag_name[x].find(a)[href],tag_ingredients[x].text[1:-1]]# 将信息添加进list_alllist_all.append(list_food)# 打印 print(list_all)# 以下是另外一种解法# 查找最小父级标签 list_foods bs_foods.find_all(div,class_info pure-u) # 创建一个空列表用于存储信息 list_all []for food in list_foods:# 提取第0个父级标签中的a标签tag_a food.find(a)# 菜名使用[17:-13]切掉了多余的信息name tag_a.text[17:-13]# 获取URLURL http://www.xiachufang.comtag_a[href]# 提取第0个父级标签中的p标签tag_p food.find(p,class_ing ellipsis)# 食材使用[1:-1]切掉了多余的信息ingredients tag_p.text[1:-1]# 将菜名、URL、食材封装为列表添加进list_alllist_all.append([name,URL,ingredients])# 打印 print(list_all)将想要的数据分别提取再组合是一种不错的思路。但是如果数据的数量对不上就会让事情比较棘手。比如在我们的案例里如果一个菜有多个做法其数量也没规律那么菜名和URL的数量就会对不上。 寻找最小共同父级标签是一种很常见的提取数据思路它能有效规避这个问题。但有时候可能需要你反复操作提取数据。 所以在实际项目实操中需要根据情况灵活选择灵活组合。我们本关卡所做的项目只是刚刚好两种方式都可以爬取。 text获取到的是该标签内的纯文本信息即便是在它的子标签内也能拿得到。但提取属性的值只能提取该标签本身的。 from bs4 import BeautifulSoupbs BeautifulSoup(pa惟有痴情难学佛/a独无媚骨不如人/p,html.parser) tag bs.find(p) print(tag.text)在爬虫实践当中其实常常会因为标签选取不当或者网页本身的编写没做好板块区分你可能会多提取到出一些奇怪的东西。 当遇到这种糟糕的情况一般有两种处理方案数量太多而无规律我们会换个标签提取数量不多而有规律我们会对提取的结果进行筛选——只要列表中的若干个元素就好。 项目寻找周杰伦 就像标题里描述的那样这是一个和周杰伦相关的关卡。我还记得自己年少时沉迷于收集他的专辑、歌单生怕有缺漏……在当时互联网不像今天这样普及做这事可一点都不容易——你必须和小镇上卖CD的老板打成一片。 但在今天我能借助爬虫非常轻松地满足自己的收藏癖。接下来我也会教给你怎么去做。这就是本关项目寻找周杰伦爬取周杰伦的歌曲清单。 我们会尝试用前几关的知识完成这个项目。很快你会发现事情仿佛不是那样简单。你需要一些新工具的帮助它们的名字叫NetworkXHRjson。稍后我会为你一一介绍。 分析过程 当接手一个新项目开发人员们并不会一上来就去写代码他们会先去思考这个项目应当如何实现。我们也是如此。 比方说我们要爬取周杰伦的歌单那么首先要思考的是哪家网站拥有周杰伦的歌曲版权 获取这个问题答案的方法有两种【1】自己上网搜【2】听我这个资深乐迷讲——答案是QQ音乐。 请你务必新建一个浏览器标签跟随我操作。首先我们先去QQ音乐的官网看看它的robots协议https://y.qq.com/robots.txt结果应如下 从robots协议看只是禁止了playlist相关的信息爬取问题不大放心去吧我们来进入QQ音乐的官网首页https://y.qq.com 接着在上图的搜索框内输入“周杰伦”然后点击回车。此时页面会发生跳转结果如下图所示 你能看到我们想要的歌曲信息就在这个页面里。这个页面它的网址会是 https://y.qq.com/portal/search.html#page1searchid1remoteplacetxt.yqq.toptsongw%E5%91%A8%E6%9D%B0%E4%BC%A6 剩下的事情就简单了根据我们已经学过的知识我们可以借助requests和BeautifulSoup来爬取想要的数据。它的过程大概会是这样 根据爬虫四步我们会利用requests.get()去请求该网址使用BeautifulSoup对请求结果进行解析利用find_all方法拿到我们想要的标签提取歌曲清单。 现在我们可以尝试写代码。 代码实现 根据前两关所学的知识如果不出意外我们的代码大概可以写成这幅模样 import requests from bs4 import BeautifulSoup# 请求html得到response res_music requests.get(https://y.qq.com/portal/search.html#page1searchid1remoteplacetxt.yqq.toptsongw%E5%91%A8%E6%9D%B0%E4%BC%A6) # 解析html bs_music BeautifulSoup(res_music.text,html.parser) # 查找class属性值为“js_song”的a标签得到一个由标签组成的列表 list_music bs_music.find_all(a,class_js_song) # 对查找的结果执行循环 for music in list_music:# 打印出我们想要的音乐名print(music[title])看上去仿佛没什么问题但其实这个代码是没办法工作的。你可以先试试看我再为你解释原因 程序运行的结果是什么都找不到……当我们写代码遇到这种情况我们首先要确认自己的代码是否有问题。 我们可以从下往上倒推着一步一步排查看提取是不是出错看解析是不是出错看请求是不是出错。现在我们先去print(list_music)看看它里面的值。请运行下方代码 import requests from bs4 import BeautifulSoup# 请求html得到response res_music requests.get(https://y.qq.com/portal/search.html#page1searchid1remoteplacetxt.yqq.toptsongw%E5%91%A8%E6%9D%B0%E4%BC%A6) # 解析html bs_music BeautifulSoup(res_music.text,html.parser) # 查找class属性值为“js_song”的a标签得到一个由标签组成的列表 list_music bs_music.find_all(a,class_js_song) # 打印它 print(list_music)运行结果 []list_music空无一物它是一个空列表。解析不太可能出问题因为就一行代码而且符合规范。难道说请求本身就错误了网页源代码中根本没有我们要找的歌曲名我们来print(res_music)。 import requests from bs4 import BeautifulSoup# 请求html得到response res_music requests.get(https://y.qq.com/portal/search.html#page1searchid1remoteplacetxt.yqq.toptsongw%E5%91%A8%E6%9D%B0%E4%BC%A6) # 打印它 print(res_music.text)运行结果太多了就不在这里展示了。 认真翻找它果然网页源代码里根本没有我们想要的歌曲清单。 事已至此已经验证不是代码本身的问题但目标却未能得到实现。我们就得往前回滚一步思考是不是上一步的分析出了问题 重新分析过程 网页源代码里没有我们想要的数据那它究竟藏到了哪里呢 想找到答案需要用到一项新技能——翻找Network下面我来一步步带你做。 什么是Network 我们先去看看Network的页面。在你刚才打开的QQ音乐页面调用“检查”ctrlshifti工具然后点击Network。 如上图左边框框里的是Elements我们在那里查看网页源代码。右边框框是我们现在要关注的Network。 Network的功能是记录在当前页面上发生的所有请求。现在看上去好像空空如也的样子这是因为Network记录的是实时网络请求。现在网页都已经加载完成所以不会有东西。 我们点击一下刷新浏览器会重新访问网络这样就会有记录。如下图 哗~密密麻麻地出来了许多在图最下面它告诉我们此处共有52个请求36.9kb的流量耗时2.73s完成。 这个正是我们的浏览器每时每刻工作的真相它总是在向服务器发起各式各样的请求。当这些请求完成它们会一起组成我们在Elements中看到的网页源代码。 为什么我们刚才没办法拿到歌曲清单呢答这是因为我们刚刚写的代码只是模拟了这52个请求中的一个准确来说就是第0个请求而这个请求里并不包含歌曲清单。 现在请挪动鼠标找到这个页面的第0个请求search.html然后点击它如下图我们来查看它的Response官方翻译叫“响应”你可以理解为服务器对浏览器这个请求的回应内容即请求的结果。 其实它就是我们刚刚用requests.get()获取到的网页源代码它里面不包含歌曲清单。 一般来说都是这种第0个请求先启动了其他的请求才会关联启动一点点地将网页给填充起来。做一个比喻第0个请求就好比是人的骨架确定了这个网页的结构。在此之后众多的请求接连涌入作为人的血脉经络。如此人就变好看。 当然啦也有一些网页直接把所有的关键信息都放在第0个请求里尤其是一些比较老或比较轻量的网站我们用requests和BeautifulSoup就能解决它们。比如我们体验过的“这个书苑不太冷”比如你看过的“人人都是蜘蛛侠”博客比如豆瓣。 总之为了成功抓取到歌曲清单。我们得先找到歌名藏在哪一个请求当中。再用requests库去模拟这个请求。 Network怎么用 想做这个我们需要先去了解下Network面板怎么用。回头看我们之前给的图 从上往下只看我圈起来的内容的话它有四行信息。下面我来为你介绍它。 第0行的左侧红色的圆钮是启用Network监控默认高亮打开灰色圆圈是清空面板上的信息。右侧勾选框Preserve log它的作用是“保留请求日志”。如果不点击这个当发生页面跳转的时候记录就会被清空。所以我们在爬取一些会发生跳转的网页时会点亮它。 第1行是对请求进行分类查看。我们最常用的是ALL查看全部/XHR仅查看XHR我们等会重点讲它/DocDocument第0个请求一般在这里有时候也会看看Img仅查看图片/Media仅查看媒体文件/Other其他。最后JS和CSS则是前端代码负责发起请求和页面实现Font是文字的字体而理解WS和Manifest需要网络编程的知识倘若不是专门做这个你不需要了解。 夹在第2行和第1行中间的是一个时间轴。记录什么时间有哪些请求。而第2行就是各个请求你可以看下面这张表来理解读但不需要记忆。 在第3行我们讲过了是个统计有多少个请求一共多大花了多长时间。 什么是XHR 在Network中有一类非常重要的请求叫做XHR当你把鼠标在XHR上悬停你可以看到它的完整表述是XHR and Fetch未来我们几乎每一关都要和它打交道。下面我来为你重点介绍它。 我们平时使用浏览器上网的时候经常有这样的情况浏览器上方它所访问的网址没变但是网页里却新加了内容。 典型代表如购物网站下滑自动加载出更多商品。在线翻译网站输入中文实时变英文。比如你正在使用的教学系统每点击一次Enter就有新的内容弹出。 这个叫做Ajax技术技术本身和爬虫关系不大在此不做展开你可以通过搜索了解。应用这种技术好处是显而易见的——更新网页内容而不用重新加载整个网页。又省流量又省时间的何乐而不为。 如今比较新潮的网站都在使用这种技术来实现数据传输。只剩下一些特别老或是特别轻量的网站还在用老办法——加载新的内容必须要跳转一个新网址。 这种技术在工作的时候会创建一个XHR或是Fetch对象然后利用XHR对象来实现服务器和浏览器之间传输数据。在这里XHR和Fetch并没有本质区别只是Fetch出现得比XHR更晚一些所以对一些开发人员来说会更好用但作用都是一样的。 XHR怎么请求 显而易见对照前面的表单。我们的歌曲清单不在网页源代码里而且也不是图片不是媒体文件自然只会是在XHR里。我们现在去找找看点击XHR按钮。 这个网页里一共有14个XHR或Fetch我们要从里面找出带有歌单的那一个。 笨办法当然是一个一个实验但聪明的办法是去尝试阅读它们的名字。比如你一眼就看到client_search客户端搜索……而且它最大有10.9KB我们来点击它。 出现了如上图这样的一个窗口我们先来看右上方框里标号的内容从左往右分别是Headers标头请求信息、Preview预览、Response响应、CookiesCookies、Timing时间。 点击Preview你能在里面发现我们想要的信息歌名就藏在里面只是有点难找需要你一层一层展开data-song-list-0-name然后就能看到“告白气球” 那如何把这些歌曲名拿到呢这就需要我们去看看最左侧的Headers点击它。如下所示它被分为四个板块。 我们把后面的三个留待后续关卡详细解释。今天你只是看看它们就好然后将注意力放在第0个General上面。点开它你会看到 看到了吗General里的Requests URL就是我们应该去访问的链接。如果在浏览器中打开这个链接你会看到一个让人绝望的结构最外层是一个字典然后里面又是字典往里面又有列表和字典…… 它就和你在Response里看到的一个样。还是放弃挣扎吧回到原网址直接用Preview来看就好。列表和字典在此都会有非常清晰的结构层层展开。 如上我们一层一层地点开按照这样的顺序data-song-list-0-name看到 歌曲名就在这里它的键是name。理解这句话这个XHR是一个字典键data对应的值也是一个字典在该字典里键song对应的值也是一个字典在该字典里键list对应的值是一个列表在该列表里一共有10个元素每一个元素都是一个字典在每个字典里键name的值对应的是歌曲名。 此刻的你有了一个大胆的想法利用requests.get()访问这个链接把这个字典下载到本地。然后去一层一层地读取拿到歌曲名。 到此我们的代码可以写成这样你可以尝试运行看看 # 引用requests库 import requests # 调用get方法下载这个字典 res requests.get(https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct24qqmusic_ver1298new_json1remoteplacetxt.yqq.songsearchid60997426243444153t0aggr1cr1catZhida1lossless0flag_qc0p1n20w%E5%91%A8%E6%9D%B0%E4%BC%A6g_tk5381loginUin0hostUin0formatjsoninCharsetutf8outCharsetutf-8notice0platformyqq.jsonneedNewCode0) # 把它打印出来 print(res.text) 打印结果节选 {alert:41,icons:12861308,msg:13,switch:17405185},album:{id:20612,mid:003DFRzD192KKD,name:七里香,pmid:003DFRzD192KKD_1,subtitle:,title:七里香,title_hilight:七里香},chinesesinger:0,desc:,desc_hilight:,docid:13932817310379068326,es:,file:{b_30s:78000,e_30s:138000,media_mid:003RCeQW4JBZi3,size_128:4090342,size_128mp3:4090342,size_320:10225565,size_320mp3:10225565,size_aac:6167826,size_ape:0,size_dts:0,size_flac:29345075,size_ogg:5645289,size_try:960887,strMediaMid:003RCeQW4JBZi3,try_begin:78121,try_end:111898},fnote:4009,genre:1,grp:[],id:102065753,index_album:9,index_cd:0,interval:255,isonly:1,ksong:{id:10123,mid:002G5b020DXADc},language:0,lyric:,lyric_hilight:,mid:003nEQHr3Ceet5,mv:{id:55236,vid:n0013xat9z2},name:园游会,newStatus:2,nt:2563665896,ov:0,pay:{pay_down:1,pay_month:1,pay_play:1,pay_status:0,price_album:0,price_track:200,time_free:0},pure:0,sa:0,singer:[{id:4558,mid:0025NhlN2yWrP4,name:周杰伦,title:周杰伦,title_hilight:em周杰伦/em,type:0,uin:0}],status:0,subtitle:,t:1,tag:11,tid:0,time_public:2004-08-03,title:园游会,title_hilight:园游会,type:0,url:http://stream10.qqmusic.qq.com/102065753.wma,ver:0,volume:{gain:-9.623000144958496,lra:2.069000005722046,peak:1.0}}],totalnum:150},tab:0,taglist:[],totaltime:0,zhida:{type:1,zhida_singer:{albumNum:35,hotalbum:[{albumID:1458791,albumMID:003RMaRI1iFoYd,albumName:周杰伦的床边故事,albumname_hilight:周杰伦的床边故事},{albumID:33021,albumMID:002eFUFm2XYZ7z,albumName:我很忙,albumname_hilight:我很忙},{albumID:852856,albumMID:001uqejs3d6EID,albumName:哎呦不错哦,albumname_hilight:哎呦不错哦},{albumID:194021,albumMID:003Ow85E3pnoqi,albumName:十二新作,albumname_hilight:十二新作},{albumID:36062,albumMID:002Neh8l0uciQZ,albumName:魔杰座,albumname_hilight:魔杰座},{albumID:8218,albumMID:000f01724fd7TH,albumName:Jay,albumname_hilight:Jay},{albumID:56705,albumMID:000bviBl4FjTpO,albumName:跨时代,albumname_hilight:跨时代},{albumID:60671,albumMID:0024bjiL2aocxT,albumName:十一月的萧邦,albumname_hilight:十一月的萧邦},{albumID:8220,albumMID:000MkMni19ClKG,albumName:叶惠美,albumname_hilight:叶惠美},{albumID:8217,albumMID:000I5jJB3blWeN,albumName:范特西,albumname_hilight:范特西}],hotsong:[{f:97773|晴天|4558|周杰伦|8220|叶惠美|0|269|-1|1|0|10792516|4317292|0|0|0|31430142|5864688|6528081|0|0039MnYb0qxYhV|0025NhlN2yWrP4|000MkMni19ClKG|0|4009,songID:97773,songMID:0039MnYb0qxYhV,songName:晴天,songname_hilight:晴天},{f:449201|兰亭序|4558|周杰伦|36062|魔杰座|0|253|-1|1|0|10160781|4064429|0|0|0|28309022|5544577|6133907|0|00128N3r2SYKMF|0025NhlN2yWrP4|002Neh8l0uciQZ|0|4009,songID:449201,songMID:00128N3r2SYKMF,songName:兰亭序,songname_hilight:兰亭序},{f:449198|花海|4558|周杰伦|36062|魔杰座|0|264|-1|1|0|10586772|4234954|0|0|0|29128486|5624534|6401459|0|003cI52o4daJJL|0025NhlN2yWrP4|002Neh8l0uciQZ|0|4009,songID:449198,songMID:003cI52o4daJJL,songName:花海,songname_hilight:花海},{f:102065756|七里香|4558|周杰伦|20612|七里香|0|299|-1|1|0|11970297|4788294|0|0|0|35845646|7078399|7214942|0|004Z8Ihr0JIu5s|0025NhlN2yWrP4|003DFRzD192KKD|0|4009,songID:102065756,songMID:004Z8Ihr0JIu5s,songName:七里香,songname_hilight:七里香},{f:718477|夜曲|4558|周杰伦|60671|十一月的萧邦|0|226|-1|1|0|9075745|3630591|0|0|0|26691277|5600056|5499068|0|001zMQr71F1Qo8|0025NhlN2yWrP4|0024bjiL2aocxT|0|4009,songID:718477,songMID:001zMQr71F1Qo8,songName:夜曲,songname_hilight:夜曲},{f:5105986|一路向北|4558|周杰伦|14311|J III MP3 Player|0|295|-1|1|0|11830556|4732355|0|0|0|35323866|6667274|7159409|0|001xd0HI0X9GNq|0025NhlN2yWrP4|002MAeob3zLXwZ|0|4009,songID:5105986,songMID:001xd0HI0X9GNq,songName:一路向北,songname_hilight:一路向北},{f:449205|稻香|4558|周杰伦|36062|魔杰座|0|223|-1|1|0|8941053|3576668|0|0|0|26012257|5136737|5431599|0|003aAYrm3GE0Ac|0025NhlN2yWrP4|002Neh8l0uciQZ|0|4009,songID:449205,songMID:003aAYrm3GE0Ac,songName:稻香,songname_hilight:稻香},{f:101091484|给我一首歌的时间|4558|周杰伦|36062|魔杰座|0|253|-1|1|0|10144968|4058169|0|0|0|31541730|6063552|6137781|0|004BhQke4adHcf|0025NhlN2yWrP4|002Neh8l0uciQZ|0|4009,songID:101091484,songMID:004BhQke4adHcf,songName:给我一首歌的时间,songname_hilight:给我一首歌的时间},{f:107192078|告白气球|4558|周杰伦|1458791|周杰伦的床边故事|0|215|-1|1|0|8608859|3443771|0|0|0|43845959|5007453|5180289|0|003OUlho2HcRHC|0025NhlN2yWrP4|003RMaRI1iFoYd|0|4009,songID:107192078,songMID:003OUlho2HcRHC,songName:告白气球,songname_hilight:告白气球},{f:102065750|搁浅|4558|周杰伦|20612|七里香|0|240|-1|1|0|9607864|3843167|0|0|0|26174554|5218730|5785073|0|001Bbywq2gicae|0025NhlN2yWrP4|003DFRzD192KKD|0|4009,songID:102065750,songMID:001Bbywq2gicae,songName:搁浅,songname_hilight:搁浅}],mvNum:1346,singerID:4558,singerMID:0025NhlN2yWrP4,singerName:周杰伦,singerPic:http://y.gtimg.cn/music/photo_new/T001R150x150M0000025NhlN2yWrP4.jpg,singername_hilight:周杰伦,songNum:951}}},message:,notice:,subcode:0,time:1616422691,tips:}在这里我们又遇到一个障碍使用res.text取到的是字符串。它不是我们想要的列表/字典数据取不出来。老虎吃天没处下嘴。 json是什么 或许你会问老师我们已经学过如何把response对象转成字符串那有没有什么属性或者方法能把response对象转成列表/字典呢 办法自然有但我要先讲给你一个新的知识点——json。 json是什么呢粗暴地来解释json是一种数据交换的语法。对我们来说它只是一种规范数据传输的格式形式有点像字典和列表的结合体。 # 定义一个字典 a {name:刘备} # 定义一张列表 b [1,2,3,4] # 定义一个json c {forchange: [{ name:张飞 , gender:male}, { name:孙尚香 , gender:female}, { name:关羽 , gender:male},]}从它的组成上来看有花括弧、方括弧冒号和逗号一种字典和列表相互嵌套的体系。 这种特殊的写法决定了json能够有组织地存储信息。 我们在生活当中总是在接触林林总总的数据。如果它们直接以堆砌的形式出现在你面前你很难阅读它。比如想象一个乱序排布的字典一个堆满文件的电脑桌面一本不分段落章节的小说…… 数据需要被有规律地组织起来我们才能去查找、阅读、分析、理解。比如汉语字典应该按照拼音排序文件应该按照一定规律放进不同的文件夹小说要有章节目录——大标题、中标题、小标题。 可以发现组织数据的方式也有规律规律有三条 一般来说这三条占得越多数据的结构越清晰占得越少数据的结构越混沌。 生活如此网络之间的数据传输也是如此。在之前我们已经学习过html它通过标签、属性来实现分层和对应。 json则是另一种组织数据的格式长得和Python中的列表/字典非常相像。它和html一样常用来做网络数据传输。刚刚我们在XHR里查看到的列表/字典严格来说其实它不是列表/字典它是json。 或许你会有疑问那直接写成列表/字典不就好了为什么要把它表示成字符串答案很简单因为不是所有的编程语言都能读懂Python里的数据类型如列表/字典但是所有的编程语言都支持文本比如在Python中用字符串这种数据类型来表示文本这种最朴素的数据类型。 如此json数据才能实现跨平台跨语言工作。 而json和XHR之间的关系XHR用于传输数据它能传输很多种数据json是被传输的一种数据格式。就是这样而已。 我们总是可以将json格式的数据转换成正常的列表/字典也可以将列表/字典转换成json。 json数据如何解析 说回到我们的案例当我们请求得到了json数据应该如何读取呢我们可以在requests库的官方文档中找到答案。我们打开浏览器搜索“requests 官方文档”会来到这个界面 点开链接进入文档你会看到一个非常傲娇的作者。 使用浏览器的ctrlf功能在网页内搜索关键词json能够非常快捷地找到这里 点击进入你将看到requests库处理json数据的方法。 你看方法很简单请求到数据之后使用json()方法即可成功读取。接下来的操作就和列表/字典相一致。 下面来体验一下运行下方代码 # 引用requests库 import requests # 调用get方法下载这个字典 res_music requests.get(https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct24qqmusic_ver1298new_json1remoteplacetxt.yqq.songsearchid60997426243444153t0aggr1cr1catZhida1lossless0flag_qc0p1n20w%E5%91%A8%E6%9D%B0%E4%BC%A6g_tk5381loginUin0hostUin0formatjsoninCharsetutf8outCharsetutf-8notice0platformyqq.jsonneedNewCode0) # 使用json()方法将response对象转为列表/字典 json_music res_music.json() # 打印json_music的数据类型 print(type(json_music)) 运行结果 class dict实操完成代码实现 现在我们至少可以写代码提取出20个周杰伦的歌曲名。你可以尝试续写这个代码稍后我会提供参考答案。 参考代码 # 引用requests库 import requests # 调用get方法下载这个字典 res_music requests.get(https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct24qqmusic_ver1298new_json1remoteplacetxt.yqq.songsearchid60997426243444153t0aggr1cr1catZhida1lossless0flag_qc0p1n20w%E5%91%A8%E6%9D%B0%E4%BC%A6g_tk5381loginUin0hostUin0formatjsoninCharsetutf8outCharsetutf-8notice0platformyqq.jsonneedNewCode0) # 使用json()方法将response对象转为列表/字典 json_music res_music.json() # 一层一层地取字典获取歌单列表 list_music json_music[data][song][list] # list_music是一个列表music是它里面的元素 for music in list_music:# 以name为键查找歌曲名print(music[name])你应该能看到类似这样的结果反正我写这个教程的时候是这样不知道现在会不会变 成功撒花 就是这样一个代码它能拿到周杰伦在QQ音乐上前20个歌曲的名单。 事实上如果对这个程序稍加延展它就能拿到歌曲名、所属专辑、播放时长以及播放链接。因为这些信息都在那个XHR里认真观察分析如果有必要的话还可以配合翻译软件。最终你可以用同样的方法把它们提取出来。就像这样 # 引用requests库 import requests # 调用get方法下载这个字典 res_music requests.get(https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct24qqmusic_ver1298new_json1remoteplacetxt.yqq.songsearchid60997426243444153t0aggr1cr1catZhida1lossless0flag_qc0p1n20w%E5%91%A8%E6%9D%B0%E4%BC%A6g_tk5381loginUin0hostUin0formatjsoninCharsetutf8outCharsetutf-8notice0platformyqq.jsonneedNewCode0) # 使用json()方法将response对象转为列表/字典 json_music res_music.json() # 一层一层地取字典获取歌单列表 list_music json_music[data][song][list] # list_music是一个列表music是它里面的元素 for music in list_music:# 以name为键查找歌曲名print(music[name])# 查找专辑名print(所属专辑music[album][name])# 查找播放时长print(播放时长str(music[interval])秒)# 查找播放链接print(播放链接https://y.qq.com/n/yqq/song/music[mid].html\n\n)你也可以尝试在之前的基础上续写这个代码将歌曲名、所属专辑、播放时长以及播放链接自己给提取出来。 其中拿到歌曲链接这一步可能稍有难度。你可以先试试看如果写不出查看后续的参考代码。 参考代码 # 引用requests库 import requests # 调用get方法下载这个字典 res_music requests.get(https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct24qqmusic_ver1298new_json1remoteplacetxt.yqq.songsearchid60997426243444153t0aggr1cr1catZhida1lossless0flag_qc0p1n20w%E5%91%A8%E6%9D%B0%E4%BC%A6g_tk5381loginUin0hostUin0formatjsoninCharsetutf8outCharsetutf-8notice0platformyqq.jsonneedNewCode0) # 使用json()方法将response对象转为列表/字典 json_music res_music.json() # 一层一层地取字典获取歌单列表 list_music json_music[data][song][list] # list_music是一个列表music是它里面的元素 for music in list_music:# 以name为键查找歌曲名print(music[name])print(music[album][name])print(music[time_public])print(str(music[interval])秒)print(music[url])一个总结 截至当前我们已经部分完成了初定目标爬取周杰伦的歌曲清单。 为什么说部分一方面是我们只拿到20首歌曲的信息远不能满足一个狂热粉丝的需要。另一方面只拿到歌名/专辑/时长……这些数据还不够酷狂热粉丝还想拿到所有的歌词甚至还有歌曲的评论。 这会是一个浩荡的工程因为有相当量的数据要爬取。但拿到这些数据它就有了数据分析价值周杰伦的歌最常出现哪些关键词用户都在评论些什么内容他们都喜欢在什么时间听 同理你可以拿到任何一个歌手的这些信息。如果你是一个音乐行业的从业者那么它们将对于你产生价值。如果你不是那么这个爬虫技术可以帮助你在自己行业创造价值——换自己领域的网站去爬就好。 想拿到这么多数据你需要学习下一关的知识狂热粉丝——带参数请求数据。 拿到这么多数据想要有规律地存储你要学习第6关的知识爬到的数据存哪里——csvexcel文件 这么多的数据爬起来太慢想要对它进行加速怎么办你就需要学习11、12关的知识…… 如是种种学无止境说的就是这样一回事。但事情的最开始这所有一切的底层原理一定还是这寥寥几行代码。 截止到这一关你已经能够看懂绝大多数的网络数据请求组并且尝试用Python去模拟这些请求再往后都是基于此的延伸。 下面我们来总结下今日份的知识点。 一个复习 Network能够记录浏览器的所有请求。我们最常用的是ALL查看全部/XHR仅查看XHR/DocDocument第0个请求一般在这里有时候也会看看Img仅查看图片/Media仅查看媒体文件/Other其他。最后JS和CSS则是前端代码负责发起请求和页面实现Font是文字的字体而理解WS和Manifest需要网络编程的知识倘若不是专门做这个你不需要了解。 在Network有非常重要的一类请求是XHR或Fetch因为有它的存在人们不必刷新/跳转网页即可加载新的内容。随着技术发展XHR的应用频率越来越高我们常常需要在这里找我们想要的数据。 XHR的功能是传输数据其中有非常重要的一种数据是用json格式写成的和html一样这种数据能够有组织地存储大量内容。json的数据类型是“文本”在Python语言当中我们把它称为字符串。我们能够非常轻易地将json格式的数据转化为列表/字典也能将列表/字典转为json格式的数据。 如何解析json数据答案如下 而如果你想在Python语言中实现列表/字典转jsonjson转列表/字典则需要借助json模块。json模块不在我们的教学范围之内所以不做展开。你可阅读它的官方文档来了解地址在这里https://docs.python.org/3/library/json.html 一个简单的应用示例是这样 # 引入json模块 import json # 创建一个列表a a [1,2,3,4] # 使用dumps()函数将列表a转换为json格式的字符串赋值给b b json.dumps(a) # 打印b print(b) # 打印b的数据类型 print(type(b)) # 使用loads()函数将json格式的字符串b转为列表赋值给c c json.loads(b) # 打印c print(c) # 打印c的数据类型 print(type(c)) 从过程上来说呢我们先是制定一个目标爬取周杰伦的歌曲清单根据目标确认一个方案爬取QQ音乐带着方案去分析它的网站结构最后去写代码。 在写代码的过程当中我们会遇到困难如分析错了如json数据不知如何解析我们去学习新知识去网络上搜索官方文档找到解决方案最终完成项目。 我们今天做这样一个小项目是如此。程序员们在工作的时候其实也是这样解决问题根据目标找方案根据方案做执行执行遇到问题就去学习、搜索。 如此就没有解决不了的问题。 我们下一关见
http://wiki.neutronadmin.com/news/421585/

相关文章:

  • 专业行业网站建设建设银行 网站用户变成个人用户
  • 建筑公司网站能显示二级建造师报名吗创建公司要具备什么条件
  • 做网站要遵守的基本原则wordpress get author link
  • 建立网站目录结构时正确的建议是江门seo排名优化
  • 云服务器网站崩溃的原因花都五屏网站建设
  • wordpress页脚二维码网站优化软件排名
  • 什么网站做推广比较好网站建设人员工作职责
  • 广告型网站怎么做wordpress编辑模板标题
  • 免费建设网站和域名织梦cms侵权开庭
  • 网站建设需求分析调研调查表嘉兴网站开发
  • 河北网站优化wordpress教程 菜单
  • 市场营销网站网页设计与制作模块1课后答案
  • 湖南省住房城乡建设网站当当网网站开发计划和预算
  • 分销商城网站建设优化教程网下载
  • 哪个网站可以做图交易平台佛山网站优化美姿姿seo
  • 网上做网站怎么防止被骗权威发布公众号
  • 自己怎做网站后台seo优化软件
  • 企业网站建设开发一个人免费视频在线观看高清
  • 网站主关键词如何优化网站seo排名免费咨询
  • 开封市网站建设网站开发需求文档模板
  • 网站建设所需人员网络公司网站推广
  • 网站建设与维护合同263企业邮箱手机版登录
  • 1.86神华网站两学一做网站 多服务器
  • 如何在空白服务器上搭建网站wordpress 添加图片不显示
  • 浙江广厦建设职业技术学院招生网站如何在租用的服务器上部署自己的网站 mysql
  • 选网站建设要注意什么闵行做网站公司
  • 网站建设资金投入分析企业管理网站建设
  • 上海网站群建设上海闵行做网站的公司
  • 如何设置中国建设银行网站首页海南省建筑信息平台
  • 加油站网站建设怎么注册网店