这是我参与8月更文挑战的30天,活动详情查看:[8月更文挑战] (juejin.cn/post/698796… "juejin.cn/post/698796…")
前段时间写了写爬虫,我公众号的结尾的福利环节会留一些图,前一段时间有个大佬留言说多放一些汉服妹子,今天也刚好有点时间就百度了下汉服的网站,找到了一个汉服的网站,就写个爬虫来搜集一些照片,废话不多说了,开始吧。
1、目标网站分析 目标网站:www.hanfuhui.com/
可以看到主页是流式布局的,向下拖动会加载新的数据。
打开一个子页面,查看每个图片的对应链接信息。
可以看到这个图片的链接信息。
看起来有些简单,一下定位到了图片的链接信息,直接保存图片就好了。
至此我们有了第一种方案:打开主页,然后滑动,进入子界面获取所有的图片链接信息,一直保存就可以了。
2、换页的分析,滑动分析 在主页一直滑动,打开F12 ,clear 掉所有的请求,然后切换到Network页签,看看滑动的时候到底是怎么翻页的。
在拖动的时候先发了两个请求,然后收到了一堆json数据。
API 地址:
api5.hanfugou.com/Trend/GetTr…
分析下参数
page 是第几页,
count 是每页气球多少
objecttype 对象是 相册
既然猜测是这样,那我们就修改下参数来请求下,新打开一个标签也,然后请求下每页30个数据试试。
看起来似乎我们的猜测是对的。
3、show code 分析的结束了,下面直接上代码,
我选择了第二个解决方案,因为简单,直接一个api搞定
import requests
isQuick = False
# author : 香菜
def get_content(url):
try:
user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0'
response = requests.get(url, headers={'User-Agent': user_agent})
response.raise_for_status() # 如果返回的状态码不是200, 则抛出异常;
except Exception as e:
print("爬取错误")
else:
print("爬取成功!")
return response.json()
def save_img(img_src):
if img_src is None:
return
imgName = img_src.split('/')[-1]
try:
print(img_src)
url = img_src
if isQuick:
url = url + "_700x.jpg"
headers = {"User-Agent": 'Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0'}
# 注意 verify 参数设置为 False ,不验证网站证书
requests.packages.urllib3.disable_warnings()
res = requests.get(url=url, headers=headers, verify=False)
data = res.content
filePath = 'hanfu/' + imgName
with open(filePath, "wb+") as f:
f.write(data)
except Exception as e:
print(e)
def readAllMsg(jsonData):
allImgList = []
dataList = jsonData['Data']
for dataItem in dataList:
imgList = dataItem['Images']
allImgList.extend(imgList)
return allImgList
if __name__ == '__main__':
# url = "https://api5.hanfugou.com/Trend/GetTrendListForHot?maxid=2892897&objecttype=album&page=3&count=20"
url = "https://api5.hanfugou.com/trend/GetTrendListForMain?banobjecttype=trend&maxtime=0&page=2&count=10"
jsonData = get_content(url)
imgList = readAllMsg(jsonData)
for imgDict in imgList:
save_img(imgDict['ImgSrc'])
注:需要在当前代码路径下创建文件夹 hanfu
看下我们的战果:
4、问题复盘 1.翻页API的查找过程虽然简单,但是也花了一些时间,不应该。
2.在分析的过程中发现子页面的图片是被缩减之后的图,在原来的基础上加了 "_700x.jpg" ,获取的尺寸都是700的,换了手机设备之后也有200后缀的,下载的图片不是原图,有点模糊
3.原图的分析,在查看js的过程中发现了一个bigpic 的函数,查看原图,但是在页面上并没有找到相关的按钮,也不知道啥情况。
4.现在下载到的原图也是在一顿混乱分析之后发现的,不然的话可能是下载的图片404 ,不信你试试,这个花了一些时间,事后也没分析这件事情的原因,因为我已经下载到了图片
5.代码中加了一个开关,isQuick = False 如果为了加快下载的速度可以设置为True ,这样就会下载700 width 的照片,不然原照片太大了消耗的时间有些久,你自己选择吧
5、总结 建议没什么需求的同学不要使用这个爬虫,毕竟会伤害网站,浪费流量,如果有需要的同学建议也不要太过分,不要影响网站的正常运行。
常规福利