Python爬取堆糖帅哥照片

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("帅哥")

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

posted @ 2019-07-03 15:10  Philtell  阅读(372)  评论(0编辑  收藏  举报