#!/usr/bin/env python
# -*- coding:utf-8 -*-
# python3.0語法
# 用 python3 CaptureData 調用python文件
import os
import re
import urllib
import json
import socket
import urllib.request
import urllib.parse
import urllib.error
# 設置超時
import time
timeout = 5
socket.setdefaulttimeout(timeout)
class Crawler:
? ? # 睡眠時長
? ? __time_sleep = 0.1
? ? __amount = 0
? ? __start_amount = 0
? ? __counter = 0
? ? headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
? ? # 獲取圖片url內(nèi)容等
? ? # t 下載圖片時間間隔
? ? def __init__(self, t=0.1):
? ? ? ? self.time_sleep = t
? ? # 保存圖片
? ? def __save_image(self, rsp_data, word):
? ? ? ? if not os.path.exists("./" + word):
? ? ? ? ? ? os.mkdir("./" + word)
? ? ? ? # 判斷名字是否重復,獲取圖片長度
? ? ? ? self.__counter = len(os.listdir('./' + word)) + 1
? ? ? ? for image_info in rsp_data['imgs']:
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? time.sleep(self.time_sleep)
? ? ? ? ? ? ? ? fix = self.__get_suffix(image_info['objURL'])
? ? ? ? ? ? ? ? urllib.request.urlretrieve(image_info['objURL'], './' + word + '/' + str(self.__counter) + str(fix))
? ? ? ? ? ? except urllib.error.HTTPError as urllib_err:
? ? ? ? ? ? ? ? print(urllib_err)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? except Exception as err:
? ? ? ? ? ? ? ? time.sleep(1)
? ? ? ? ? ? ? ? print(err)
? ? ? ? ? ? ? ? print("產(chǎn)生未知錯誤,放棄保存")
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print("小黃圖+1,已有" + str(self.__counter) + "張小黃圖")
? ? ? ? ? ? ? ? self.__counter += 1
? ? ? ? return
? ? # 獲取后綴名
? ? @staticmethod
? ? def __get_suffix(name):
? ? ? ? m = re.search(r'\.[^\.]*$', name)
? ? ? ? if m.group(0) and len(m.group(0)) <= 5:
? ? ? ? ? ? return m.group(0)
? ? ? ? else:
? ? ? ? ? ? return '.jpeg'
? ? # 獲取前綴
? ? @staticmethod
? ? def __get_prefix(name):
? ? ? ? return name[:name.find('.')]
? ? # 開始獲取
? ? def __get_images(self, word='美女'):
? ? ? ? search = urllib.parse.quote(word)
? ? ? ? # pn int 圖片數(shù)
? ? ? ? pn = self.__start_amount
? ? ? ? while pn < self.__amount:
? ? ? ? ? ? url = 'http://image.baidu.com/search/avatarjson?tn=resultjsonavatarnew&ie=utf-8&word=' + search + '&cg=girl&pn=' + str(
? ? ? ? ? ? ? ? pn) + '&rn=60&itg=0&z=0&fr=&width=&height=&lm=-1&ic=0&s=0&st=-1&gsm=1e0000001e'
? ? ? ? ? ? # 設置header防ban
? ? ? ? ? ? print (url)
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? time.sleep(self.time_sleep)
? ? ? ? ? ? ? ? req = urllib.request.Request(url=url, headers=self.headers)
? ? ? ? ? ? ? ? page = urllib.request.urlopen(req)
? ? ? ? ? ? ? ? rsp = page.read().decode('unicode_escape')
? ? ? ? ? ? except UnicodeDecodeError as e:
? ? ? ? ? ? ? ? print(e)
? ? ? ? ? ? ? ? print('-----UnicodeDecodeErrorurl:', url)
? ? ? ? ? ? except urllib.error.URLError as e:
? ? ? ? ? ? ? ? print(e)
? ? ? ? ? ? ? ? print("-----urlErrorurl:", url)
? ? ? ? ? ? except socket.timeout as e:
? ? ? ? ? ? ? ? print(e)
? ? ? ? ? ? ? ? print("-----socket timout:", url)
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? # 解析json
? ? ? ? ? ? ? ? rsp_data = json.loads(rsp)
? ? ? ? ? ? ? ? self.__save_image(rsp_data, word)
? ? ? ? ? ? ? ? # 讀取下一頁
? ? ? ? ? ? ? ? print("下載下一頁")
? ? ? ? ? ? ? ? pn += 60
? ? ? ? ? ? finally:
? ? ? ? ? ? ? ? page.close()
? ? ? ? print("下載任務結束")
? ? ? ? return
? ? def start(self, word, spider_page_num=1, start_page=1):
? ? ? ? """
? ? ? ? 爬蟲入口
? ? ? ? :param word: 抓取的關鍵詞
? ? ? ? :param spider_page_num: 需要抓取數(shù)據(jù)頁數(shù) 總抓取圖片數(shù)量為 頁數(shù)x60
? ? ? ? :param start_page:起始頁數(shù)
? ? ? ? :return:
? ? ? ? """
? ? ? ? self.__start_amount = (start_page - 1) * 60
? ? ? ? self.__amount = spider_page_num * 60 + self.__start_amount
? ? ? ? self.__get_images(word)
if __name__ == '__main__':
? ? crawler = Crawler(0.05)
? ? # crawler.start('美女', 1, 2)
? ? crawler.start('室內(nèi)自拍', 3, 3)
#? ? crawler.start('帥哥', 5)