【Python爬虫】如何爬取翻页url不变的网站

点击蓝字python教程”关注咱们哟!

以前打算爬取一个图片资源网站,可是在翻页时发现它的url并无改变,没法简单的经过request.get()访问其余页面。据搜索资料,了解到这些网站是经过ajax动态加载技术实现。便可以在不从新加载整个网页的状况下,对网页的某部分进行更新。python

这样的设置无疑给初期爬虫新手制造了一些困难。程序员

一、什么是ajaxajax

几个常见的用到ajax的场景。浏览器

好比你在逛知乎,你没有刷新过网页,可是你却能看到你关注的用户或者话题有了新动态的消息提示。服务器

还好比,咱们在看视频时,能够看到下面的评论没有彻底所有加载出来,而是你向下拖动一点,它给你加载一点。微信

从上述场景你应该也能够发现它的优势:app

  1. 方便与用户的交互,不用从新加载整个网页,就能够实现刷新,不用中断用户的行为。你正在看程序员如何找对象呢,此时来个消息推送,整个网页被刷新了,你说你气不气!函数

  2. 仍是你在看程序员如何找对象,可是此时通讯情况很差啊。回答加载不出来,页面就空白的卡那了,回答加载不出来,你说急不急!那这样咯,先给你看几个回答,在你看的时候我再悄悄的加载其它的数据,那不就解决了吗?就跟吃饭一个道理,你点了一桌子菜,难道菜全作好了再给你上吗?确定不会的呀,作好一道上一道嘛,对不对。工具

  3. 从服务端的发送过来的ajax数据,体积比较小。浏览器知道怎么渲染它,这样就减轻了服务端的压力,让客户端,也就是浏览器承担了一些任务。post

Ajax技术的核心是XMLHttpRequest对象(简称XHR),能够经过使用XHR对象获取到服务器的数据,而后再经过DOM将数据插入到页面中呈现。虽然名字中包含XML,但Ajax通信与数据格式无关,因此咱们的数据格式能够是XML或JSON等格式。(具体请访问:https://www.w3.org/TR/XMLHttpRequest/

XMLHttpRequest对象用于在后台与服务器交换数据,具体做用以下:

  • 在不从新加载页面的状况下更新网页

  • 在页面已加载后从服务器请求数据

  • 在页面已加载后从服务器接收数据

  • 在后台向服务器发送数据

二、如何爬取ajax动态加载的网页

这里用到的方法是经过分析响应请求,模拟响应参数。再经过requests库的request.post()函数去post相对应的参数便可

具体方法以下:

打开开发者工具,快捷键F12,不行就Fn + F12.

标红的1, network, 在其中能够看到服务器加载过来的资源。

标红的2, 是一个过滤器,你能够按照文件格式筛选。

标红的3,是加载过来的具体文件。

Headers中的request method 中显示咱们使用的是POST方法。

并且FROM Data 中有一个参数,page。

利用Form Data 中的数据,编写一个字典,赋值给requests.post()中的data便可

接下来就能够正常访问和翻页了!

更为具体的信息可见:https://zhuanlan.zhihu.com/p/27346009,很感谢其提供的思路和帮助

附源码

import requestsimport osimport re def get_page(url,page_num): pageList =[] for i in range(1,page_num +1): formdata ={'type':'index' , 'paged': i} try: r = requests.post(url,data =formdata) r.raise_for_status() r.encoding = r.apparent_encoding print('连接成功') p = re.compile(r'href="(http://www.jdlingyu.net/\d{5}/)"') tempList = re.findall(p,r.text) for each in tempList: pageList.append(each) print('保存页面成功') tempList = [] except: print('连接失败') print(pageList) return pageList def get_picure(pageList): picList = [] for each in pageList: try: r = requests.get(each,headers = kv) r.raise_for_status() r.encoding = r.apparent_encoding p = re.compile('http://img.jdlingyu.mobi/[^"]+\.jpg|http://w[wx][23].sinaimg.cn/[^"]+\.jpg') tempList = re.findall(p,r.text) for each in tempList: picList.append(each) print('保存图片连接成功') tempList = [] except: print('保存图片连接失败') return picListdef down_picture(picList,root): picList = list(set(picList)) if not os.path.exists(root): os.mkdir(root) for each in picList: path = root + each.split('/')[-1] if not os.path.exists(path): r = requests.get(each,headers = kv) r.raise_for_status() with open(path,'wb') as f: f.write(r.content) print('动图已保存') else: print('动图已存在') url = 'http://www.jdlingyu.net/'kv = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}root = 'D://绝对领域//'pageList = get_page(url,2)picList = get_picure(pageList)down_picture(picList,root)

注意事项

01

对Python开发技术感兴趣的同窗,欢迎加下方的交流群一块儿学习,相互讨论。

02

python交流学习扣扣群:934109170,多多交流问题,互帮互助,群里有不错的学习教程和开发工具。学习python有任何问题(学习方法,学习效率,如何就业),能够随时来咨询我

好啦!文章就给看官们分享到这儿

最后,若是以为有帮助,记得关注、转发、收藏



本文分享自微信公众号 - python教程(pythonjc)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索