这一节课,是群里很多娃在等待的课程。
通过前面两篇文章的学习,我们对BeautifulSoup4的简单使用有了了解。
了解了使用这个爬虫的核心是熟悉分析清楚html标签,一些css的简单知识,找准了标签就可以获取到我们需要的数据了。
那么下面这篇文章,我们还需要用到个一个功能就是文件保存功能,也就是我们需要将网络返回的图片数据流保存在本地上,这样找准网站的美女图片链接之后,我们就可以直接来进行保存了。
0x01:
确定使用网址,方便截取图片地址信息。
https://tuchong.com/tags/美女
经过选择,最终我确定的是它。
我们打开这个网址,右击,选择审查元素功能。
通过上面我红线的标注大家也可以看到我们需要的关键数据了。
首先这个div的class是post-row,这个容器包含了整个网页的图片显示功能,相当于其他的小图都是放在这个容器中的。
所以我们的soup.select就可以先写上一句(div.post-row)
然后我们往下继续看,一步一步缩小标签,直到定位到图片地址,也就是select最终为:(div.post-row div.post-collage a.theatre-view img)
也就是精确到了img标签属性了,然后我们继续按照上篇文章 介绍的方法,使用ipython工具进行调试。
获取到这个soup之后,查看数据后发现这个数据格式为Tag属性。本系列第一篇文章中,我提到的两篇文章如果大家看完之后就会了解Tag最重要的两个属性为name和attrs。
所以这个时候我们不知道再怎么继续的时候,查看一下
someData = soup1.select("div.post-row div.post-collage a.theatre-view img")
someData.attrs
可以看到属性有个src,也就是通过上面我们看到的图片地址信息,所以可以直接确定我们需要的图片地址为:
someData = soup1.select("div.post-row div.post-collage a.theatre-view img")
allUrls=[]
for some in someData:
allUrls.append(some['src'])
这里我用一个list储存我们获取的所有数据,方便我们保存,留到后面使用。
0x02:文件保存
这里没有什么需要说的,直接贴一下代码,这里使用了正则,匹配上面我们截取的图片地址信息后缀的数字,方便储存,大家可以根据自己的需求修改
def download(url):
path = '/home/suz/girls2/'
content = urllib2.urlopen(url).read()
format = '[0-9]*\.jpg';
res = re.search(format,url);
print 'downloading:',res.group()
filename = path+res.group()
f = open(filename,'w+')
f.write(content)
f.close()
0x03:批量跑啊
现在就简单多了,我们分析一下每个网址的信息,也就是一页有多少个缩略图信息就可以了。
如下代码:
if __name__ == "__main__":
for i in range(1,5000):
urls=getGirlUrl(i)
for u in range(1,len(urls)):
download(urls[u])
print '正在爬第'+str(i)+'页'
0x04:全部代码
老规矩,听鬼哥说故事,得有完整的代码:
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import urllib2
import re
def getGirlUrl(n):
url = 'https://tuchong.com/tags/%E7%BE%8E%E5%A5%B3?page='+str(n)
print url
response = urllib2.urlopen(url)
html = response.read()
soup1 = BeautifulSoup(html, "lxml")
#someData = soup1.select("div.post-row")
someData = soup1.select("div.post-row div.post-collage a.theatre-view img")
allUrls=[]
for some in someData:
allUrls.append(some['src'])
print allUrls
def download(url):
path = '/home/suz/girls2/'
content = urllib2.urlopen(url).read()
format = '[0-9]*\.jpg';
res = re.search(format,url);
print 'downloading:',res.group()
filename = path+res.group()
f = open(filename,'w+')
f.write(content)
f.close()
if __name__ == "__main__":
for i in range(1,5000):
urls=getGirlUrl(i)
for u in range(1,len(urls)):
download(urls[u])
print '正在爬第'+str(i)+'页'
效果图:
这里我写了个批处理的脚本,来批量修改文件的名称,所以上面大家看到的文件名从数字1开始的。
至于为什么我们搞这些图片,请继续关注后面的文章,我们最终打造的微信聊天机器人的自动发图功能!!!!