爬取图片以及遇到的问题
以爬取zol的动漫壁纸为例:
动漫壁纸数量很大需要用循环来解决,自己下载壁纸的基本过程是
在总网页中选取链接--找到自己要的分辨率--下载及按网页中的名字重命名
分解问题:
1:在动漫页面中爬取列表中的各个壁纸子网页链接以及“下一页”对应的链接(函数循环访问下一页链接并记录子网页的链接,下一页链接)
2:在子网页连接中获取所需分辨率的链接(注:该链接要链接到一个纯图片的网页以便记录图片的编码)
3将图片编码储存在指定位置
import requests
import re
#引入第三方库
#第一步,获取列表中的子链接以及下一页的链接
def firststep( url ):
#定义函数名firststep,参数url是网址
pageHtml=requests.get(url)
#向url发送get请求
pageHtml.encoding='gb2312'
# 网页字符编码为gb2312,用encoding指定以gb2312的形式编码pageHtml
pageText=pageHtml.text
#记录文本
list=re.findall(r'<li class="photo-list-padding"><a.*?href="(.*?)".*?target="_blank".*?>',pageText)
#创建list列表用以储存正则表达式检索到的字符,
# .*? 正则的非贪婪匹配 ()捕捉括号里检索的文本到自动命名的组中
#正则的参考:https://www.jb51.net/tools/zhengze.html
imgList=[] #创建imgList空列表
for m in list:
n="http://desk.zol.com.cn"+m
imgList.append(n)
#for循环将正则捕捉到的文本补充成完整的网址
try:
next=re.findall(r'id="pageNext".*?href="(.*?)"',pageText)
nextUrl=["http://desk.zol.com.cn"+next[0]]
#这里当写成nextUrl="http://desk.zol.com.cn"+next时是字符串和列表相加会报错,
#如果写成nextUrl="http://desk.zol.com.cn"+next[0]将返回一个字符串
except:
nextUrl=['none']
#尝试捕捉下一页的链接,当下一页链接不存在时nextUrl是一个仅有‘none’的列表
return imgList,nextUrl
#返回列表中的子链接以及下一页的链接
#第二步:获取图片名,最大分辨率名,和分辨率的链接
def secondStep(imgUrl):
pageHtml=requests.get(imgUrl)
pageText=pageHtml.text
imgName = re.findall(r'id="titleName".*?>(.*?)<', pageText)
#图片名
try:
imgDPI=re.findall(r'href="/showpic/(.*?)',pageText)
#选出所有分辨率链接(DPI分辨率的简写)
maxDPI=["http://desk.zol.com.cn/showpic"+imgDPI[0]]
#最大分辨率为第一个,补全链接
DPIName=re.findall(r'href="/showpic/.*?" target="_blank">(.*?)</a>',pageText)
#分辨率名字
maxDPIName=[DPIName[0]]
#最大分辨率
except:
maxDPI=re.findall(r' .*?id="bigImg" src="(.*?)" ',pageText)
maxDPIName=["none"]
#尝试获取最大分辨率及链接 如果不存在则获取图片本身对应的链接
return imgName,maxDPIName,maxDPI
def thirdstep(imgName,maxDPIName,maxDPI):
pageHtml=requests.get(maxDPI[0])
pageContent=pageHtml.content
#获取图片的字节码(content)
#text是字符串 ,“text中存的是Beautifulsoup根据猜测的编码方式将content内容编码成字符串”。“而content返回的是bytes型也就是二进制的数据”
with open ("F:\\IMAGE\\"+imgName[0]+"-"+maxDPIName[0]+".jpg",'wb')as f:
#将图片保存在F盘的IMAGE文件夹中
#wb应该是(?)以二进制的形式写入数据
#当他是w时会显示write() argument must be str, not bytes,write参数必须是STR(字符),而不是字节
f.write(pageContent)
flag=1
a=b=0
url="http://desk.zol.com.cn/dongman/"
while( flag==1 ):
a=a+1
b=0
eveImg,nextUtl=firststep(url)
for imgUrlin eveImg:
b=b+1
imgName, maxDPIName, maxDPI=secondStep(imgUrl)
thirdstep(imgName, maxDPIName, maxDPI)
print("第",a,"页","第",b,"个")
print("success")
url=nextUtl[0]
if( url=="none" ):
flag=0
print("all success")