小甲鱼:爬虫 2 ----------爬取网页的图片

一般的网页,图片与下一个图片之间,在地址上提现出来就是数字的变化
第一张的网址为:
在这里插入图片描述
下一张的网址为:
在这里插入图片描述

特殊的网页会将其中的一串数字使用加密算法,让爬虫者看不出规律:
比如,第一张:
在这里插入图片描述
第二张:
在这里插入图片描述
这里的MjAyMDA4MDktMTIx其实就是加密信息:

点击进入这个密文解密网址

查询出来结果:20200809很明显是当前访问的日期小甲鱼:爬虫 2 ----------爬取网页的图片_第1张图片
而 121 查看网页的信息:就是当前的第几张图片
小甲鱼:爬虫 2 ----------爬取网页的图片_第2张图片

获取当前日期的代码:
import datetime
time = datetime.datetime.now().strftime('%Y%m%d-')
import base64
# 获取经过base64加密后的字母串
def get_base64(s):  # 传入一个待加密的字符串t
    bs = str(base64.b64encode(s.encode("utf-8")), "utf-8")
    return bs

测试:将字符串为20200809-121加密,结果和网页地址对比,是一样的
小甲鱼:爬虫 2 ----------爬取网页的图片_第3张图片

爬取图片的代码

主方法:
1、先创建文件,命名为"ooxx"
2、get_page()函数是这个样子的:返回的是网页的数字部分在这里插入图片描述

def get_page(url):
    html = url_open(url).decode('utf-8')
    a = html.find('current-comment-page') + 23
    b = html.find(']', a)
    return html[a:b]
def downloadmm(folder="ooxx", pages=10):
    os.mkdir(folder)
    os.chdir(folder)

    url = 'http://jandan.net/ooxx/'
    page_num = int(get_page(url))

    for i in range(pages):  # 只获取前10页的数据
        page_num -= i
        page_url = url + get_base64(time + str(page_num)) + '#comments'

        # 找到当前页面的所有图片
        img_addrs = find_imgs(page_url)
        save_imgs(folder, img_addrs)

3、for i in range(pages): # 只获取前10页的数据是指的获取从当前页面,第一次减0,就是当前页面,第二次减1,就是下一个页面,以此类推,一共是10个页面,page_url:指的是每一页的地址

4、获取page_url:重点
测试:页码为121的页面地址能不能正确获取:
小甲鱼:爬虫 2 ----------爬取网页的图片_第4张图片
运行结果:
小甲鱼:爬虫 2 ----------爬取网页的图片_第5张图片
网页地址:
小甲鱼:爬虫 2 ----------爬取网页的图片_第6张图片
所以找到了页面的地址了,接下来就是获取页面的源代码,并且从源码中获取图片的位置
5、通过网址如何获取 html 页面内容:
设置请求头,目的是使爬从操作,可以拥有电脑的标识

import urllib.request
def url_open(url):
    # 设置文件头
    header = {"User-Agent":
                 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
    req = urllib.request.Request(url, headers=header)
    # 现在开始访问
    response = urllib.request.urlopen(url)
    html = response.read()
   # print(html)
    return html

6、find_imgs 函数:通过html内容获取图片的地址,还没讲正则表达式, 暂时使用find方法
就是获取了img src后面,.jpg 前面的内容。然后设置一个循环,查找出当前页面的所有符合条件的图片,然后保存


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)  # 没找到就会返回-1
        if b != -1:
            img_addrs.append(html[a + 9:b + 4])
        else:
            b = a + 9

        a = html.find('img src=', b)
        # img_addrs存着的是所有的图片地址
    for each in img_addrs:
        print(each)

7、找到地址之后,就是下载并且 保存了

def save_imgs(folder, img_addrs):
    for each in img_addrs:
        filename = each.split('/')[-1]
        with open(filename,'wb') as f:
            img = url_open(each)
            f.write(img)

filename就是给图片取一个名字,img = url_open(each)又调用该函数

访问该页面老是报403,我也没辙了
小甲鱼:爬虫 2 ----------爬取网页的图片_第7张图片
其他网页 试过,可以使用

import urllib.request
import os
import datetime
import base64

time = datetime.datetime.now().strftime('%Y%m%d-')


# 获取经过base64加密后的字母串
def get_base64(s):  # 传入一个待加密的字符串t

    bs = str(base64.b64encode(s.encode("utf-8")), "utf-8")
    return bs


# print(get_base64(time + '111'))

# 打开页面
def url_open(url):
    # 设置文件头
    header = {"User-Agent":
                 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
    req = urllib.request.Request(url, headers=header)
    # 现在开始访问
    response = urllib.request.urlopen(url)
    html = response.read()
    print(html)

    return html


def get_page(url):
    html = url_open(url).decode('utf-8')

    a = html.find('current-comment-page') + 23
    b = html.find(']', a)

    return html[a:b]


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)  # 没找到就会返回-1
        if b != -1:
            img_addrs.append(html[a + 9:b + 4])
        else:
            b = a + 9

        a = html.find('img src=', b)
        # img_addrs存着的是所有的图片地址
    for each in img_addrs:
        print(each)


def save_imgs(folder, img_addrs):
    for each in img_addrs:
        filename = each.split('/')[-1]
        with open(filename,'wb') as f:
            img = url_open(each)
            f.write(img)




def downloadmm(folder="ooxx", pages=10):
    os.mkdir(folder)
    os.chdir(folder)

    url = 'http://jandan.net/ooxx/'
    page_num = int(get_page(url))

    for i in range(pages):  # 只获取前10页的数据
        page_num -= i
        page_url = url + get_base64(time + str(page_num)) + '#comments'

        # 找到当前页面的所有图片
        img_addrs = find_imgs(page_url)
        save_imgs(folder, img_addrs)


if __name__ == '__main__':
    downloadmm()

你可能感兴趣的:(python)