Python爬蟲, 抓取百度圖片

#!/usr/bin/env python 
# -*- coding: utf-8 -*-
# @Time    : 11/23/2019 4:06 PM
# @Author  : DeltaT
# @File    : 百度圖片爬蟲.py

"""爬蟲下載百度圖片"""
import re
import os
import urllib
import requests

search_kw = input('請輸入需要下載圖片種類: ')
begin_page_num = 0  # 請求次數
end_page_num = 30  # 每頁編號的增加值
page_num = 1  # 爬取的最大頁數
all_pic_urls = list()  # 保存所有url

# 循環抓取每一頁的圖片地址
while True:
    if begin_page_num > page_num:
        break
    print("第{}次發送請求".format(begin_page_num + 1))
    current_page_num = (begin_page_num - 1) * end_page_num  # 計算頁面url所需要的參數, 根據該參數拼湊url進行翻頁
    search_kw = urllib.parse.quote(search_kw, safe='/')
    url_begin = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word="
    url = url_begin + search_kw + "&pn=" + str(current_page_num) + "&gsm=" + str(hex(current_page_num)) + \
          "&ct=&ic=0&lm=-1&width=0&height=0"

    # 獲取當前頁面內圖片的url列表
    pic_urls = list()
    try:
        resp = requests.get(url)
        html = resp.text
        pic_urls = re.findall('"objURL":"(.*?)",', html, re.S)  # 正則匹配出需要的url
    except Exception as e:
        print(e)

    begin_page_num += 1
    all_pic_urls.extend(pic_urls)  # 將當前頁的url保存到所有url列表中

# 創建文件夾
dir_path = './baidu_images'
if not os.path.exists(dir_path):  # 判斷文件夾是否存在
    os.mkdir('./baidu_images')

# 下載所有圖片
pic_url_list = list(set(all_pic_urls))  # url去重
for index, pic_url in enumerate(pic_url_list):
    try:
        resp = requests.get(pic_url, timeout=5)
        pic_data = resp.content  # 圖片的二進制數據
        pic_path = dir_path + '/' + str(index) + '.jpg'  # 圖片的路徑文件名
        # 保存圖片的二進制數據
        with open(pic_path, 'wb') as f:
            f.write(pic_data)
            print('已下載第{}張圖片:{}'.format(str(index + 1), str(pic_url)))
    except Exception as e:
        print('第{}張圖片下載失敗:'.format(str(index + 1), str(pic_url)))
        print(e)
        continue


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章