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 的文章