瀑布流和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 ***** 厉害 chrome能搞定不,?
这异步加载,没有教程,真担心看不懂 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 是神马乌,咋来的,干啥用的 不清楚 学习呀
、 okok
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 Stubborn 发表于 2019-5-9 13:01
发帖前面就说过了,图片通过JS加载成瀑布流的形式,当到达底部后,会请求后台拿到更多的数据,你往下面翻 ...
一个chrome就可以吗
我早上发了一个贴,被关监狱里了,现在还没有放出来呢 wp231957 发表于 2019-5-9 13:04
一个chrome就可以吗
我早上发了一个贴,被关监狱里了,现在还没有放出来呢
dui 学习 向大神学习,我抄一遍!!# -*- 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
红色框里的长串数字 是如何获取的呢麻烦指点一下
你看我的翻页,就是这个pin_id 翻页那部分代码还是没有看明白,类代码我实在是有些看不懂
我翻译了你的大部分代码现在能成功的下载一部分图片,麻烦你把翻页部分给我补上
我看看 到底是咋翻的
#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)
wp231957 发表于 2019-5-14 14:26
翻页那部分代码还是没有看明白,类代码我实在是有些看不懂
我翻译了你的大部分代码现在能成功的下载一部 ...
19行,for循环完毕,继续拿item['pin_id'],拼接请求,继续13行的代码操作 看看 6666 看代码 111 你的头像让我无法学习了
页:
[1]
2