鱼C论坛

 找回密码
 立即注册
查看: 5280|回复: 37

[作品展示] 瀑布流和Ajax动态加载数据之花瓣网

[复制链接]
发表于 2019-5-9 03:48:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Stubborn 于 2019-5-9 04:02 编辑

有鱼友说想要知乎和花瓣的爬虫教程,前面发了知乎,这里补上花瓣的。我懒得写教程了,骂我吧

鱼油有爬不下来的网站可以留言,会选择感兴趣的网址发一个教程。已经在淘贴有类似的网址就不用发了~

这里补充下>>>踩点时候发现花瓣是采用的瀑布流和Ajax动态加载数据

>>>瀑布流:参差不齐的多栏布局以及到达底部自动加载的方式
>>>Ajax动态加载数据:在不重新加载整个网页的情况下,对网页的某部分进行更新
图片通过JS加载成瀑布流的形式,当到达底部后,会请求后台拿到更多的数据,解析后通过Ajax,可以在不关闭不转跳不刷新浏览器的情况下部分更新页面内容。
既然会向后台请求数据那么好办,我们直接向后台请求数据不就得了。
废话不多说,贴代码

游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
RIXO + 5 + 5 + 3 居然出贴啦,支持一下!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-9 06:37:52 From FishC Mobile | 显示全部楼层
厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-9 07:06:50 From FishC Mobile | 显示全部楼层
chrome能搞定不,?
这异步加载,没有教程,真担心看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-9 08:59:03 | 显示全部楼层
self.url = 'https://huaban.com/boards/481662/?jvetal98&max={pin_id}&limit=20&wfl=1'

这句我再源码里只能找到'https://huaban.com/boards  后面的481662 就找不到了 但是有其他一些类似数据
不知道这个数据是否是总在变化的 以及后面部分/?jvetal98&max={pin_id}&limit=20&wfl=1 都是咋拼接的
不太清楚

还有:test.run(pin='2363573713')  这里的2363573713 是神马乌,咋来的,干啥用的 不清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-9 09:57:27 | 显示全部楼层
学习呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-9 10:06:49 | 显示全部楼层
okok
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-9 13:01:09 | 显示全部楼层
wp231957 发表于 2019-5-9 08:59
self.url = 'https://huaban.com/boards/481662/?jvetal98&max={pin_id}&limit=20&wfl=1'

这句我再源码 ...

发帖前面就说过了,图片通过JS加载成瀑布流的形式,当到达底部后,会请求后台拿到更多的数据,你往下面翻的时候,突然给你刷新很多的图片出来,你再找找,就有这个请求的,2363573713 这个是图片的id,点击图片进去,就可以看到每个图片有不一样的id
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-9 13:04:35 From FishC Mobile | 显示全部楼层
Stubborn 发表于 2019-5-9 13:01
发帖前面就说过了,图片通过JS加载成瀑布流的形式,当到达底部后,会请求后台拿到更多的数据,你往下面翻 ...

一个chrome就可以吗
我早上发了一个贴,被关监狱里了,现在还没有放出来呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-9 13:21:28 | 显示全部楼层
wp231957 发表于 2019-5-9 13:04
一个chrome就可以吗
我早上发了一个贴,被关监狱里了,现在还没有放出来呢

dui
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-9 14:42:53 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-10 16:03:15 | 显示全部楼层
向大神学习,我抄一遍!!
  1. # -*- coding: utf-8 -*-
  2. # @Time    : 2019-05-08 02:47
  3. # @Author  : Ein
  4. # @File    : 花瓣网.py
  5. # @Software: PyCharm

  6. import requests
  7. import json
  8. import time

  9. class RequestsHuaban:

  10.     def __init__(self):

  11.         self.url = 'https://huaban.com/boards/481662/?jvetal98&max={pin_id}&limit=100&wfl=1'
  12.         self.session = requests.Session()
  13.         self.path = r'/Users/sstubborn/Desktop/jpg'+'/' #设置你的下载路径

  14.     def callback(self,function,*parameter):
  15.         function(*parameter)

  16.     def run(self,pin):
  17.         url = self.url.format(pin_id=pin)
  18.         text= self.session.get(url=url).text
  19.         time.sleep(5)
  20.         json_data = text.split('["board"] = ')[1].split(';\napp._csr',)[0]
  21.         data = json.loads(json_data)
  22.         pinsList = data['pins']
  23.         item = {}

  24.         for pin_id in pinsList:
  25.             item['pin_id'] = pin_id['pin_id']
  26.             item['url'] = 'https://hbimg.huabanimg.com/' + pin_id['file']['key'] + '_fw658'
  27.             self.callback(self.download,item['url'],item['pin_id'])
  28.         self.callback(self.run, item['pin_id'])


  29.     def download(self,url,id):
  30.         response = self.session.get(url=url).content
  31.         path = self.path + str(id) + '.jpg'
  32.         with open(path,'wb') as fp:
  33.             fp.write(response)

  34. if __name__ == '__main__':
  35.     test = RequestsHuaban()
  36.     test.run(pin='2363573713')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-14 10:15:54 | 显示全部楼层
红色框里的长串数字 是如何获取的呢  麻烦指点一下
批注 2019-05-14 101447.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-14 11:36:51 | 显示全部楼层
wp231957 发表于 2019-5-14 10:15
红色框里的长串数字 是如何获取的呢  麻烦指点一下

你看我的翻页,就是这个pin_id
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-14 14:26:04 | 显示全部楼层
翻页那部分代码还是没有看明白,类代码我实在是有些看不懂
我翻译了你的大部分代码  现在能成功的下载一部分图片,麻烦你把翻页部分给我补上
我看看 到底是咋翻的

  1. #coding: utf-8
  2. from lxml import etree
  3. import requests,json


  4.      



  5. if __name__ == '__main__':
  6.     pin='2363573713'
  7.     path=r"e:\pic\"
  8.     url= 'https://huaban.com/boards/481662/?jvetal98&max=%s&limit=20&wfl=1'%pin
  9.     tree = etree.HTML(requests.get(url=url).text)
  10.     json_data = tree.xpath('/html/body/script[1]/text()')[0].split('["board"] = ',1)[1].split(';\napp._csr = true',1)[0]
  11.     data = json.loads(json_data)
  12.     pinsList = data['pins']
  13.     item = {}
  14.     for pin_id in pinsList:
  15.        item['pin_id'] = pin_id['pin_id']
  16.        item['url'] = 'https://hbimg.huabanimg.com/' + pin_id['file']['key'] + '_fw658'
  17.        #下载
  18.        response = requests.get(url=item['url']).content
  19.        fpath = path + str(item['pin_id']) + '.jpg'
  20.        with open(fpath,'wb') as fp:
  21.           fp.write(response)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-14 15:17:30 | 显示全部楼层
wp231957 发表于 2019-5-14 14:26
翻页那部分代码还是没有看明白,类代码我实在是有些看不懂
我翻译了你的大部分代码  现在能成功的下载一部 ...

19行,for循环完毕,继续拿item['pin_id'],拼接请求,继续13行的代码操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-25 19:15:09 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-25 22:51:02 | 显示全部楼层
6666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-26 15:51:19 | 显示全部楼层
看代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-30 18:01:09 | 显示全部楼层
111
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-16 14:44:25 | 显示全部楼层
你的头像让我无法学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 04:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表