網絡爬蟲第一站,我參考一些資料,寫下了個人的第一個簡單地網絡爬蟲程序,麻雀雖小,五臟俱全。
該爬蟲程序的功能是,根據輸入的圖片關鍵字以及所要的圖片數量,從百度圖片上下載設定數量的對應主題圖片,並保存到本地對應文件夾中。開發過程中涉及到的網絡爬蟲知識,主要有以下幾個方面,一是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值達到翻頁的效果。