前言:

作为一个爱老婆的好男人,为女朋友做任何事去都是心甘情愿的,所以应我可爱的小仙女的要求写了一个爬堆糖的爬虫。 Duitang.py:

  • 组件调用:requests,urllib.parse,threading

  • 实现功能:先提供分析获取json链接及主要参数,再过滤出需要的图片(我没有使用字典的方法这里使用的是查找字符串方法),然后再通过图片链接提供提供下载。

#_*_coding:utf-8_*_
#by:linhut
#time:2017/9/11
#www.linhut.cn
# 'https://www.duitang.com/napi/blog/list/by_search/?kw=可爱仓鼠夫妇表情包%start=0&limit=1000'
#start是从第几张图片取

import requests
import urllib.parse
import threading
# 设置最大线程锁
thread_lock = threading.BoundedSemaphore(value=10)

#通过 url 获取到json数据
def get_page(url):
# requests.get 自带 json.loads
page = requests.get(url)
page = page.content
#将 bytes 转成字符串
page = page.decode('utf-8')
return page

#取json数据链接
def pages_from_duitang(label):
pages = []
url = 'https://www.duitang.com/napi/blog/list/by_search/?kw={}%start={}&limit=1000'
# 将中文转成url编码(会出现奇怪的广告跳转所以取消)
#label = urllib.parse.quote(label)
for index in range(0,36000,100):
u = url.format(label,index) #传入链接中
print('----------------正在为你搜索关键词。。。。。')
print("~ " + label + " ~")
page = get_page(u)
pages.append(page)
return pages

#查找字符串获取到图片链接方法
def findall_in_page(page,startpart,endpart):
all_strings = []
end = 0
while page.find(startpart,end) != -1: #当找得到
start = page.find(startpart,end) + len(startpart) #从0开始找,len为长度
end = page.find(endpart,start)
string = page[start:end]
all_strings.append(string)
return all_strings

#得到图片地址
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 = 'fan/' + 'fan'+ str(n) + '.jpg'
with open(path,'wb') as f: #w写入b数据类型
f.write(r.content)
#下载完了解锁
thread_lock.release()

#总函数,label为搜索关键词
def main(label):
pages = pages_from_duitang(label) #得到json链接
pic_urls = pic_urls_from_pages(pages) #得到图片地址uan
n = 0
for url in pic_urls:
n += 1
print ('正在下载弟 {} 张图片'.format(n))
print ("--------------------------------------")
# 上锁
thread_lock.acquire()
t = threading.Thread(target=download_pics,args=(url,n))
t.start()

main('可爱仓鼠夫妇表情包')

老实说采集的有一点多......所以就没有等采集完成就终止了