定制开发我们有时候针对某些网页进行时,定制开发可能会发现代码无错误定制开发的情况下爬取不到数据,定制开发这是因为我们遇到了采定制开发用异步加载技术的网页。定制开发本文将讲解异步加载的基本概念,定制开发并针对异步加载网页而定制开发使用逆向工程抓取数据。
定制开发我们先认识一下,定制开发什么是异步加载?
定制开发异步加载技术概述
定制开发传统的网页如果需要更新内容,定制开发必须重新加载整个网页页面,网页加载速度慢,用户体验差,而且数据传输少,会造成宽带浪费。异步加载技术(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库进行数据的抓取工作,需要抓取的内容为用为“动态”类型和时间信息。
爬虫代码及分析
- import requests
- from lxml import etree
- import pymongo
-
- def get_time_info(url,page):
- user_id = url.split('/')
- user_id = user_id[4]
- if url.find('page='):
- page = page+1
- html = requests.get(url)
- selector = etree.HTML(html.text)
- infos = selector.xpath('//ul[@class="note-list"]/li')
- for info in infos:
- dd = info.xpath('div/div/div/span/@data-datetime')[0]
- type = info.xpath('div/div/div/span/@data-type')[0]
- timeline.insert_one({'data':dd,'type':type})
- id_infos = selector.xpath('//ul[@class="note-list"]/li/@id')
- if len(infos) > 1:
- feed_id = id_infos[-1]
- max_id = feed_id.split('-')[1]
- next_url = 'https://www.jianshu.com/users/%s/timeline?max_id=%s&page=%s' %(user_id,max_id,page)
- get_time_info(next_url,page)
-
- if __name__=='__main__':
- get_time_info('https://www.jianshu.com/users/9104ebf5e177/timeline?max_id',1)
这样就解决了异步加载的问题,其实搞懂原理,不管什么网页,我们都能爬取。