1. 首先通过urllib获取网页的源码
# 定义一个getHtml()函数 def getHtml(url): try: page = urllib.urlopen(url) # urllib.urlopen()方法用于打开一个URL地址 html = page.read() # read()方法用于读取URL上的数据 except Exception as e: html = '' return html
2. 获取下一页的url链接,当本页的图片链接获取完毕,再继续获取下一页的。使用Python正则表达式匹配需要的字段
# 得到下一页的url def get_page_url(html): url_reg = r'<a href="(.*)">下一页</a>' url_pattern = re.compile(url_reg) fanye_urls = url_pattern.findall(html) fanye_url = 'https://tieba.baidu.com' + fanye_urls[0] if fanye_urls else '' return fanye_url
3. 获取每一页的图片链接,将之放入一个总的数组,最后通过链接下载图片
def getImg(html): img_reg = r'https://.[^s]+?.jpg|https://.[^s]+?.png' # 正则表达式,得到图片地址 img_pattern = re.compile(img_reg) # re.compile() 可以把正则表达式编译成一个正则表达式对象. imgList = img_pattern.findall(html) # img_pattern.findall() 方法读取html 中包含 img_reg(正则表达式)的 数据,数组形式 return imgList
4. 下载图片。使用urllib.urlretrieve()方法,直接根据链接将图片下载到本地
def down_img(imgList): x = 0 for imgUrl in imgList: try: # 核心是urllib.urlretrieve()方法,直接将远程数据下载到本地,图片通过x依次递增命名 urllib.urlretrieve(imgUrl, 'E:img\%s.jpg' % str(x + 1)) print '成功下载第%s张图片时:%s' % (str(x + 1), str(imgUrl)) x += 1 except Exception as e: print '下载第%s张图片时失败:%s' % (str(x + 1), str(imgUrl)) print e continue return imgList
5. 先爬取第一页的图片链接,然后通过while循环,继续读取第二页,.....,等到最后,将所有从网上爬取的图片链接使用extend()方法放入总的数组内,然后统一下载
all_img_urls = [] # 得到网页源码 html = getHtml("https://tieba.baidu.com/p/5407739329") fanye_url = get_page_url(html) # 得到图片链接的数组 imgList = getImg(html) # 将imgList数组存入总的图片数组内 all_img_urls.extend(imgList) fanye_count = 0 # 累计翻页数 while 1: try: next_html = getHtml(fanye_url) fanye_url = get_page_url(next_html) next_imgList = getImg(next_html) fanye_count += 1 print('第%s页' % fanye_count) all_img_urls.extend(next_imgList) if fanye_url == '' and next_imgList == []: print('已到最后一页, 开始下载:') break except Exception as e: print e continue down_img(all_img_urls)
总的代码如下:
# coding=utf-8 """下载百度贴吧内的图片""" import re import urllib # 定义一个getHtml()函数 def getHtml(url): try: page = urllib.urlopen(url) # urllib.urlopen()方法用于打开一个URL地址 html = page.read() # read()方法用于读取URL上的数据 except Exception as e: html = '' return html # 得到下一页的url def get_page_url(html): url_reg = r'<a href="(.*)">下一页</a>' url_pattern = re.compile(url_reg) fanye_urls = url_pattern.findall(html) fanye_url = 'https://tieba.baidu.com' + fanye_urls[0] if fanye_urls else '' return fanye_url def getImg(html): img_reg = r'https://.[^s]+?.jpg|https://.[^s]+?.png' # 正则表达式,得到图片地址 img_pattern = re.compile(img_reg) # re.compile() 可以把正则表达式编译成一个正则表达式对象. imgList = img_pattern.findall(html) # img_pattern.findall() 方法读取html 中包含 img_reg(正则表达式)的 数据,数组形式 return imgList def down_img(imgList): x = 0 for imgUrl in imgList: try: # 核心是urllib.urlretrieve()方法,直接将远程数据下载到本地,图片通过x依次递增命名 urllib.urlretrieve(imgUrl, 'E:img\%s.jpg' % str(x + 1)) print '成功下载第%s张图片时:%s' % (str(x + 1), str(imgUrl)) x += 1 except Exception as e: print '下载第%s张图片时失败:%s' % (str(x + 1), str(imgUrl)) print e continue return imgList if __name__ == '__main__': all_img_urls = [] # 得到网页源码 html = getHtml("https://tieba.baidu.com/p/5407739329") fanye_url = get_page_url(html) # 得到图片链接的数组 imgList = getImg(html) # 将imgList数组存入总的图片数组内 all_img_urls.extend(imgList) fanye_count = 0 # 累计翻页数 while 1: try: next_html = getHtml(fanye_url) fanye_url = get_page_url(next_html) next_imgList = getImg(next_html) fanye_count += 1 print('第%s页' % fanye_count) all_img_urls.extend(next_imgList) if fanye_url == '' and next_imgList == []: print('已到最后一页, 开始下载:') break except Exception as e: print e continue down_img(all_img_urls)