import requests
import urllib.parse
import threading
#當(dāng)線程達(dá)到十個(gè)時(shí)就鎖住
thread_lock = threading.BoundedSemaphore(value=10)
#function:獲得json數(shù)據(jù)
#url:api
#page:返回json數(shù)據(jù)
def get_page(url):
#requests.get自帶json.load 用于獲取 page信息
page = requests.get(url)
#獲取url的內(nèi)容
page = page.content
#將字節(jié)轉(zhuǎn)換成utf-8格式
page = page.decode('utf-8')
return page
#function:獲得所有頁(yè)面的api
#label為你要搜索的關(guān)鍵字
#獲取所有頁(yè)面pages中的鏈接
def pages_from_duitang(label):
#創(chuàng)建pages 存放獲取到的鏈接并返回
pages = []
url = "https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}&limit=1000"
for index in range(0,3600,50):
#兩個(gè)變量分別替換兩個(gè)占位符{}
u = url.format(label,index)
page = get_page(u)
pages.append(page)
return pages
#function:獲取單個(gè)圖片地址
#page是從get_page請(qǐng)求回來(lái)的頁(yè)面信息
#startpage是開始匹配的部分
#endpart是字符串末尾匹配的部分
def findall_in_page(page,startpage,endpart):
#all_string存放所有的照片地址
all_string = []
end = 0
while page.find(startpage,end)!=-1:
#start為字符串開始的地址 ,從第end個(gè)字符開始查找,查找到第一個(gè)出現(xiàn)startpage的地址賦值給start
start = page.find(startpage,end)+len(startpage)
#從字符串第start位置開始查找,查到到第一個(gè)endpart字符串的位置
end = page.find(endpart,start)
#獲得從start開始到end為止的字符串 賦值給變量 string
string = page[start:end]
#存入列表中
all_string.append(string)
return all_string
#function:獲取所有的圖片地址
#pages:從url請(qǐng)求的所有的頁(yè)面信息
def pic_urls_from_pages(pages):
#print("啊哈,請(qǐng)給我一杯忘情水")
#創(chuàng)建列表,存放所有的圖片地址
pic_urls = []
#遍歷所有的頁(yè)面信息
for page in pages:
#獲取一個(gè)的圖片地址 賦值給urls
urls = findall_in_page(page,'path":"','"')
#print("urls is the {}".format(urls))
#將獲取到的單個(gè)圖片地址添加到列表pic_urls中
pic_urls.extend(urls)
return pic_urls
#function:下載圖片并命名
#url:下載圖片的地址
#n:照片的名字
def download_pics(url,n):
r = requests.get(url)
#print("我是r[]",r)
#生成圖片的相對(duì)地址
path = 'D:\\CodeProject\\pythonProject\\pics\\' + str(n) + '.jpg'
#以可讀寫的方式打開二進(jìn)制文件path
with open(path,'wb') as f:
#將r的內(nèi)容讀入到path的文件中
f.write(r.content)
#下載完畢,解鎖
thread_lock.release()
#funtion:主函數(shù)
#label:要爬取的關(guān)鍵字
def main(label):
print(label)
#將關(guān)鍵字傳入pages_from_duitang中,獲得對(duì)應(yīng)關(guān)鍵字的所有api 賦值給pages
pages = pages_from_duitang(label)
#將包含所有的api的pages傳入到pic_urls_from_pages中,獲得所有的圖片地址 賦值給pic_urls
pic_urls = pic_urls_from_pages(pages)
n = 0
#遍歷所有的圖片地址,傳入到下載函數(shù)中下載圖片
for url in pic_urls:
#n:待參數(shù)1:圖片的名稱
n+=1
print("正在下載第{}張圖片".format(n))
#上鎖
thread_lock.acquire()
#url:待傳入的參數(shù)2
t = threading.Thread(target=download_pics,args=(url,n))
t.start()
main("帥哥")
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

