python3网络爬虫:爬取堆糖照片
首先对页面进行点击分析,查看如片,分析url.
# -*- coding: utf-8 -*- import requests import threading import urllib.parse #设置最大线程 开启10个线程就锁住 thread_lock = threading.BoundedSemaphore(value=10) 'https://www.duitang.com/napi/blog/list/by_search/?kw=%E6%A0%A1%E8%8A%B1&start=0&limt=100' #通过url 获取数据 #单个页面 def get_page(url): #requests.get 自带了json.loads page = requests.get(url) #提取需要的content page = page.content # 将bytes转成 字符串 page = page.decode('utf-8') return page #label为关键字 #取所有页面pages的链接 def pages_from_duitang(label): pages = [] url = 'https://www.duitang.com/napi/blog/list/by_search/?kw={}&type=feed&start={}&limt=100' #将中文转成url编码 label = urllib.parse.quote(label) for index in range(0, 110, 20): #将这两个变量替换占位符{} 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')) #page是get_page()返回的页面信息 #startpart和endpart是边界条件,两个给定的字符串 # 单个页面的对象,startpart 所要匹配字符1,匹配的字符2 def findall_in_page(page,startpart,endpart): print(page) all_strings = [] end = 0 # 从end这个字符串开始找,找startpart # .find()!=-1说明找到该字符串,返回的是该字符串的起始下标 while page.find(startpart,end) != -1: # 需要的图片的链接的起始位置start start = page.find(startpart, end)+len(startpart) # 从起始字符串开始找结束字符串 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":"','"') print(urls) 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) print(pages) 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('校花')