加拿大pc蛋蛋预测 > 游戏吧 >

Python爬虫实战入门五:获取JS动态内容爬取今日头条

编辑:凯恩/2018-10-11 13:23

  (XHR是Ajax中的概念,表示XMLHTTPrequest)

  然后我们发现少了很多链接,随便点开一个看看:

  我们选择city,预览中有一串json数据:

  我们再点开看看:

  原来全都是城市的列表,应该是加载地区新闻之用的。

  现在大概了解了怎么找JS请求的接口的吧?但是刚刚我们并没有发现想要的新闻,再找找看:

  有一个focus,我们点开看看:

  与首页的图片新闻呈现的数据是一样的,那么数据应该就在这里面了。

  看看其他的链接:

  F12打开网页调试工具

  这应该是热搜关键词

  凤凰娱乐(fh643.com)这个就是图片新闻下面的新闻了。

  我们打开一个接口链接看看:

  返回一串乱码,但从响应中查看的是正常的编码数据:

  查看源码,却是这样的:

  浏览器呈现的网页是这样的:

  有了对应的数据接口,我们就可以仿照之前的方法对数据接口进行请求和获取响应了

  2、请求和解析数据接口数据

  HTML源码

  先上完整代码:

  #coding:utf-8

  importrequests

  importjson

  网页的新闻在HTML源码中一条都找不到,全是由JS动态生成加载。

  url='http://www.toutiao.com/api/pc/focus/'

  wbdata=requests.get(url).text

  遇到这种情况,我们应该如何对网页进行爬取呢?有两种方法:

  data=json.loads(wbdata)

  news=data['data']['pc_feed_focus']

  forninnews:

  title=n['title']

  img_url=n['image_url']

  就以今日头条为例来演示:

  凤凰彩票(fh643.com)网页调试工具

  url=n['media_url']

  print(url,title,img_url)

  返回出来的结果如下:

  照例,稍微讲解一下代码:

  代码分为四部分,

  第一部分:引入相关的库

  #coding:utf-8

  importrequests

  importjson

  第二部分:对数据接口进行http请求

  url='http://www.toutiao.com/api/pc/focus/'

  wbdata=requests.get(url).text

  第三部分:对HTTP响应的数据JSON化,并索引到新闻数据的位置

  data=json.loads(wbdata)

  news=data['data']['pc_feed_focus']

  第四部分:对索引出来的JSON数据进行遍历和提取

  forninnews:

  即使网页内容是由JS动态生成加载的,JS也需要对某个接口进行调用,并根据接口返回的JSON数据再进行加载和渲染。

  title=n['title']

  1、从网页响应中找到JS脚本返回的JSON数据;2、使用Selenium对网页进行模拟访问

  img_url=n['image_url']

  url=n['media_url']

  print(url,title,img_url)

  如此,就完成了从JS网页中爬取数据。

  文末知识点摘要:一个鲜为人知的Python的For语句小技巧不论哪种语言,循环都是重要的组成部分,同样的,For循环也是Python中相当重要的组成。不过很多初学者可能对他们了解不够深入,让我们来一一介绍一下For的进阶技巧。

  一、从网页响应中找到JS脚本返回的JSON数据

  让我们从大家都知道的开始。我们肯定知道它的这种简单的用法:

  fruits=['apple','banana','mango']

  forfruitinfruits:

  print(fruit.capitalize())

  #Output:Apple

  #Banana

  #Mango

  这是非常基础的循环结构。现在我们来点鲜为人知的技巧,看看Python的For能起什么幺蛾子。

  今日头条

  else

  For循环还有个else语句,但是很多时候我们不怎么用,对它不甚了解。当循环正常的结束时else可以执行。这意味着循环没有受到任何break,一旦你明白如何使用它们,这个技巧将会变得非常有用,我在很久之后才完全掌握,现在简直离不开。

  常见的结构就是运行个循环然后寻找一个item。如果item被找到了,我们使用break来中断循环。有两种情况可能会导致循环被中断:

  item被找到然后break循环结束现在我们可能想知道什么原因导致循环结束:

  一种方法是设一个flag每次循环结束check一下。另一种方法是使用else语句。这是基础的for/else结构循环:

  foritemincontainer:

  ifsearch_something(item):

  #Foundit!

  有一些网站的内容由前端的JS动态生成,由于呈现在网页上的内容是由JS生成而来,我们能够在浏览器上看得到,但是在HTML源码中却发现不了。比如今日头条:

  所以我们可以找到JS调用的数据接口,从数据接口中找到网页中最后呈现的数据。

  process(item)

  选择“网络”选项卡后,发现有很多响应,我们筛选一下,只看XHR响应。

  break

  else:

  #Didn'tfindanything..

  not_found_in_container()

  在此只对第一种方法作介绍,关于Selenium的使用,后面有专门的一篇。

  这是官方文档的简单example:

  forninrange(2,10):

  forxinrange(2,n):

  之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能找到看到的数据和内容,然而并不是所有的网页都是这样的。

  ifn%x==0:

  print(n,'equals',x,'*',n/x)

  break

  现在我们可以试试刚才说到的else,这会很有趣,如果有素数它会告诉我们:

  forninrange(2,10):

  1、从找到JS请求的数据接口

  forxinrange(2,n):

  ifn%x==0:

  print(n,'equals',x,'*',n/x)

  break

  else:

  #loopfellthroughwithoutfindingafactor

  print(n,'isaprimenumber')

  今天的文章分享到此结束,希望本次分享对正在学习Python的你有所帮助,本篇文章来源博客:Z州的先生,如有侵权,请联系删除。

  我做开发几年的时间,如果大家对于学习Python的学习方法,学习路线以及你不知道的疑问,都可以随时来问我,大家凤凰娱乐(fh643.com)可以加我的学习蜜圈,圈内有开发工具和教程。

  关注我的头条号,然后私信给我“Python”会自动回复你相关资源地址。

  这里有为你准备Python零基础的系列完整教程,点击左侧了解更多即可观看。