用Python 编写爬取百度图片,可用

新人上路, 老司机们请多多关照, 写的不好的地方, 还请多指教.

这里写图片描述

在很久很久以前, 我是一个苦逼的90后挨踢空穴老人, 一个人的夜里可是什么事都能干得出来! 这不, 我用我的把老师的图片给抓了过来…

言归正传, 本文介绍如何爬百度图片(滑稽.jpg):

  • 输入想要抓取的图片的关键字, 如”苍老师”, 然后输出百度图片搜索苍老师的所有图片
  • 采用翻页模式进行爬取
1. 分析网页结构

http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1497491098685_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1497491098685%5E00_1519X735&word=keyword

在浏览器中访问上述网址, 得到如下页面:

keyword=keyword

可以看到, 图片是以翻页的形式展现的. 其次, 搜索词”keyword”即为网址最后的word的值. 所以, 如果你想搜什么, 就把”word=”后面的keyword改成对应的词即可, 如”苍老师”(滑稽.jpg)

keyword=苍老师

然后看看这个网址是不是和我们之前设想的一样(即keyword=苍老师).
复制过来一看
http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1497576995049_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1497576995049%5E00_1519X735&word=%E8%8B%8D%E8%80%81%E5%B8%88

感觉不对劲, 我要的是”苍老师”, “%E8%8B%8D%E8%80%81%E5%B8%88”是什么鬼?!

????

原来, 还需要一顿操作:

>>>import urllib
>>>keyword="苍老师"
>>>keyword=urllib.quote(keyword)
>>>keyword
'%E8%8B%8D%E8%80%81%E5%B8%88'
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

现在, 就可以拼接网页了: ....(一大堆) + keyword="你想搜索的关键词"

2. 获取当前页的所有图片的链接

右键查看网页源代码之后, 发现:
这里写图片描述

图片的网址都是这样的格式: "objURL":"网址", 那就好办了, 直接用正则表达式就能解决

import re
pattern_pic = '"objURL":"(.*?)",'
# 这里的html就是网页的源代码的内容, 此处不介绍, 稍后给出
pic_list = re.findall(pattern_pic, html, re.S)  # 存储当前页的所有苍老师的图片的url的列表
   
   
  • 1
  • 2
  • 3
  • 4
3. 获取当前页的下一页的链接

下一页的链接同理根据正则得出:

pattern_fanye = '<a href="(.*)" class="n">下一页</a>'
fanye_url = re.findall(pattern_fanye, html)[0]  # 下一页的链接
   
   
  • 1
  • 2
4. 获取所有页的图片的链接

上面已经根据当前页的url得到了当前页的所有图片的链接, 以及下一页的url.
如此, 循环下去, 即可得到每一页的所有图片的链接.

all_pic_list = []  # 存储所有翻页的所有图片的链接的列表
while 1:
    all_pic_list.extend(pic_list)
    if 循环完所有翻页:
        break
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
5.下载图片

已知了图片链接, 直接下载即可

for i, pic_url in enumerate(all_pic_list):
    pic = requests.get(pic_url)
    string = str(i + 1) + '.jpg'
    with open(string, 'wb') as f:
        f.write(pic.content)
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
6.源代码
# coding=utf-8
"""根据搜索词下载百度图片"""
import re
import sys
import urllib

import requests


def get_onepage_urls(onepageurl):
    """获取单个翻页的所有图片的urls+当前翻页的下一翻页的url"""
    if not onepageurl:
        print('已到最后一页, 结束')
        return [], ''
    try:
        html = requests.get(onepageurl).text
    except Exception as e:
        print(e)
        pic_urls = []
        fanye_url = ''
        return pic_urls, fanye_url
    pic_urls = re.findall('"objURL":"(.*?)",', html, re.S)
    fanye_urls = re.findall(re.compile(r'<a href="(.*)" class="n">下一页</a>'), html, flags=0)
    fanye_url = 'http://image.baidu.com' + fanye_urls[0] if fanye_urls else ''
    return pic_urls, fanye_url


