这个案例在其他地方适用性很高的,完整的视频链接:http://www.iqiyi.com/w_19rtu8xbyt.html 1、字符串查找 String.find('aaa',pos)查找的字符串,pos为查找位置,返回为开头位置 def find_in_page(page,startpart,endpart): image_url=[] end=0 while page.find(startpart,end)!=-1: start=page.find(startpart,end)+len(startpart) end=page.find(endpart,start) string=page[start:end] image_url.append(string) return image_url 也可以用正则匹配 2.线程 使用threading库 # 设置线程锁 thread_lock = threading.BoundedSemaphore(value=10) thread_lock.acquire() t=threading.Thread(target=download_pic,args=(pic_url, label, n)) t.start() thread_lock.release() 使用线程锁进行线程任务,要记得任务完成后释放线程 import requests import urllib.parse import urllib.request import threading #设置最大线程锁,value为10表示一次接收最多10个线程 thread_lock = threading.BoundedSemaphore(value=10) #通过network抓包,获取的ajax动态获取图片链接,其中limit字段是分析服务器返回的jason数据自己加上去的 url = 'https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}&limit=100' #获取单页url的内容 def get_page(url): response = requests.get(url) #二进制byte转化为字符串 return response.content.decode('utf-8') #label为我们在堆糖网搜索的内容,获取的结果为所有url的返回内容 def pages_from_duitang(label): #把中文转化为向服务器请求数据字段用的Ascii码 label = urllib.parse.quote(label) page_list = [] for index in range(0,3600,100): string = url.format(index,label) page_list.append(get_page(string)) return page_list #解析单个网页返回内容里的所有图片地址,完全通过字符串处理,没有用正则或者bs4处理 #在page内容里找,startpart为‘path:“’,endpart内容为'"'的字符串,刚好就是图片地址 def findall_in_page(page, startpart, endpart): end = 0 string_list = [] while page.find(startpart,end) != -1 : #让start起始位置从开始找到startpart的地方,挪到图片地址字符串的第一个位置 start = page.find(startpart,end) + len(startpart) #end为图片地址的末尾 end = page.find(endpart,start) #截断字符串的内容刚好为url的位置 string = page[start:end] string_list.append(string) return string_list #下载图片,并将图片存入本地pics文件夹,此处最耗时的内容开启多线程服务 def download_pics(url, filename): urllib.request.urlretrieve(url, 'pics/' + filename) #下载完内容,线程解锁 thread_lock.release() def if __name__ == '__main__': pages_list = pages_from_duitang("明星") picures_list = [] for page in pages_list: pictures = [] pictures = findall_in_page(page=page,startpart="\"path\":\"",endpart="\"") #把列表内容挂在另外一个列表末尾 picures_list.extend(pictures) print('total images:' + str(len(picures_list))) n = 0 for picure in picures_list: n += 1 print(" 正在下载第{}张图片".format(n)) #从url末尾获取文件名称 filename = picure.split('/')[-1] #上锁并开启多线程服务 thread_lock.acquire() t = threading.Thread(target=download_pics,args=(picure,filename)) t.start()