【2】基于python的网路爬虫笔记(实战)

上一章讲了如何通过使用pyhthon的方法实现代理访问,这一章讲进行实战,比一个网站的图片自动化下载下来

目标网站:自己寻找任何一个图片网站,下面直讲解方法


1.分析网站元素,通过浏览器的审查元素查看

【2】基于python的网路爬虫笔记(实战)_第1张图片

  1.  首先每张图片都有一个指向这组图的链接,要获取这个链接添加都一个列表里,然后在一个个遍历去下载对应链接里的图片,这里用get_page_num_1(url)来处理
  2. 进到每组图里,不会一页显示完所有的图片,此时用一个列表把这组图对应的所有链接存到一个列表里,用get_page_num_2(url)进行处理
  3. 如下图首页里有50页,使用detect_page_num(url)来查看有多少页,然后一页一页的遍历,在重复1.2步即可【2】基于python的网路爬虫笔记(实战)_第2张图片
  4. 未使用然和正则表达式,都是打开网页后用find方法寻找关键字
import urllib.request
import os
import random
ipList=['114.244.14.38:8060']
#,'27.208.94.59:8060','221.193.177.45:8060',

def url_open(url):
    #proxy_support = urllib.request.ProxyHandler({'http':random.choice(ipList)})
#使用choice函数随机选择其中一个IP,这将会返回一个handler给proxy_support

    #opener = urllib.request.build_opener(proxy_support)
#创建 opener

    #opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36')]
#设置user-agent
    #urllib.request.install_opener(opener)
#因为使用了urlopen访问所以要安装该opener
    req=urllib.request.Request(url)
    response=urllib.request.urlopen(req)
    html=response.read()
    return html

def get_page_num_1(url): #找到http:xx'各个套图的链接,写在列表里
    html=url_open(url).decode('gbk')
    page_addrs=[]
    a=html.find('_blank')+14
 
    while a!=-1:
           b=html.find('.html',a,a+100)
      
           if b != -1:
               page_addrs.append(html[a+14:b])
               
           else:
               b=a+14
           a=html.find('_blank',b)
    print(page_addrs)

    return page_addrs
def get_page_num_2(url):  #找到各套路链接以后,翻页
    page_addrs_2=[]

    temp=[]
    temp=get_page_num_1(url)
    for each in temp:
        new_page='http:xx'+each+".html"
        print("当前下载网页为")
        print(new_page)
        html=url_open(new_page).decode("GBK")
        a=html.find("本组图片")+13
        b=html.find("",a)
        num=int(html[a:b])
        for each1 in range(1,num+1):
            if each1==1:
                page_addrs_2.append('http:xx'+each+'.html')
                print('列表内容')
                print(page_addrs_2)
            else:
                page_addrs_2.append('http:xx'+each+'_'+str(each1)+'.html')
                print('列表内容')
                print(page_addrs_2)
    return page_addrs_2
            
        

def find_img(url_page,count):#在网页中下载图片
    html=url_open(url_page).decode('GBK')
    print(url_page)
    img_addrs=[]
    a=html.find("img src=")
    C=html.find("class=\"left\">")+13
    D=html.find("",C)
    count=html[C:D]
    print(count)
    
    while a != -1:
        b=html.find(".jpg",a,a+255)
        if b != -1:
            if html[a+9:b+4]=='../../Image2/logo.jpg':
                print("不下载图标")
            else:
                img_addrs.append(html[a+9:b+4])
                print(html[a+9:b+4])
                save_img('ooxx',html[a+9:b+4],count)
        else:
            b=a+9
        a=html.find('img src=',b)
    return img_addrs

def download(folder='ooxx'):     #通过列表里的链接一个个去下载图片
    if  os.path.exists('C:\\Users\\威\\Desktop\\ooxx')==True:
          os.chdir(folder)

    else:
        os.mkdir(folder)
        os.chdir(folder)
    page_addrs={}
    count=0
    url='http:XXXX
    page_num=detect_page_num(url)#侦查有多少页
    
    for count in range(1,page_num+1):
        print("正在下载第一页")
        if count==1:
            page_addrs=get_page_num_2(url)
        else:
            url=url+str(count)+'.html'
            page_addrs=get_page_num_2(url)
        for each in page_addrs:
            count+=1
            img_addrs=find_img(each,count)

    #save_img(folder,img_addrs)
        

    
def save_img(folder,img_addrs,count):
    #for each in img_addrs:
        filename=img_addrs.split('/')[-1]
        print(count+filename)
        with open(count+filename,'wb')  as f: #先创建名字,在用urlopen打开图片
            #有with会自动调用close
            img=url_open(img_addrs)
            f.write(img)
def detect_page_num(url):#侦查当前网页有多少页
    html=url_open(url).decode('GBK')
    a=html.find('当前')+7
    b=html.find('页',a)+1
    print('当前分类共有%s页'%html[a:b-2])
    return int(html[a:b-2])

    
    
            



if __name__=='__main__':
    download()

有不明白的地方,或者想交流的朋友,欢迎添加QQ:498721954


 

你可能感兴趣的:(爬虫)