爬取指定网页图片
必要准备
pip install requests
pip intsall BeautifulSoup4
pip install pillow
常见运行错误
(1)No module named 'PIL' #找不到PIL模块
(2)Importerror : DLL load failed: #找不到指定文件
解决办法
(1)PIL模块只存在于python2里,在python3中被pillow替代,所以只需在cmd命令中输入pip install pillow。
(2/1)在cmd命令中输入 pip uninstall pillow,再输入pip install pillow 进行重新安装。如若还是失败,采用下方的解决办法。
(2/2)在https://www.lfd.uci.edu/~gohlke/pythonlibs/ 链接中找到下图所示的链接进行下载
可以添加QQ群1004391443,有飞机大战、颜值打分器、打砖块小游戏、红包提醒神器、小姐姐表白神器等具体的实训项目,有清晰源码,有相应的文件
在cmd命令中输入cd /d 文件位置(例:C:\Users\1\Downloads\)再输入pip install Pillow-6.0.0-cp37-cp37m-win_amd64.whl,如下
运行效果如下
代码如下
import requests #引入requestsfrom bs4 import BeautifulSoup #从bs4库中引入BeautifulSoup模块,用于解析url(链接)import os #引入os,用于保存文件到指定文件夹from PIL import Image #从PIL库中引入Image等价于引入pillowfrom io import BytesIO #从io中引入BytesIO,在内存中读取二进制数据import time #引入time用于延迟,爬虫的时间间隔 url = "http://www.yestone.com/gallery/1501754333627" #链接headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"} #把爬虫伪装成浏览器,里面的参数是在浏览器中寻找,在代码下方。 r = requests.get(url, headers=headers) #带参数请求数据(链接,浏览器伪装)soup = BeautifulSoup(r.content, 'html.parser') #对浏览器返回的数据进行解析,.content是二进制文件,.text是纯文本items = soup.find_all('img', class_='img-responsive') #对提取的数据进行最小父级标签查找,class_=可以当做规范写法,在代码下方有显示 folder_path = './photo' #定义路径(文件夹名称) if os.path.exists(folder_path) == False: #若路径不存在 os.makedirs(folder_path) #创建路径 for index, item in enumerate(items): #从刚才解析的items中进行枚举查找,index默认为0 if item: #用于判断items中有无值,有则是True进行if后面的语句,没有则跳出if下面的语句 html = requests.get(item.get('data-src')) #获取图片链接,'data-scr'如何查找?在代码下方 img_name = folder_path + str(index + 1) + '.png' #文件名称和格式 image = Image.open(BytesIO(html.content)) #打开服务器返回的二进制图片 image.save('E:\Python\photo'+img_name) #在指定目录下保存文件 print('第%d张图片下载完成' % (index + 1)) #输出结果 time.sleep(1) # 延时1sprint('抓取完成')
查找方式User-Agent的方式(在浏览器中输入 ctrl+shift+i 检查,点击Newtwork,再按F5刷新,点击name,再点击Headers,拉到底部即可找到代理服务器)
找图片最小父级标签(ctrl+shift+i ,通过下方第一个红框所述的按键点击图片,即可显示下图网页结构)
查找图片链接('data-src')
其他问题
1.如果类比使用该程序?
1)更改url
2) 更改 class_= 前后方的参数,更改item.get()里面的参数
3)路径名可以不修改folder_path = './photo'
2.如何同时爬取一个网站不同页数的图片?
找到网站之间的规律(以http://sc.chinaz.com/tupian/beijingtupian_3.html为例)
for i in range(1,10): url = 'http://sc.chinaz.com/tupian/beijingtupian_'+str(i)'+'.html'