想学python很久了,却一直不知道该从哪里学起。最近觉得不管那么多,先从爬虫学起吧。
这个爬虫其实很基础。
首先分析要爬取的网站,我这里要爬取的的是搜狗壁纸。打开搜狗壁纸网站,然后f12打开开发者工具,切换到network,选择XHR
一般壁纸网站都采取瀑布流图片显示,即每次只显示一部分图片,滑到底部时再加载出另一部分图片。当网页开始加载另一部分图片时,XHR位置就会出现请求url
将这条url复制下来并加以分析,这是爬虫中相当重要的一步
https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E5%8A%A8%E6%BC%AB&start=0&len=15&width=1920&height=1080
很容易就可以发现,这条url中包含着几个重要元素:
category,tag,star,width,height。
其中category默认是壁纸,tag是类别,star是开始位置,width和height是壁纸的分辨率
知道了这几个东西是做什么的,就可以构造出一个适用于所有url的可变url
https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag='+t+'&start=0&len='+str(length)+'&width=1920&height=1080
下面是爬虫源码:
import requests import urllib import json def createDir(): #创建文件夹函数,参数是要创建文件夹的路径 import os #引入模块 #创建壁纸文件夹名称数组 tag=['游戏','摄影','卡通','清新','优质','手绘','炫彩','创意'] #path='D:/a/' d_name=[] #创建路径数组 for t in tag: #插入各路径 dir_path='D:/a/'+t+'/' d_name.append(dir_path) #将路径放入文件夹数组中 os.makedirs(dir_path) #创建文件夹 print(dir_path+' 文件夹创建成功!') return d_name #返回数组 def getImg(cate,length,path): #定义一个函数下载图片,参数是标签,图片数量,下载地址 tag=['游戏','摄影','卡通','清新','优质','手绘','炫彩','创意'] re_path=[] #请求数组 header={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' } #header=request.headers #请求头内容,进行爬虫伪装 for t in tag: #插入请求数组元素 re_path.append('https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag='+t+'&start=0&len='+str(length)+'&width=1920&height=1080') # print(re_path) for tg,address in zip(re_path,path): #按每个标签进行下载 同时遍历两个数组 m=requests.get(tg,headers=header) #tg是请求数组元素,address是文件保存路径数组元素 j=json.loads(m.text) #将已编码的 JSON 字符串解码为 Python 对象 j=j['all_items'] #all_items是json一个索引值, m_url=[] #path='D:/a/' #定义一个下载路径 for k in j: m_url.append(k['pic_url']) #append:在数组最后插入新元素 m=0 for m_url in m_url: #图片下载 print('******'+str(m)+'.jpg *******'+'downloading') urllib.request.urlretrieve(m_url,address+str(m)+'.jpg') #这个是urllib的下载函数 参数:下载地址,下载路径 m=m+1 print('sucessful downliading!') path=createDir() #path数组成功返回 getImg('壁纸',50,path) print('所有图片都下载完成!')