通过前面几期Python爬虫的文章,不少童鞋已经可以随心所欲的爬取自己想要的数据,就算是一些页面很难分析,也可以用之前介绍的终极技能之「Selenium」+「Webdriver」解决相关问题,但无奈这种办法效率太慢,咋整?

今天就为大家介绍Ajax异步加载的数据的爬取。

↓↓↓

何为Ajax异步加载的数据呢?Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML。它不是一门编程语言,而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。对于传统的网页,如果想更新其内容,那么必须要刷新整个页面,但有了Ajax,便可以在页面不被全部刷新的情况下更新其内容。在这个过程中,页面实际上是在后台与服务器进行了数据交互,获取到数据之后,再利用JavaScript改变网页,这样网页内容就会更新了。

通俗来讲:就像一栋房子,先把框框架架搭起来(前端页面框架),再给他装修、置办家具(填充数据),这里的装修、置办家具即是ajax请求的数据。。

我们可以通过一些网站的事例来直观的了解一下什么到底是什么是ajax。

例如访问“蘑菇街”电商平台中的食品类目:http://list.mogujie.com/book/food/52026,通过Chrome浏览器可以看到我们与“蘑菇街”交互的所有数据。

示范:

1打开Chrome,访问

http://list.mogujie.com/book/food/520262在Chrome中按F12或者在页面空白处点击鼠标右键→检查。3点击Clear 和 XHR 按钮。

4刷新一下页面。

5点击一下左边的search?callback=JQuery….,再点击右边栏的Response其下方会出现一些看不懂,但又好像有点儿规则的数据。管他的,先Ctrl+A全选拷贝出来看看。(如果你把商品列表页继续下滑,会出现更多的这种数据哦。)6使用Chrome插件「JSON-hanle」或者访问:https://www.json.cn/将刚才拷贝的数据粘贴进去,点击OK。

7再与网页上的数据对比一下,见图:

怎么样?是不是一目了然,相关数据都在里面了。这里的orgPrice为原价、sale为销量、cfav为点赞、price为现价。这些数据都已经在这一串乱七八糟的字符里了,我们需要的就解析这串字符。

其实呢,这种数据格式叫做「Json」。json 是轻量级的文本数据交换格式,其格式与计算机语言中的字典(dict)类似,都是名称/值对(key/value)的格式。能拿到json数据就已经成功90%了,剩下的10%就是解析json拿出自己想要的数据、保存数据。但也不是所有的Ajax请求拿到的都是Json数据,例如亚马逊他就是这么66的。

下面将以我们日常能用到的,

爬取reviews来演练一遍Ajax请求:1访问某商品的所有reviews页面:https://www.amazon.com/product-reviews/+  ASIN2reviews能按照我们预想的方式排列,在操作下图中的筛选条件后会生成新的链接。

如将SORT BY切换为Most recent,浏览器地址栏的链接会变为:https://www.amazon.com/product-reviews/B072DXSF6S/ref=cm_cr_arp_d_viewopt_srt?pageNumber=1&sortBy=recent

若直接使用requests.get该链接,返回的数据并不会按照预想的顺序排列。这种时候就需要抓包、Ajax请求登场了。3Chrome中按F12或者在页面空白处点击鼠标右键→检查。4首先点击Clear按钮,清除已捕获到的数据。再点击Next→按钮,看一下加载一页新的reviews会捕获到哪些数据。如下图,捕获到了一个名为“cm_cr_arp_d_paging_btm_3”的文件。最后点击Response,看一下这句文件到底传输了些什么。

5如下图所示,在Response里的数据与网页前端页面的部分源码一致。可以认定,亚马逊是先将评论页面的框架搭好,然后通过Ajax的方式传输显示评论详情的前端代码。

6再分析一下本次数据传输的headers、data等数据。这一步非常重要,在数据交互中各类请求头、请求参数都会影响本次请求的返回值。

在上图中已将一些关键的参数做了解释,方便大家理解。7下面就是敲代码时间了,按照之前的逻辑我们可以直接使用Ajax请求数据,然后根据返回的数据获取到reviews的网页源码,再加以解析。

首先准备好headers、cookies等数据。前期后童鞋表示headers什么的太难搞了,且不知道这里面花里胡哨的一堆是啥意思,今天告诉大家一个简便方法。首先在Chrome控制台抓到的数据上点击鼠标左键→Copy→Copy as cURL。如图:

再访问https://curl.trillworks.com/,在“curl command”中将刚才拷贝的cURL粘贴进去,右边将自动生成Python代码。如图:

嘿嘿嘿,爽不爽。现在只需要把右边的“Python requests”拷贝出来,粘贴到Pycharm里就可以跑起来啦,是不是美滋滋?。

8、打开Pycharm,新建项目,将代码拷贝进去。可以看到我们需要的headers, cookies, data全都已经备好了。稍微加工一下,跑一下看看。

response = requests.post('https://www.amazon.com/hz/reviews-render/ajax/reviews/get/',headers=headers,data=data)

