Python使用代理爬取网站内图片

开发工具与关键技术:Python IDEL、Python
作者:曾浩源
撰写时间:2019年08月14日

想要爬取网站内的图片,首先想到的是引用urllib模块内的request(打开和浏览url中内容),然后就是os模块(文件/目录方法)创建文件夹和保存图片,最后就是引用random模块的choice()方法返回元组或列表内的随机项,从而分配代理浏览网站。

import urllib.request
import os
import random

引用所需要的模块后,就是看看使用代理爬取网站内图片需要哪些流程,如:

1、首先肯定是创建文件夹(创建完成后将工作目录切换到新建的文件夹内)
2、打开网址(这里使用代理就不分开写了)
3、获取该网站图片分页的页数(如果没有分页该方法可以不用)
4、得到某一页后,获取该页的所有图片(确定网址后获取该页面的所有图片)
5、最后就是保存图片到文件夹

一、主函数

def dowmload_mm(url="http://jandan.net/ooxx/",folder="OOXX",pages=24):#主函数
    if not os.path.exists(folder):
        os.mkdir(folder)#创建文件夹
    os.chdir(folder)#将工作目录切换到要保存图片的目录

    page_num = get_page(url)

    for i in range(pages):
        page = page_num - (i + 1)
        page_url = url + 'page-' + str(page) + "#comments"
        img_addrs = find_imgs(page_url)
        save_imgs(folder,img_addrs)

1、该主函数有三个函数,并且都有默认值(url网址、folder保存的文件夹、pages爬取的页数)
2、判断文件夹是否存在,不存在就新建,然后将工作目录切换到新建的文件夹
3、打开网址
4、for循环,循环一次打开不同的页数,然后获取那一页的图片,最后保存图片,之后执行下一页

二、打开网址

def url_open(url):#打开网址
    req = urllib.request.Request(url)
    req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400")
    #使用代理
    proxies = ['171.39.11.30:8123', '222.222.250.143:8060', '182.101.207.11:8080']
    proxy = random.choice(proxies)
    proxy_support = urllib.request.ProxyHandler({'https':proxy})
    opener = urllib.request.build_opener(proxy_support)
    urllib.request.install_opener(opener)

    response = urllib.request.urlopen(url)
    html = response.read()
    
    return html
1、使用urllib模块内request访问网址,然后添加一个HTTP报头(用于防止被认出是代码执行访问网址)
2、声明一个列表存放代理IP,使用random模块的choice()方法随机返回一个代理IP对网址进行访问
3、使用urllib.request的urlopen()函数打开url,返回response后使用read()方法读取,获取该网址的html页面(现在还不是utf-8编码),返回html

三、获取该网站图片分页的页数

def get_page(url):#根据某页数获取该页的网址
    html = url_open(url).decode('utf-8')
    a = html.find('current-comment-page') + 23
    b = html.find(']', a)
    
    return int(html[a:b])
1、首先需要打开网址才内获取该网站有多少页,调用打开网址方法,将得到的html转为utf-8编码
2、根据该网站内实际情况获取总页数(有很多种方法,如:正则获取,标签获取,字符串搜索获取等等)
3、返回获取到页数

四、得到某一页后,获取该页的所有图片

def find_imgs(url):#得到某一页后,获取该页的所有图片
    html = url_open(url).decode('utf-8')
    img_addrs = []
    a = html.find('img src=')

    while a != -1:
        b = html.find('.jpg', a, a + 255)
        if b != -1:
            img_addrs.append(html[a+11:b+4])
        else:
            b = a + 9

        a = html.find('img src=', b)
    
    return img_addrs
1、首先需要打开网址才内获取该网站有多少页,调用打开网址方法,将得到的html转为utf-8编码
2、声明一个列表存放获取到的图片链接,然后根据网址的实际情况获取图片的链接,如(正则获取,标签获取,字符串搜索获取等等)
3、返回图片链接列表

五、保存图片到文件夹

def save_imgs(folder,img_addrs):#保存图片到文件夹
    for each in img_addrs:
        filename = each.split('/')[-1]  
        with open(filename, 'wb') as f:
            img = url_open('http://' + str(each))
            f.write(img)
    
1、该方法的参数有文件夹名称和图片链接列表,根据图片链接列表for循环
2、图片名称由图片链接根据/分割的最后一个字符串命名
3、最后就是打开文件,并拥有读取写入权限,打开图片链接,爬取图片,写入文件

最后的最后就是调用主函数,如果要保存为一个py文件需要:


#一个.py文件,如果是自身在运行,那么他的__name__值就是"__main__"
if __name__ == '__main__':
    dowmload_mm()
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值