定制开发代码没有错,但爬取网页无数据输出,因为遇到了异步加载网页

定制开发我们有时候针对某些网页进行时,定制开发可能会发现代码无错误定制开发的情况下爬取不到数据,定制开发这是因为我们遇到了采定制开发用异步加载技术的网页。定制开发本文将讲解异步加载的基本概念,定制开发并针对异步加载网页而定制开发使用逆向工程抓取数据。

定制开发我们先认识一下,定制开发什么是异步加载?

定制开发异步加载技术概述


        定制开发传统的网页如果需要更新内容,定制开发必须重新加载整个网页页面,网页加载速度慢,用户体验差,而且数据传输少,会造成宽带浪费。异步加载技术(AJAX),即异步JavaScript和XML,是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,AJAX可以是网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

那我们怎么知道网页有没有采用异步加载技术呢?


        当我们通过下滑进行浏览,并没有分页的信息,而是一直浏览下去,但网址信息并没有改变。传统的网页不可能一次性加载如此庞大的信息。通过分析可判断该网页使用了异步加载技术。

那我们该如何应对呢?

逆向工程
        使用异步加载技术,不再是立即加载所有网页内容,而展示的内容也就不再HTML的源代码中。这样通过前面的方法就无法抓取到数据。想要抓取这些通过异步加载方法的网页数据,需要了解网页时如何加载这些数据的,该过程就叫做逆向工程,俗称“抓包”。

下面我们通过具体案例来说说如何解决异步加载问题。

我们以爬取某网用户动态信息

首先我们要思考一下爬虫思路分析

        (1)本节爬取的内容为某网用户动态的信息

         (2)当首次打开该网页URL时,单机“动态”链接后,发现网页URL并没有发生变化,所以判断该网页采用了异步加载技术。

        (3)打开的开发者工具(按F12),选择Network选项卡,再选择XHR项,可发现网页加载了用户“动态”内容的文件。 

        (4)观察该文件的Reponse信息发现返回的是XML文件,内容正是用户“动态”内容,每个li标签就是一个用户动态内容。删除timeline后面的字符串也可以返回正确的内容,以次构造第一页的URL为 http://www.****.com/users/9104ebf5e177/timeline(大家具体问题具体分析)

        (5)通过下滑浏览发现,该网页也是使用异步加载技术进行分页处理的。以此来记录前几页的URL   

         (6)通过手工删除URL中的max_id字段,发现不能返回正常的内容。说明max_id是一个很关键的字段。而我们可以发现每个页面的max_id都不相同,通过观察数字也没有找到明显的规律。而构造URL的重点就在于如何获取max_id的数字。

        (7)前面分析到每一个li标签就是用户的一条动态内容,我们发现,li标签的id字段有着一串没有规律的胡子信息。通过观察发现,前一页最后一个li标签中的id数字,刚好是它下一页URL中的max_id数字+1,以此来构造出URL。

         (8)由于Response返回的是XML的文档,便可以通过Lxml库进行数据的抓取工作,需要抓取的内容为用为“动态”类型和时间信息。 

 爬虫代码及分析

  1. import requests
  2. from lxml import etree
  3. import pymongo
  4. def get_time_info(url,page):
  5. user_id = url.split('/')
  6. user_id = user_id[4]
  7. if url.find('page='):
  8. page = page+1
  9. html = requests.get(url)
  10. selector = etree.HTML(html.text)
  11. infos = selector.xpath('//ul[@class="note-list"]/li')
  12. for info in infos:
  13. dd = info.xpath('div/div/div/span/@data-datetime')[0]
  14. type = info.xpath('div/div/div/span/@data-type')[0]
  15. timeline.insert_one({'data':dd,'type':type})
  16. id_infos = selector.xpath('//ul[@class="note-list"]/li/@id')
  17. if len(infos) > 1:
  18. feed_id = id_infos[-1]
  19. max_id = feed_id.split('-')[1]
  20. next_url = 'https://www.jianshu.com/users/%s/timeline?max_id=%s&page=%s' %(user_id,max_id,page)
  21. get_time_info(next_url,page)
  22. if __name__=='__main__':
  23. get_time_info('https://www.jianshu.com/users/9104ebf5e177/timeline?max_id',1)

这样就解决了异步加载的问题,其实搞懂原理,不管什么网页,我们都能爬取。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发