Python爬虫实例(2)-用BeautifulSoup爬取一个网页上的多张照片(以百度贴吧为例)

来源:互联网 发布:装修设计软件绿色版 编辑:程序博客网 时间:2024/06/05 11:17

上一篇博客,实现了下载一张图片的简单爬虫。但是其代码,仅仅能下载一张图片。爬虫作为数据分析的第一步工作,需要爬取的是海量数据;假设我想下载一个网站几十张图片,那怎么实现呢?


首先,我们利用框图或者伪代码,理清一下思路。我想要下载多张图片,思路如下:

1、访问具有多张图片的网页;

2、写出下载图片的Python函数;

3、获取多张图片对应的多条html信息;

4、将多条图片对应的html导入到下载函数当中。即可。


第1、2、4都是上一篇blog中说明了的,直接沿袭即可。本文将介绍,如何同时获得多张图片对应的html。


对于目标网页,例如http://tieba.baidu.com/p/2708004726,目的是爬取海女 能年玲奈的图,本页面中一共33张。首先是F5+F12抓包,并对网页中的图片,查找其“审查元素”;一般会得到如下html的字符串:<img class="BDE_Image" src="http://imgsrc.baidu.com/forum/w%3D580/sign=ee888bf4b68f8c54e3d3c5270a282dee/062f162dd42a283475427b1159b5c9ea14cebfbe.jpg" pic_type="0" width="560" height="759" style="cursor: url(&quot;http://tb2.bdstatic.com/tb/static-pb/img/cur_zin.cur&quot;), pointer;">


可以发现,其实图片对应的代码,就是http://imgsrc.baidu.com/forum/w%3D580/sign=ee888bf4b68f8c54e3d3c5270a282dee/062f162dd42a283475427b1159b5c9ea14cebfbe.jpg这一串而已,将这串代码代入到下载函数里面,就可以下载对应的图片到本地。假设我要下载100张图片,那么就要获取100个这样的图片链接,执行100次下载函数即可。


那么,如何获取这100个图片链接,则是本文的核心难点。有三种方法:

1、使用第三方模块BeautifulSoup获取图片链接;

2、使用正则表达式,及re包;

3、使用lxml包的etree模块,将html代码转为xml,再用xpath提取图片链接。


本文使用方法1,因为BeautifulSoup最简单、易上手、效率高。源代码如下:


# -*- coding: utf-8 -*- import requestsimport osfrom bs4 import BeautifulSoup#导入BeautifulSoup模块#在本地新建一个文件夹,保存下载的图片folder = 'test_img'if not os.path.exists(folder):    os.makedirs(folder)#爬取对象是百度贴吧,爬取本网页中,能年玲奈的33张图片img_url = 'http://tieba.baidu.com/p/2708004726'header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}#定义下载图片的函数def download(url):    response = requests.get(url, headers = header)    name = url.split('/')[-1]    f = open(folder + '/baidutieba/' + name + '.jpg', 'wb')    f.write(response.content)    f.close()    return True#获取网页的response类、htmlimg_response = requests.get(img_url, headers = header)img_html = img_response.text#获取网页的soup类;img_soup = BeautifulSoup(img_html, 'html.parser')#本次实例的重点:bs4包中的find_all函数,变量是html的标签tag和属性attrs,依此两个量来定位src所在位置,返回的是bs4类img = img_soup.find_all('img', attrs = {'class':'BDE_Image'})#循环函数,用bs4的get函数,直接获取src的属性值,即是图片对应的网址for img_src in img:    img_src = img_src.get('src')    print(img_src)    download(img_src)print('OK')


Tips:
1、本例的目的:爬取一个网页中的多张图片;

2、技术手段:导入bs4包,使用BeautifulSoup函数解析html,find_all('tag',attrs='')函数定位图片所在位置,get('src')函数获取src对应的网页。即可下载图片。


简单来说,BeautifulSoup-find_all-get三连函数,获取图片对应的img_src,然后下载即可。


缺陷:

1、本例的代码仅仅适用于百度贴吧网页的爬取,若切换到其他网页,html格式改变,相应的src获取方式也要改变;

2、百度贴吧存在翻页功能,如何获取多个页面的多张图片呢?下个实例再来探讨~




阅读全文
0 0
原创粉丝点击