爬蟲練習3 爬取堆糖網校花照片
阿新 • • 發佈:2017-12-03
ring http 正在 usr sts 多線程 src 技術 strings
知識點:
多線程的實現
圖片的下載及寫入
字符串高級查找
了解動態加載和json
request 的用法
獲取數據的api
‘https://www.duitang.com/napi/blog/list/by_search/?kw=%E6%A0%A1%E8%8A%B1&start=0&limt=1000‘
圖片路徑
"path": "https://b-ssl.duitang.com/uploads/item/201509/18/20150918195615_JfdKm.jpeg"
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: benjaminYang importrequests,threading import urllib.parse #設置最大線程 開啟30個線程就鎖住 thread_lock=threading.BoundedSemaphore(value=50) ‘https://www.duitang.com/napi/blog/list/by_search/?kw=%E6%A0%A1%E8%8A%B1&start=0&limt=1000‘ #通過url 獲取數據 def get_page(url): #requests.get 自帶了json.loads page=requests.get(url) page=page.content # 將bytes轉成 字符串 page=page.decode(‘utf-8‘) return page def pages_from_duitang(label): pages=[] url=‘https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}&limt=1000‘ #將中文轉成url編碼 label=urllib.parse.quote(label) #0-3600 步長100 for index inrange(0,3600,50): #將這兩個變量替換占位符{} u=url.format(label,index) page=get_page(u) pages.append(page) return pages # print(get_page(‘https://www.duitang.com/napi/blog/list/by_search/?kw=%E6%A0%A1%E8%8A%B1&start=0&limt=1000‘)) # 單個頁面的對象,startpart 所要匹配字符1,匹配的字符2 def findall_in_page(page,startpart,endpart): all_strings=[] end=0 # -1代表找不到 意思就是匹配到就執行循環 while page.find(startpart,end) !=-1: #匹配第一個字符,從下標0開始匹配到的位置下標,並將字符長短傳給start變量 start=page.find(startpart,end)+len(startpart) # 將從第一個需要匹配的字符串後面的字符開始,匹配第二個需要匹配的字符出現的位置,並將這個下標值賦給end變量 end=page.find(endpart,start) #切片 取兩個所要匹配字符 之間的部分也就是圖片url string=page[start:end] #存入列表 all_strings.append(string) return all_strings # "path": "https://b-ssl.duitang.com/uploads/item/201708/20/20170820215827_fa483.jpeg" def pic_urls_from_pages(pages): pic_urls=[] for page in pages: urls=findall_in_page(page,‘path":"‘,‘"‘) pic_urls.extend(urls) # 合並列表 return pic_urls def download_pics(url,n): r=requests.get(url) path=‘pics/‘+ str(n) + ‘.jpg‘ with open(path,‘wb‘) as f: f.write(r.content) #下載完了,解鎖 thread_lock.release() def main(label): pages=pages_from_duitang(label) pic_urls=pic_urls_from_pages(pages) n=0 for url in pic_urls: n +=1 print(‘正在下載第{}張圖片‘.format(n)) #上鎖 thread_lock.acquire() #下載 這個方法丟進線程池 t=threading.Thread(target=download_pics,args=(url,n)) t.start() main(‘校花‘)
此學習資源來自--潭州Python學院
爬蟲練習3 爬取堆糖網校花照片