杂
哈哈,这是我第一篇博客
半年以后回来再看发现这代码简直太难看了
现在已经弃用大小驼峰转蛇形命名了
确实好看
除了命名别的也写的不怎么样
因为爬虫只是个爱好所以也不准备再投入时间重构了
将就着看吧
1.主要的库:
1.requests
2.Pillow
请自行安装
2.目标网址:
http://pic.netbian.com/
声明:此网址是随便找的,代码仅供技术交流使用,如有侵权请联系本人删除
3.思路
如何得到每张图片的具体位置呢?
首先找到在哪一个分页
打开页面,F12查看源码,我的浏览器是Firefox
然后鼠标移到分页的2上,右键查看元素,可以看到
这就是每个分页的部分URL,验证一下,浏览器中输入 pic.netbian.com/index_5.html ,自动跳转到彼岸图网第五分页
首页是index.html,分页的部分URL格式为index_[0-9]*.html
然后在分页中找以缩略图形式显示在页面上的子页面URL
上图中为/tupian/24556.html
如果只需要低像素的缩略图的话,现在就可以开始爬了,上图中缩略图图片的部分URL格式为/uploads/allimg/.*a.jpg
注意区分这两个概念
如果需要大图,那么就要在/tupian/24556.html下继续去找大图的具体位置。点开缩略图,右击大图,查看元素,找到格式为/uploads/allimg/.*be.jpg的代码,就是这张大图的URL了。
当然不是所有的大图都是xxxbe.jpg格式的,所以不能用正则匹配be.jpg$的格式去处理,查看子页面中大图代码的位置,都是第一个出现的,其余的都是推荐的相似图片的URL,为了防止重复爬取缩略图图片,可以用正则^/uploads/allimg/.*.jpg去匹配,只要找到一个就break,然后分析下一个子页面的html代码。
如下,在点开缩略图后还有相似图片推荐,为了不重复抓取,会在代码中作处理
4.代码
要写爬虫首先要对Web有一定的了解,要是连查看源码都不会就更别说分析了,所以还是先好好学学Web再去写爬虫,不说会做网页,最起码要能看懂个大概。按我的理解,爬虫实际上就是模拟了浏览器的行为,所以在代码中把上述的步骤实现了就ok
#coding:gbk
'''
Author: CSDN wuming7847
转载请注明出处
'''
import requests
from PIL import Image
from io import BytesIO
import re
from requests.exceptions import HTTPError
root="http://pic.netbian.com/index_%d.html"
#除首页外所有分页的统一格式
uni="http://pic.netbian.com"
#子页面和大图的URL前缀
AllPage=[]
#要爬取的分页URL
AllImgHTML=[]
#缩略图代表的子页面的部分URL,格式为/tupian/.*.html
AllImgURL=[]
#每张大图的部分URL,格式为/uploads/allimg/.*.jpg
def GetPageURL(root,Start,counts):
#得到每个分页的URL放到AllPage中
if Start==1:
AllPage.append("http://pic.netbian.com/index.html")
#将非标准格式的首页URL放入
for i in range (Start+1,Start+counts):
newURL=root.replace("%d", str(i))
AllPage.append(newURL)
else:
for i in range (Start,Start+counts):
newURL=root.replace("%d", str(i))
AllPage.append(newURL)
def GetImgHTML(AllPage):
#得到每个分页中子页面的URL放到AllImgHTML中
for PageURL in AllPage:
try:
res=requests.get(PageURL)
res.raise_for_status()
except HTTPError:
print("HTTP Error!")
except ConnectionError:
print("Failed to connect!")
with open("C:\\Users\\PageFile.txt","w",encoding="ISO-8859-1") as PageFile:
PageFile.write(res.text)
PageFile.close()
with open("C:\\Users\\PageFile.txt","r",encoding="gbk") as ReadFile:
str=ReadFile.read()
mid=re.split("\"", str)
#用"进行分割,以进行正则表达式匹配
for i in mid:
ImgHTML=re.findall("^/tupian/.*.html$",i)
#提取所有符合格式的str放到ImgHTML中
if len(ImgHTML)!=0:
AllImgHTML.append(ImgHTML[0])
def GetImgURL():
#得到每个分页中每个子页面的大图的URL放到UsefulImgURL中
UsefulImgHTML=[None for i in range(len(AllImgHTML))]
#为字符串拼接分配内存
for i in range(len(AllImgHTML)):
UsefulImgHTML[i]=uni+AllImgHTML[i]
#拼接后得到了可用的子页面URL,格式为http://pic.netbian.com//tupian/.*.html
for html in UsefulImgHTML:
#对图片组进行请求
try:
htmlres=requests.get(html)
htmlres.raise_for_status()
except HTTPError:
print("HTTP Error!")
except ConnectionError:
print("Failed to connect!")
with open("C:\\Users\\ImgHTML.txt","w",encoding="ISO-8859-1") as ImgHTML:
ImgHTML.write(htmlres.text)
ImgHTML.close()
with open("C:\\Users\\\ImgHTML.txt","r",encoding="gbk") as ReadHTML:
str=ReadHTML.read()
mid=re.split("\"", str)
for i in mid:
ImgURL=re.search("^/uploads/allimg/.*.jpg$",i)
if ImgURL is not None:
AllImgURL.append(ImgURL[0])
break
#爬到一个大图的URL即break。将每张大图的部分URL存入AllImgURL中,格式为/uploads/allimg/.*.jpg
UsefulImgURL=[None for i in range(len(AllImgURL))]
#拼接得到最终可供下载的URL放到UsefulImgURL中
for i in range(len(AllImgURL)):
UsefulImgURL[i]=uni+AllImgURL[i]
return UsefulImgURL
def DownloadWallpaper(url,path):
try:
res=requests.get(url)
res.raise_for_status()
MyImage=Image.open(BytesIO(res.content))
MyImage.save(path)
print("Done...")
except HTTPError:
print("HTTP Error!")
except ConnectionError:
print("Failed to connect!")
if __name__=="__main__":
GetPageURL(root, 2, 2)
GetImgHTML(AllPage)
UsefulImgURL=GetImgURL()
num=[]
for i in range (len(UsefulImgURL)):
num.append(i)
UsefulSavePath=[None for i in range(len(UsefulImgURL))]
for i in range(len(UsefulSavePath)):
UsefulSavePath[i]="C:\\Users\\"+str(num[i])+".jpg"
for i in range(len(UsefulImgURL)):
print(i,end=" ")
DownloadWallpaper(UsefulImgURL[i],UsefulSavePath[i])
print("Task completed!")
说明:
1.要爬取从第几页开始的连续几页,就在主函数中修改GetPageURL(root,start,counts)中start和counts的值
2.自己改存放路径,windows下文件操作的路径是\\而非\
3.图片的名字都是[0-9]*.jpg的格式,有兴趣的可以自己把大图的名字也爬下来设置为图片名称
4.高清原图需要登录,留坑