爬百度图片

爬百度图片

为什么要爬

有时候不想看图片就想把图片批量下载下来看

思路

  1. 找到网页的规律
  2. 下载图片
  3. 保存图片

代码

1. 找到网页规律

#在百度图片输入:王者荣耀
https://image.baidu.com/search/index?
tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1508171907771_R&pv
=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-
8&word=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80
# 在百度图片中输入:梦幻西游
https://image.baidu.com/search/index?
tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1508173226666_R&pv
=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-
8&word=%E6%A2%A6%E5%B9%BB%E8%A5%BF%E6%B8%B8

主要是word后面加密的码不一样%E6%...%B8,所以代码可以写成以下形式

# 导入正则表达式
import re
# 导入requests包用来获取网页
import requests
#定义获取url函数
def get_url():
    # 输入想抓取图片的内容
    type = input("请输入图片类型:")
    # 网址拼接
    url ='https://image.baidu.com/search/index?' \
        'tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1508171907771_' \
        'R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&' \
        'ie=utf-8&word='+type
image.png

接着用正则表达式抓取网页内图片的连接

  • 先把鼠标移动到图片上面,然后右键,在菜单栏里面选择“查看”


    image.png
  • 然后双击地址,复制此连接,按ctrl+f 搜索
    你会搜到3个连接
    thumbURL:缩小的图片连接
    middleURL:中等的图片连接
    hoverURL: 鼠标移动到图片时,图片的样子
    objURL: 这就是我们要找的图片连接
爬百度图片_第1张图片
image.png
    # 获取网页内容
    html = requests.get(url).text
    # 用正则表达式抓取,re.S 意思是抓取所有的内容,包括换行符。
    pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
    # 返回匹配到的连接地址
    return pic_url

2. 下载图片

# 定义下载图片函数
def download_pic(pic_url):
    #第一个图片命名为0
    i = 0
    # 遍历所有匹配到的图片
    for each in pic_url:
        try:
            # 获取图片,设施延时(不设置容易被禁号)
            pic = requests.get(each, timeout=10)
        # 如果网页无法连接
        except requests.exceptions.ConnectionError:
            # 打印“当前图片无法下载”
            print('当前图片无法下载')
            # 跳过这个报错,继续下一张图
            continue
        #先在当前目录下建立一个picture的文件夹,建立图片路径
        string = 'picture/'+str(i)+'.jpg'
        #调用写入图片函数
        write_pics(string, pic)
        # 打印图片名称
        print(string)
        # 下一个图片命名+1
        i += 1
爬百度图片_第2张图片
image.png

3. 保存图片

# 定义写入图片函数
def write_pics(string,pic):
    #打开图片,图片用二进制写入,所以用’wb‘
    fp = open(string,'wb')
    # 写入图片
    fp.write(pic.content)
    # 关闭文件
    fp.close()
爬百度图片_第3张图片
image.png

4. 总代码

import re
import requests

def get_url():
    type = input("请输入图片类型:")
    url ='https://image.baidu.com/search/index?' \
        'tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1508171907771_' \
        'R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&' \
        'ie=utf-8&word='+type
    html = requests.get(url).text
    pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
    return pic_url

def download_pic(pic_url):
    i = 0
    for each in pic_url:
        try:
            pic = requests.get(each, timeout=10)
        except requests.exceptions.ConnectionError:
            print('当前图片无法下载')
            continue
        string = 'picture/'+str(i)+'.jpg'
        write_pics(string, pic)
        print(string)
        i += 1
def write_pics(string,pic):
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()

if __name__=='__main__':
    pic_url = get_url()
    download_pic(pic_url)

关羽镇楼

爬百度图片_第4张图片
image.png

你可能感兴趣的:(爬百度图片)