import requests
import urllib.parse
import threading
#当线程达到十个时就锁住
thread_lock = threading.BoundedSemaphore(value=10)
#function:获得json数据
#url:api
#page:返回json数据
def get_page(url):
#requests.get自带json.load 用于获取 page信息
page = requests.get(url)
#获取url的内容
page = page.content
#将字节转换成utf-8格式
page = page.decode('utf-8')
return page
#function:获得所有页面的api
#label为你要搜索的关键字
#获取所有页面pages中的链接
def pages_from_duitang(label):
#创建pages 存放获取到的链接并返回
pages = []
url = "https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}&limit=1000"
for index in range(0,3600,50):
#两个变量分别替换两个占位符{}
u = url.format(label,index)
page = get_page(u)
pages.append(page)
return pages
#function:获取单个图片地址
#page是从get_page请求回来的页面信息
#startpage是开始匹配的部分
#endpart是字符串末尾匹配的部分
def findall_in_page(page,startpage,endpart):
#all_string存放所有的照片地址
all_string = []
end = 0
while page.find(startpage,end)!=-1:
#start为字符串开始的地址 ,从第end个字符开始查找,查找到第一个出现startpage的地址赋值给start
start = page.find(startpage,end)+len(startpage)
#从字符串第start位置开始查找,查到到第一个endpart字符串的位置
end = page.find(endpart,start)
#获得从start开始到end为止的字符串 赋值给变量 string
string = page[start:end]
#存入列表中
all_string.append(string)
return all_string
#function:获取所有的图片地址
#pages:从url请求的所有的页面信息
def pic_urls_from_pages(pages):
#print("啊哈,请给我一杯忘情水")
#创建列表,存放所有的图片地址
pic_urls = []
#遍历所有的页面信息
for page in pages:
#获取一个的图片地址 赋值给urls
urls = findall_in_page(page,'path":"','"')
#print("urls is the {}".format(urls))
#将获取到的单个图片地址添加到列表pic_urls中
pic_urls.extend(urls)
return pic_urls
#function:下载图片并命名
#url:下载图片的地址
#n:照片的名字
def download_pics(url,n):
r = requests.get(url)
#print("我是r[]",r)
#生成图片的相对地址
path = 'D:\\CodeProject\\pythonProject\\pics\\' + str(n) + '.jpg'
#以可读写的方式打开二进制文件path
with open(path,'wb') as f:
#将r的内容读入到path的文件中
f.write(r.content)
#下载完毕,解锁
thread_lock.release()
#funtion:主函数
#label:要爬取的关键字
def main(label):
print(label)
#将关键字传入pages_from_duitang中,获得对应关键字的所有api 赋值给pages
pages = pages_from_duitang(label)
#将包含所有的api的pages传入到pic_urls_from_pages中,获得所有的图片地址 赋值给pic_urls
pic_urls = pic_urls_from_pages(pages)
n = 0
#遍历所有的图片地址,传入到下载函数中下载图片
for url in pic_urls:
#n:待参数1:图片的名称
n+=1
print("正在下载第{}张图片".format(n))
#上锁
thread_lock.acquire()
#url:待传入的参数2
t = threading.Thread(target=download_pics,args=(url,n))
t.start()
main("帅哥")