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


分享到:


相關文章: