Python爬虫案例:大批量抓取堆糖网图片

这个案例在其他地方适用性很高的,完整的视频链接: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()

你可能感兴趣的:(Python)