基於 Python 的圖片爬蟲程序設計

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、設置代理服務器等方法來進行下載。本次圖片爬蟲程序的流程圖如下圖 所示。

基於 Python 的圖片爬蟲程序設計

2 圖片爬蟲具體實現

2.1 導入程序中所用到的第三方庫

#coding:utf-8

import requests

import time

import random

from bs4 import BeautifulSoup

基於 Python 的圖片爬蟲程序設計

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

基於 Python 的圖片爬蟲程序設計

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()


分享到:


相關文章: