Stubborn 发表于 2019-5-9 03:48:02

瀑布流和Ajax动态加载数据之花瓣网

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

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

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

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

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

**** Hidden Message *****

wp231957 发表于 2019-5-9 06:37:52

厉害

wp231957 发表于 2019-5-9 07:06:50

chrome能搞定不,?
这异步加载,没有教程,真担心看不懂

wp231957 发表于 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 是神马乌,咋来的,干啥用的 不清楚

kaohsing 发表于 2019-5-9 09:57:27

学习呀

fseoer 发表于 2019-5-9 10:06:49

okok

Stubborn 发表于 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

wp231957 发表于 2019-5-9 13:04:35

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

一个chrome就可以吗
我早上发了一个贴,被关监狱里了,现在还没有放出来呢

Stubborn 发表于 2019-5-9 13:21:28

wp231957 发表于 2019-5-9 13:04
一个chrome就可以吗
我早上发了一个贴,被关监狱里了,现在还没有放出来呢

dui

wy1018651314 发表于 2019-5-9 14:42:53

学习

kaohsing 发表于 2019-5-10 16:03:15

向大神学习,我抄一遍!!# -*- coding: utf-8 -*-
# @Time    : 2019-05-08 02:47
# @Author: Ein
# @File    : 花瓣网.py
# @Software: PyCharm

import requests
import json
import time

class RequestsHuaban:

    def __init__(self):

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

    def callback(self,function,*parameter):
      function(*parameter)

    def run(self,pin):
      url = self.url.format(pin_id=pin)
      text= self.session.get(url=url).text
      time.sleep(5)
      json_data = text.split('["board"] = ').split(';\napp._csr',)
      data = json.loads(json_data)
      pinsList = data['pins']
      item = {}

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


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

if __name__ == '__main__':
    test = RequestsHuaban()
    test.run(pin='2363573713')

wp231957 发表于 2019-5-14 10:15:54

红色框里的长串数字 是如何获取的呢麻烦指点一下

Stubborn 发表于 2019-5-14 11:36:51

wp231957 发表于 2019-5-14 10:15
红色框里的长串数字 是如何获取的呢麻烦指点一下

你看我的翻页,就是这个pin_id

wp231957 发表于 2019-5-14 14:26:04

翻页那部分代码还是没有看明白,类代码我实在是有些看不懂
我翻译了你的大部分代码现在能成功的下载一部分图片,麻烦你把翻页部分给我补上
我看看 到底是咋翻的

#coding: utf-8
from lxml import etree
import requests,json


   



if __name__ == '__main__':
    pin='2363573713'
    path=r"e:\pic\\"
    url= 'https://huaban.com/boards/481662/?jvetal98&max=%s&limit=20&wfl=1'%pin
    tree = etree.HTML(requests.get(url=url).text)
    json_data = tree.xpath('/html/body/script/text()').split('["board"] = ',1).split(';\napp._csr = true',1)
    data = json.loads(json_data)
    pinsList = data['pins']
    item = {}
    for pin_id in pinsList:
       item['pin_id'] = pin_id['pin_id']
       item['url'] = 'https://hbimg.huabanimg.com/' + pin_id['file']['key'] + '_fw658'
       #下载
       response = requests.get(url=item['url']).content
       fpath = path + str(item['pin_id']) + '.jpg'
       with open(fpath,'wb') as fp:
          fp.write(response)

Stubborn 发表于 2019-5-14 15:17:30

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

19行,for循环完毕,继续拿item['pin_id'],拼接请求,继续13行的代码操作

武次郎 发表于 2019-5-25 19:15:09

看看

Hok 发表于 2019-5-25 22:51:02

6666

Sablier 发表于 2019-5-26 15:51:19

看代码

蔡鱼C 发表于 2019-5-30 18:01:09

111

shipo 发表于 2019-6-16 14:44:25

你的头像让我无法学习了
页: [1] 2
查看完整版本: 瀑布流和Ajax动态加载数据之花瓣网