打印的为:

这与刚才在Chrome看到的一样,证明我们成功获取到了数据。

9、将数据整理一下,并删除不需要的垃圾数据。

html_list =list(response.text.replace('&&&','').split('\n'))

reviews_html_list = html_list[6:26]print(len(reviews_html_list))foriinreviews_html_list:iflen(i)==0:

reviews_html_list.remove(i)

10、遍历整个列表取出每个评论的ID。

forreviews_htmlinreviews_html_list:

frist_review_soup = BeautifulSoup(eval(reviews_html)[2],'lxml')

review_id = frist_review_soup.find('div','a-section review')['id']

11、写一个解析review详情页的方法,方便调用。

defrequest_reviews_url(review_id):

headers = {'origin':'https://www.amazon.com','accept-encoding':'gzip, deflate, br','accept-language':'zh-HK,zh-CN;q=0.9,zh;q=0.8','user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36','content-type':'application/x-www-form-urlencoded;charset=UTF-8','accept':'text/html,*/*','referer':'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1','authority':'www.amazon.com','x-requested-with':'XMLHttpRequest','dnt':'1',}

review_url ='https://www.amazon.com/gp/customer-reviews/'+ review_id

review_html = requests.get(review_url,headers=headers)

review_soup = BeautifulSoup(review_html.text,'lxml')

review_title = review_soup.find('a','review-title').textprint(review_title)

review_author = review_soup.find('span','review-byline').text.replace('By','')print(review_author)

review_date = review_soup.find('span','review-date').text.replace('on ','')print(review_date)

review_text = review_soup.find('span','review-text').textprint(review_text)

这样就能完成让评论按要求排列,并爬取的需求了。附完整代码:

importrequestsfrombs4importBeautifulSoupdefrequest_reviews_url(review_id):

headers = {'origin':'https://www.amazon.com','accept-encoding':'gzip, deflate, br','accept-language':'zh-HK,zh-CN;q=0.9,zh;q=0.8','user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36','content-type':'application/x-www-form-urlencoded;charset=UTF-8','accept':'text/html,*/*','referer':'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1','authority':'www.amazon.com','x-requested-with':'XMLHttpRequest','dnt':'1',}

review_url ='https://www.amazon.com/gp/customer-reviews/'+ review_id

review_html = requests.get(review_url,headers=headers)

review_soup = BeautifulSoup(review_html.text,'lxml')

review_title = review_soup.find('a','review-title').textprint(review_title)

review_author = review_soup.find('span','review-byline').text.replace('By','')print(review_author)

review_date = review_soup.find('span','review-date').text.replace('on ','')print(review_date)

review_text = review_soup.find('span','review-text').textprint(review_text)if__name__ =='__main__':

page =1headers = {'origin':'https://www.amazon.com','accept-encoding':'gzip, deflate, br','accept-language':'zh-HK,zh-CN;q=0.9,zh;q=0.8','user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36','content-type':'application/x-www-form-urlencoded;charset=UTF-8','accept':'text/html,*/*','referer':'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1','authority':'www.amazon.com','x-requested-with':'XMLHttpRequest','dnt':'1',}while1:

