最近因为要训练个灰度图转彩色图的神经网络,迫于数据的稀有性,就自学了python网络爬虫,并成功获取高质量10000张图片,在此和大家分享下自己的收获。
爬了百度图库的图片,但质量很差,后来发现一个超好的网站,叫pixabay,基于此网站写了个爬虫。
环境准备:网上说的beautifulsoup确实很好用,功能很强大,但经过一晚上折腾,发现re和requests两个库就足够了,而且正则匹配(re)真的很好用。
导入这两个库,如果还想导入beautifulsoup还需要pip install BeautifulSoup4安装一下,网上可以找到教程
import re
import requests
from bs4 import BeautifulSoup
打开网站搜索城市夜景,如图
每种类型图片最多50页,设置page和i,i用来表示图片数目,用于后面的图片保存
word = '夜景城市'
print('找到关键词:'+word+'的图片,现在开始下载')
page=1
i=1
requests.get(url)获取网页内容,防止中文乱码出现,用gbk2312来编码,将内容读入到html中,代码如图
url='https://stock.tuchong.com/search?term=%E5%A4%9C%E6%99%AF%E5%9F%8E%E5%B8%82&use=0&type=&layout=&sort=0&category=0&page='+str(page)+'&size=100&search_from=suggest&exact=0&platform=weili&tp=%E5%A4%9C%E6%99%AF&abtest=&royalty_free=0&option=&has_person=0&face_num=&gender=0&age=&racial='
print('当前页数',page)
result = requests.get(url)
result.encoding="gbk2312"
html=result.text
注意:这里的url格式中加了+str(page)+,是因为在html中没有发现下一页的url信息,它是用js动态实现换页的,这个地步也卡了我不少时间。
接下来,在html中去找图片存放的真正网址,打开html发现,如图
不像百度的网页信息,它根本就没有提供图片的原网址,只有imageId信息,仔细调查发现,图片的原网址格式类似,都是网址+id的形式,如下
http://p3.pstatp.com/weili/ms/235253543759380493.webp
所以只要从html中提取出imageid信息,再拼接成真正的原网址就可以了。
re.findall正则匹配所需要的信息,会返回一个存有所有id数字的list
pic_url=re.findall('"imageId":"(.*?)"',html,re.S)
接下来,就是拼接地址,将图片保存到本地
for each in pic_url:
#拼接地址
picadres=address+str(each)+'.webp'
print ('正在下载第' + str(i) + '张图片,图片地址:' + picadres)
try:
#用requests.get获取图片,因为有延迟的问题,就设置timeout为10秒
pic=requests.get(picadres,timeout=10)
#无法连接就跳过错误,免得打断进程
except requests.exceptions.ConnectionError :
print('【错误】当前图片无法下载')
continue
except requests.exceptions.ReadTimeout:
print("【错误】ReadTimeout")
continue
#保存到当地目录
dir='F:/大三下/机器学习概论/爬虫图片/2/'+str(i)+'.jpg'
fp=open(dir,'wb')
fp.write(pic.content)
fp.close()
i+=1
完整代码如下
import re
import requests
from bs4 import BeautifulSoup
word = '夜景城市'
print('找到关键词:'+word+'的图片,现在开始下载')
page=1
i=1
while page<51:
url='https://stock.tuchong.com/search?term=%E5%A4%9C%E6%99%AF%E5%9F%8E%E5%B8%82&use=0&type=&layout=&sort=0&category=0&page='+str(page)+'&size=100&search_from=suggest&exact=0&platform=weili&tp=%E5%A4%9C%E6%99%AF&abtest=&royalty_free=0&option=&has_person=0&face_num=&gender=0&age=&racial='
print('当前页数',page)
result = requests.get(url)
result.encoding="gbk2312"
html=result.text
pic_url=re.findall('"imageId":"(.*?)"',html,re.S)
address='http://p9.pstatp.com/weili/ms/'
for each in pic_url:
#拼接地址
picadres=address+str(each)+'.webp'
print ('正在下载第' + str(i) + '张图片,图片地址:' + picadres)
try:
#用requests.get获取图片,因为有延迟的问题,就设置timeout为10秒
pic=requests.get(picadres,timeout=10)
#无法连接就跳过错误,免得打断进程
except requests.exceptions.ConnectionError :
print('【错误】当前图片无法下载')
continue
except requests.exceptions.ReadTimeout:
print("【错误】ReadTimeout")
continue
#保存到当地目录
dir='F:/大三下/机器学习概论/爬虫图片/3/'+str(i)+'.jpg'
fp=open(dir,'wb')
fp.write(pic.content)
fp.close()
i+=1
page+=1
效果如图
代码看似不多,但其中遇到了好多问题,才有了最后的成果,如果你喜欢这篇文章,请点个赞~有疑问可以随时问我