'''
Created by swh on 2017.07.31
'''
#_*_coding:utf-8_*_
from bs4 import BeautifulSoup
import urllib2
import urllib
# 根据连接地址获取网站数据
def getHtml(url):
# 由于该网站加入了反爬机制,所以通过模拟浏览器的方式加入浏览器信息
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
req = urllib2.Request(url,headers=headers)
# timeout=20 设置网络请求超时20秒
html = urllib2.urlopen(req,timeout=20).read()
return html
'''
在图片命名的时候为了爬取到的图片能够容易搜索,所以以图片在网站上的标题为名称,但是有的名称是相同的,为了防止图片覆盖,根据字典键的唯一性,设置图片的名字为键,图片序号为值,在图片名字重复的时候以 图片名称 + 图片序号命名
'''
imgN = {}
# 根据请求到的网页内容进行数据解析
def getImgUrl(html):
# 通过bs4框架进行解析,这里用内置的默认解析器html.parser,也可以使用lxml解析器,需要安装
soup = BeautifulSoup(html,"html.parser")
#*************************************
# 通过类名查找每个图片的整块li,是一个列表
# 每个块的内容:<li class="span3"> <div class="thumbnail" style="text-align: center;"> <div class="img_single"> <a class="link" href="https://www.dbmeinv.com:443/dbgroup/1403774" target="_topic_detail"> <img alt="现在是凌晨零点五十四分" class="height_min" οnerrοr="img_error(this);" src="http://ww3.sinaimg.cn/bmiddle/0060lm7Tgy1fi0q9lp4i1j30rs0rsgoh.jpg" title="现在是凌晨零点五十四分"/> </a> </div> <hr/> <div class="bottombar"> <span class="fl p5"> <a class="link" href="https://www.dbmeinv.com:443/dbgroup/1403774" target="_topic_detail"> 现在是凌晨零点五十四分 </a> </span> <span class="fr p5 meta"> <span class="mstar-empty star" title="加入收藏" topic-id="105480524" topic-image-id="1175576"></span> <span class="starcount" topic-image-id="1175576">0</span> </span> </div> </div> </li>
# *************************************
cont = soup.select(".span3")
for item in cont:#遍历每个数据块
# 从该数据块中查找img元素,由于返回列表,但是我们每个数据块中只有一个img,所以用[0]取出,再用get('src')取出图片地址
imgUrl = item.select("img")[0].get("src")
# 跟图片地址方式相同,出去标题作为图片名称
name = item.select("img")[0].get("title")
# 根据图片地址,取出图片后缀,豆瓣美女图片网我没具体看,在其他网站爬取图片的时候有gif图,如果保存的时候都以jpg保存,就会失去动态效果,所以我们去网站上的后缀,用于保存图片的格式,rfing('.')从后向前查找'.'的索引
index = imgUrl.rfind('.')
# 截取后缀
dd = imgUrl[index+1:]
# 判断这个图片名称是否已经存在,如果存在则把图片的索引取出并+1,记得在同级目录下创建picture文件夹
if imgN.has_key(name):
imgN[name] = imgN[name] + 1
# 对于图片名字已经存在的,用图片名字+索引(图片名字为键对应的值)进行命名
urllib.urlretrieve(imgUrl,'./picture/%s%d.%s' % (name,imgN[name],dd))
else:
imgN[name] = 0
# 如果图片名字第一次出现,直接以图片名字命名保存图片
urllib.urlretrieve(imgUrl,'./picture/%s.%s' % (name,dd))
if __name__ == '__main__':
# 截止到2017-07-31 豆瓣美女图官网总共图片页数为5064
# 这里仅做测试,我只抓取了两页,如果大家想抓取更多,可以把3改为5065,后面可能会增加。根据实际情况来
for i in range(1,3):
print "https://www.dbmeinv.com/?pager_offset=%s" % str(i)
html = getHtml("https://www.dbmeinv.com/?pager_offset=%s" % str(i))
getImgUrl(html)
爬取豆瓣美女图片网美女图片
最新推荐文章于 2022-03-25 12:00:00 发布