1 圖片爬蟲的程序設計
1.1 編程環境
Windows7 操 作 系 統,Python3.6.5,IDE :Pychram。
1.2 程序開發思路
目前,很多靜態圖片網站都是二層結構,即首頁為各個圖片頁的索引 ( 如圖 1 所示 ),點擊後
進入具體的圖片展示頁面(如圖 2 所示)。本次爬蟲的設計思路 :由於圖片的索引頁的網址比較有規律,比如本次下載的圖片網址(http://www.ivsky.com/tupian/yuqi_t5382/index1.html), 各索引頁的
網址就是最後一部分有所變化,所以可以批量生成所有的索引頁(即使不能批量生成,也可以網頁解析來獲得索引頁地址),在索引頁中通過使用Beautifulsoup 庫來獲得各個圖片的具體展示頁面的網址,繼續在具體展示頁面中再次使用 Beautifulsoup庫獲得圖片的具體網址,並將所有的圖片網址存於一 個 列 表 中, 最 後 通 過 Requests 庫 從 列 表 中 一 一
下載圖片,從而實現自動批量下載。Python 有方便的第三方庫進行使用,本次程序的流程就是使用Beautifulsoup 庫來分析網頁鏈接、圖片鏈接,在使用Requests 庫進行頁面的訪問、文件的下載。在圖片的批量下載中,當然網站會設定一定的反爬蟲技術,此時可以通過添加 headers、設置代理服務器等方法來進行下載。本次圖片爬蟲程序的流程圖如下圖 所示。
2 圖片爬蟲具體實現
2.1 導入程序中所用到的第三方庫
#coding:utf-8
import requests
import time
import random
from bs4 import BeautifulSoup
2.2 構建圖片索引頁地址由於圖片的索引頁網址有一定的規律,可以直接構建圖片的網址並存於列表中。
indexpage=[]
for i in range(1,23):
indexpage.append("http://www.ivsky.com/
tupian/yuqi_t5382/index_"+str(i)+".html")
2.3 構建 Requests 的 headers
現 在 網 絡 普 遍 有 反 爬 蟲 機 制, 所 以 必 須 在requests 中必須加上請求頭。
UserAgent1="Mozilla/5.0 (Windows NT 6.1;
WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/63.0.3239.132 Safari/537.36"
headers={"User-Agent":UserAgent1}
2.4 通過 imgpageurl 函數獲得索引頁中所有圖片
的具體展示頁面的網址
def imgpageurl(indexpageurl):
res=requests.get(indexpageurl,headers)
res=res.text
soup=BeautifulSoup(res,'html.parser')
a=soup.find(class_="pli").find_all('a')
imgpage=[]
for i in a:
imgpage.append(i.attrs['href'])
per_imgpageurl=[]
y=len(imgpage)
int(y)
# 由於通過 BeautifulSoup 獲得的地址有重複,所以進行篩選
for i in range(0,y,2):
per_imgpageurl.append("http://www.
ivsky.com"+imgpage[i])
return per_imgpageurl
2.5 通過 img_down_url 函數在圖片的展示頁中獲得圖片的實際網址
def img_down_url(pageurl):
res=requests.get(pageurl)
res.encoding="utf-8"
res=res.text
soup=BeautifulSoup(res,'html.parser')
a=soup.find('img')['src']
return a
2.6 通過 loadDataset 函數從文件中讀取存取的網址,並生成 list此時獲得所有圖片的展示頁地址,這個是一個二維列表,每一項為單個索引頁中所有圖片展示頁的地址,列表項數為網站中所有索引頁的個數,為了便於以後的訪問,所以將二維列表改寫成一維列表。
def loadDatadet(infile):
f = open(infile, 'r')
sourceInLine = f.readlines()
dataset = []
for line in sourceInLine:
temp1 = line.strip('\\n')
temp2 = temp1.split('\\t')
dataset.append(temp1)
return dataset
all_perimg_url=[]
for i in indexpage:
all_perimg_url.append(imgpageurl(i))
imgurl=[]
for i in range(0,22):
for j in range(0,20):
imgurl.append(all_perimg_url[i][j])
2.7 獲得所有圖片展示頁的網址由於短時間集中訪問會被網站屏蔽 IP 地址,為了便於程序的運行,將所有圖片的展示頁面地址,存於文本文件中,便於以後的使用,每一行為一個地址。
file=open("./1.txt",'w')
for line in imgurl:
file.write(line+'\\n')
file.close()
2.8 得到所有圖片文件的實際地址,並存於文本文件中
infile="./1.txt"
dataset=loadDatadet(infile)
img=[]
for i in dataset:
img.append(img_down_url(i))
file=open("./2.txt",'a')
for line in img:
file.write(line+'\\n')
file.close()
閱讀更多 907cntop 的文章