data = {'sortBy':'recent','reviewerType':'all_reviews','formatType':'','mediaType':'','filterByStar':'','pageNumber':str(page),'filterByKeyword':'','shouldAppend':'undefined','deviceType':'desktop',# 'reftag': 'cm_cr_arp_d_viewopt_srt','pageSize':'10','asin':'B072SS1NTM',# 'scope': 'reviewsAjax1'}

response = requests.post('https://www.amazon.com/hz/reviews-render/ajax/reviews/get/',headers=headers,data=data)

html_list =list(response.text.replace('&&&','').split('\n'))

reviews_html_list = html_list[6:26]foriinreviews_html_list:iflen(i) ==0:

reviews_html_list.remove(i)forreviews_htmlinreviews_html_list:

frist_review_soup = BeautifulSoup(eval(reviews_html)[2],'lxml')

review_id = frist_review_soup.find('div','a-section review')['id']

request_reviews_url(review_id)

page +=1

爬虫中数据的分类主要有:结构化数据(json,xml等)和非结构化数据(HTML)。之前的文章中使用的案例都是从目标网站拿到非结构化数据然后使用正则表达式/xpath等解析,而今天讲是相对而言的结构化数据,可以使用json或xpath转换为Python对应的数据类型。寻找结构化数据可能在前期不好着手、找不到Post的正确URL,但一旦成功后将事半功倍。

照Web发展的趋势来看,以Ajax加载数据的方式将会越来越普遍。这种方式在Web开发上可以做到前后端分离,从而降低服务器直接渲染页面带来的压力。如果大家兴趣的话也可以自己动手尝试爬取一些其他网站的数据哟。

教了大家好几期的爬虫,大家有学会了的吗?觉得有用的小伙伴可以分享下朋友圈!或有什么问题,欢迎留言讨论哦!

好文!必须点赞

python爬虫动态加载页面_如何爬动态加载的页面?ajax爬虫你有必要掌握相关推荐

  1. 需要某个字体包才能正确显示此页面_[三分钟小文]前端性能优化-页面加载速度优化...

    本期内容请记住一个核心:JavaScript很快,DOM很慢 阅读本文您将收获: 从用户输入URL到看得到页面的过程 页面渲染过程 在页面加载层级的性能优化 用户看到页面之前都经历了什么 这一部分是面 ...

  2. jquery 当页面图片加载之后_图片的懒加载和预加载

    一.懒加载 [1.1]什么是懒加载? 懒加载也就是延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1 ...

  3. vue按需加载组件_微人事首页加载速度提高了 5 倍,我都做了什么?

    「本文之前发过,但是比较零散,这里我把用到的方案都汇总一下,方便大家索引,有需要的小伙伴可以收藏下方便查找.里边提到的几种方案,大家都可以对照着视频试一下」 ElementUI 按需加载: 服务端开启 ...

  4. h5 先加载小图_交互基础:加载的10种类型和应用场景分析

    原文地址:白鹭漫谈(公众号) 作者:白鹭漫谈 目录: 一.为什么需要加载 二.常见的加载场景 三.加载的10种类型和分析 四.总结 一.为什么需要加载? 1 给用户反馈 在上篇<尼尔森10大可用 ...

  5. angular 首屏加载优化_[转]Angular4首页加载慢优化之路

    Angular是一个比较完善的前端MVC框架,包含了模板,数据双向绑定,路由,服务,过滤器,依赖注入等等所有的功能.在Web开发前后端流行的今天,我们在某个项目中也尝试使用该框架. 很快按照官网上的例 ...

  6. 小程序嵌套h5页面_微信小程序内嵌h5页面

    概况 使用 标签能在小程序中打开外部网页,但是要打开的网页的域名必须跟小程序的业务域名(业务域名可以在小程序的后台管理界面添加)一致,否则在真机上是打不开的.如果开发工具上勾选了'不校验域名',在开发 ...

  7. app.vue 跳转页面_「案例分析」APP关键页面UX优化拆解—以珍爱网APP为例

    珍爱网APP一共有五个主要的关键页面.第一个是推荐页面,第二个是直播页面,第三个动态页面,第三个是消息页面,第五个是个人设置. (一)APP页面结构梳理 珍爱网APP关键页面结构 (二)各部分关键页面 ...

  8. Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...

    [Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新) 0 2014-05-07 18:00:06 使用该控件,可以根据url,参数,加载html记录模板(包含 ...

  9. jquery 当页面图片加载之后_在浏览器地址栏输入地址到页面渲染完成发生了什么?(下)...

    上一篇讲了前三步,本篇从第四步开始.下面是正文: 四.进行tcp三次握手,建立tcp连接. 简述一下,第三步我们找到了目标ip,并获得了服务器ip的mac地址.此时浏览器就会请求和服务器连接,用来传输 ...

最新文章

  1. 取代MybatisPlus?阿里推出了新 ORM 框架!(两者对比参考)
  2. javascript的location/history
  3. jyphon 环境变量配置
  4. 【python图像处理】txt文件数据的读取与写入
  5. 【linux】虚拟机安装centos后ping ip地址出现错误:Network is unreachable
  6. 机器学习 数据模型_使用PyCaret将机器学习模型运送到数据—第二部分
  7. Maven学习(八)-----Maven依赖机制
  8. TensorFlow 教程 --进阶指南--3.8使用GPU
  9. linux查看内存_【001】一文带你全面掌握Linux系统体系结构
  10. [转]关于Microsoft.Office.Interop组件接口的调用方法
  11. 关于System.identityHashCode(obj) 与 obj.hashcode()
  12. Wysistat与Webtrends比较
  13. android avrcp处理流程,android 蓝牙avrcp功能的实现.doc
  14. 系统分析与设计(个人总结)
  15. Tslib的触摸屏5点校准算法原理和实现
  16. 纯css按钮代码,纯CSS实现3D按钮效果实例代码
  17. prisma orm_如何使用Node.js和Prisma构建GraphQL服务器
  18. Arduino之oled屏幕使用
  19. 计算机视觉检测 白皓月,Hough变换和轮廓匹配相结合的瞳孔精确检测算法
  20. 16.集合框架(ArrayList,Vector,LinkedList,泛型(Generic),可变参数,增强for循环)

热门文章

  1. vs2005c语言连接mysql_VS2005连接MySQL C API
  2. java服务写在哪里_JavaService
  3. ps一点等于多少厘米_50寸液晶电视尺寸是多少
  4. SpringCloud中Feign服务调用请求方式及参数总结
  5. linux服务器性能监控命令汇总(一)
  6. nginx openresty content_by_lua_file 404错误
  7. linux shell 字符串操作(长度,查找,替换)详解 BASH
  8. 十、图像参数集Picture Paramater Set(PPS)解析
  9. LDD3源码分析之访问控制
  10. 增强for循环_增强for循环实际用法