def down_pic(pic_urls):
    """给出图片链接列表, 下载所有图片"""
    for i, pic_url in enumerate(pic_urls):
        try:
            pic = requests.get(pic_url, timeout=15)
            string = str(i + 1) + '.jpg'
            with open(string, 'wb') as f:
                f.write(pic.content)
                print('成功下载第%s张图片: %s' % (str(i + 1), str(pic_url)))
        except Exception as e:
            print('下载第%s张图片时失败: %s' % (str(i + 1), str(pic_url)))
            print(e)
            continue


if __name__ == '__main__':
    keyword = '苍老师'  # 关键词, 改为你想输入的词即可, 相当于在百度图片里搜索一样
    url_init_first = r'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1497491098685_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1497491098685%5E00_1519X735&word='
    url_init = url_init_first + urllib.quote(keyword, safe='/')
    all_pic_urls = []
    onepage_urls, fanye_url = get_onepage_urls(url_init)
    all_pic_urls.extend(onepage_urls)

    fanye_count = 0  # 累计翻页数
    while 1:
        onepage_urls, fanye_url = get_onepage_urls(fanye_url)
        fanye_count += 1
        print('第%s页' % fanye_count)
        if fanye_url == '' and onepage_urls == []:
            break
        all_pic_urls.extend(onepage_urls)

    down_pic(list(set(all_pic_urls)))

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>
下面是Python代码示例,实现爬取百度图片中猫和狗的图片各100张,并将图片存入相应的文件夹cat和dog: ```python import requests import os def download_images(keyword, count, save_dir): url = 'https://image.baidu.com/search/acjson' params = { 'tn': 'resultjson_com', 'ipn': 'rj', 'ct': 201326592, 'is': '', 'fp': 'result', 'queryWord': keyword, 'cl': 2, 'lm': -1, 'ie': 'utf-8', 'oe': 'utf-8', 'adpicid': '', 'st': -1, 'z': '', 'ic': 0, 'word': keyword, 's': '', 'se': '', 'tab': '', 'width': '', 'height': '', 'face': 0, 'istype': 2, 'qc': '', 'nc': 1, 'fr': '', 'pn': 0, 'rn': count, 'gsm': '1e', '1520290518283': '' } headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299' } if not os.path.exists(save_dir): os.makedirs(save_dir) res = requests.get(url, params=params, headers=headers) data = res.json().get('data') for i in range(count): try: img_url = data[i].get('thumbURL') res = requests.get(img_url, headers=headers, timeout=10) with open(f'{save_dir}/{keyword}_{i}.jpg', 'wb') as f: f.write(res.content) print(f'Success: {keyword}_{i}.jpg') except: print(f'Error: {keyword}_{i}.jpg') continue if __name__ == '__main__': keyword_list = ['猫', '狗'] count = 100 for keyword in keyword_list: download_images(keyword, count, f'{keyword}') ``` 解释一下代码: 1. 首先定义了`download_images`函数,用于下载指定关键字的图片,其中`keyword`表示关键字,`count`表示需要下载的图片数量,`save_dir`表示存储图片的目录。 2. 定义请求的url和参数,其中`keyword`、`rn`参数分别表示关键字和每次请求的图片数量。 3. 定义请求的headers,这里使用了一个假的User-Agent,因为百度图片搜索接口有反爬虫机制,在请求时需要模拟浏览器的User-Agent。 4. 判断存储图片的目录是否存在,如果不存在则创建。 5. 发送HTTP GET请求并解析响应的json数据,获取到图片URL和对应的保存路径后,发送HTTP GET请求下载图片,并将图片保存到本地。 6. 在主函数中,定义一个关键字列表和需要下载的图片数量,遍历关键字列表,分别下载猫和狗的图片。 注意事项: 1. 在请求百度图片搜索接口时,需要使用一个假的User-Agent,否则可能会受到反爬虫机制的限制。 2. 在下载图片时,需要注意异常处理,因为不是所有的图片URL都是可用的,可能会出现下载超时、网络异常等情况。 3. 在保存图片时,建议使用`with open()`语句,以确保文件对象能够正常关闭,避免文件句柄泄漏和资源浪费。 4. 如果需要增加下载图片的数量,可以调整`count`参数,但需要注意请求的次数不要超过接口的限制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值