爬蟲入門--按關鍵字爬取網絡圖片

網絡爬蟲第一站,我參考一些資料,寫下了個人的第一個簡單地網絡爬蟲程序,麻雀雖小,五臟俱全。
該爬蟲程序的功能是,根據輸入的圖片關鍵字以及所要的圖片數量,從百度圖片上下載設定數量的對應主題圖片,並保存到本地對應文件夾中。開發過程中涉及到的網絡爬蟲知識,主要有以下幾個方面,一是python基礎知識,二是python urllib2庫的使用,三是實際爬取過程中出現的各種網絡錯誤及解決方法,四是windows下中文亂碼問題,五是python文件操作知識。
先上完整的代碼,後面再作簡要說明:

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 25 19:50:42 2016

@author: Administrator
"""
import re
import os
import urllib2
import cookielib
import sys 
class bdImg:
    baseUrl = "http://image.baidu.com/search/index?tn=baiduimage&cl=2&lm=-1&st=-1&sf=1&ic=0&nc=1&se=1&showtab=0&fb=0&face=0&istype=2&ie=utf-8"
    maxNum = 10
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
    #初始化
    def __init__(self,keyWord,maxNum):
        self.baseUrl = self.baseUrl+"&word="+keyWord
        self.keyWord = keyWord
        self.maxNum = maxNum

    #獲取網頁源代碼
    def getSourceCode(self,offset):
        request1 = urllib2.Request(self.baseUrl+"&pn="+str(offset))
        response = urllib2.urlopen(request1)
        return response.read().decode("utf-8")
    #根據圖片鏈接,獲取圖片數據
    def getFileData(self,url):
        try:
            cj=cookielib.LWPCookieJar()
            opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
            urllib2.install_opener(opener)

            req=urllib2.Request(url = url,headers = self.headers)
            operate=opener.open(req)
            data=operate.read()
            return data
        except BaseException, e:
            print e
            return None
    #按關鍵字查找並保存圖片數據      
    def search(self):
        i=0
        pageOffset = 1
        #創建關鍵字對應文件夾
        if(False == os.path.exists(self.keyWord)):
            os.makedirs(self.keyWord)
        while(i<self.maxNum):
            source = self.getSourceCode(pageOffset)
            pattern = re.compile('"objURL":"(.*?)",',re.S)
            items = re.findall(pattern,source)
            if 0>=len(items):
                break
            for item in items:
                data = self.getFileData(item)
                if(None!=data):
                    fp = open(self.keyWord+"/"+str(i)+".jpg",'wb')
                    fp.write(data)
                    fp.flush()
                    fp.close()
                    print item,"  ",str(i)
                    i+=1
                if(i>=self.maxNum):
                    break
            pageOffset+=len(items)


reload(sys) 
sys.setdefaultencoding('utf8')
key = str(raw_input(u"請輸入圖片搜索的關鍵詞:")).decode("gbk")
num = int(raw_input(u"請輸入圖片數量:"))
bdimg = bdImg(key,num)
bdimg.search()

需要說明是,百度圖片搜索鏈接中,我所用到的兩個關鍵字段,一個是word,它代表着圖片搜索的關鍵字,另一個是pn,它代表着當前頁面顯示的首幅圖片位置偏移。由於百度圖片並沒有頁面編號這一參數,它是通過下拉自動刷新實現的,試驗發現可以改變pn值達到翻頁的效果。

發佈了40 篇原創文章 · 獲贊 90 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章