上一篇中,安装和初步使用了requests+BeautifulSoup,感受到了它们的便捷。但之前我们抓取的都是文字信息,这次我们准备来抓取的是图片信息。
>第一个实例
我们来抓取这个网站的图片:/bizhi/stand_by_me_doraemon_v45983/
首先,审查网页元素:
因此其结构就为:
<div class='il_img'> x 若干个,对每个div有 :<img src='我们要的img src数据'>
整体思路是:
获取每个图片的src地址;构建requests去请求img的src并获取图片;写入文件
代码如下:
import requestsfrom bs4 import BeautifulSouppic_id = 0 # 图片编号url = '/bizhi/stand_by_me_doraemon_v45983/'bs = BeautifulSoup(requests.get(url).content, "lxml") # 调用lxml作为解析引擎 需要:pip install lxmlfor i in bs.select('.il_img'):pic_url = i.find('img')['src']pic_file = open('./pic_'+str(pic_id)+'.jpg', 'wb') # 二进制创建并写入文件pic_file.write(requests.get(pic_url).content) # 写出请求得到的img资源pic_id += 1
这样,就能在爬虫脚本目录下找到我们需要的图片了:
>第二个实例
这次我们来抓取这个网站的资源,要的是奖章图标+奖章等级+等级标志颜色+称号,并按照'等级+标志颜色+称号.gif'的方式存储:
结构为:
<table><td><img> img-src<td> 等级<td> 颜色<td> 称号
同样,也就可以给出相关的代码了:
import reimport requestsfrom bs4 import BeautifulSoupurl = '/gonglue/236751_all.html'bs = BeautifulSoup(requests.get(url).content, "lxml")for table in bs.find_all('table', attrs={'border': 1, 'align': 'center'}): # 获取所有的数据表for td in table.find_all(td_with_img): # 获取含有img标签的td标签img_src = td.img['src'] # 获取图片urllevel = td.find_next_sibling('td') # 等级td节点color = level.find_next_sibling('td') # 颜色td节点title = color.find_next_sibling('td') # 称号td节点opf = open(get_title(level.string, color.string, title.string), 'wb')opf.write(requests.get(img_src).content)print '已抓取:', re.sub('\s', '', level.string)
这里用了两个方法:
def td_with_img(node):return node.name == 'td' and node.img is not None # 含有img标签的td标签 def get_title(level, color, title):return './ppt/'+re.sub('\s', '', level)+re.sub('\s', '', color)+re.sub('\s', '', title)+'.gif' # 移除空白并直接得到文件名
我们的成果: