环境:python3.6 + pycharm
“猎物”:http://www.polayoutu.com (仅学习用)
动机1:想要爬一些尺寸比较大(不是尺度)的美图养养眼,仅此而已;
动机2:学习python爬虫,要学以致用
一、分析目标网站:
1.寻找URL:
摄影图片是分期展示的,我们滚动页面,滚动到140期,看到请求的URL如下:
“http://www.polaxiong.com/collections/get_entries_by_collection_id/140?{}”
2.大胆猜测:URL地址中"?{}"去掉可不可以?我们做一个尝试,直接输入“http://www.polaxiong.com/collections/get_entries_by_collection_id/140”,得到的是一个json字符串(我个人还是蛮喜欢json字符串的,因为它跟字典互相转换,炒鸡爽!)
3.看!有情报,data字段对应的value里有0-11编号的数据,展开其中一个,看到文件描述,心里乐开花,这不正是页面上图片的描述吗?而且,“full_res"字段对应的value,就是我们要找到原图URL。
4.尝试打开full_res的url地址,查看图片大小:2.9M,这肯定是原图啊,哪个网站缩略图能有2.9M的?
5.接下来,我们要做的就是把json字符串转成字典,取出full_res的值
二.以下是完整爬虫代码:
#!/bin/python
# coding = utf-8
# 本python爬虫仅用于学习
import urllib.request
import os, pathlib
import threading
import time
import json
import requests
path = r'C://IM/pic//' # 使用前先创建此目录,否则会报错
header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1'}
def check_dir(path):
if not os.path.exists(path):
os.makedirs(path)
print("目录创建成功,开始下载...")
else:
print("目录已存在,开始下载...")
# 下载图片文件
def save_img(url, path, name):
try:
urllib.request.urlretrieve(url, "%s%s" % (path, name))
# time.sleep(10)
except Exception as e:
# 通过try -except 来捕获异常,当目录不存在时会抛出异常
print(e)
def get_img(url, header, path):
try:
js_content = requests.get(url, headers=header).content # 发送request请求
js_dict = json.loads(js_content) # 将json字符串转成python字典格式
new_dict = js_dict['data'] # 取出data对应value值
for i in range(len(new_dict)):
file_url = new_dict[i]['full_res'] # 遍历得到full_res对应的原图地址
file_name = file_url.split('/')[4]+'_'+file_url.split('/')[5]+'.jpg' # 拼接文件名:“期号_图片编号.jpg”
save_img(file_url, path, file_name) # 下载图片文件,并保存到本地
print("%s:已下载" % file_name)
except Exception as e:
print(e)
if __name__ == '__main__':
check_dir(path)
for num in range(10, 100): # 这里是从10期到100期循环遍历
# 拼接URL地址
url = 'http://www.polaxiong.com/collections/get_entries_by_collection_id/'+str(num)
get_img(url, header, path)
三、我们看一下效果:
2张图片大小共19M,下载的是原图!