Python爬虫 ,爬点汉服妹子做福利

734 阅读3分钟

这是我参与8月更文挑战的30天,活动详情查看:[8月更文挑战] (juejin.cn/post/698796… "juejin.cn/post/698796…")

前段时间写了写爬虫,我公众号的结尾的福利环节会留一些图,前一段时间有个大佬留言说多放一些汉服妹子,今天也刚好有点时间就百度了下汉服的网站,找到了一个汉服的网站,就写个爬虫来搜集一些照片,废话不多说了,开始吧。 image.png

1、目标网站分析 目标网站:www.hanfuhui.com/

image.png

可以看到主页是流式布局的,向下拖动会加载新的数据。

打开一个子页面,查看每个图片的对应链接信息。

image.png

可以看到这个图片的链接信息。

pic.hanfugou.com/ios/2019/12…

看起来有些简单,一下定位到了图片的链接信息,直接保存图片就好了。

至此我们有了第一种方案:打开主页,然后滑动,进入子界面获取所有的图片链接信息,一直保存就可以了。

2、换页的分析,滑动分析 在主页一直滑动,打开F12 ,clear 掉所有的请求,然后切换到Network页签,看看滑动的时候到底是怎么翻页的。

在拖动的时候先发了两个请求,然后收到了一堆json数据。

API 地址:

api5.hanfugou.com/Trend/GetTr…

分析下参数

page 是第几页,

count 是每页气球多少

objecttype 对象是 相册

image.png

既然猜测是这样,那我们就修改下参数来请求下,新打开一个标签也,然后请求下每页30个数据试试。

image.png

看起来似乎我们的猜测是对的。

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

看下我们的战果:

image.png

4、问题复盘 1.翻页API的查找过程虽然简单,但是也花了一些时间,不应该。

2.在分析的过程中发现子页面的图片是被缩减之后的图,在原来的基础上加了 "_700x.jpg" ,获取的尺寸都是700的,换了手机设备之后也有200后缀的,下载的图片不是原图,有点模糊

3.原图的分析,在查看js的过程中发现了一个bigpic 的函数,查看原图,但是在页面上并没有找到相关的按钮,也不知道啥情况。

image.png

4.现在下载到的原图也是在一顿混乱分析之后发现的,不然的话可能是下载的图片404 ,不信你试试,这个花了一些时间,事后也没分析这件事情的原因,因为我已经下载到了图片

5.代码中加了一个开关,isQuick = False 如果为了加快下载的速度可以设置为True ,这样就会下载700 width 的照片,不然原照片太大了消耗的时间有些久,你自己选择吧

5、总结 建议没什么需求的同学不要使用这个爬虫,毕竟会伤害网站,浪费流量,如果有需要的同学建议也不要太过分,不要影响网站的正常运行。

常规福利

image.png