历史:
运维学Python之爬虫基础篇(一)开篇:http://www.tiejiang.org/20403.html
运维学Python之爬虫基础篇(二)Urllib模块使用:http://www.tiejiang.org/20404.html
运维学Python之爬虫基础篇(三)Urllib模块高级用法:http://www.tiejiang.org/20405.html
运维学python之爬虫基础篇(四)Cookie:http://www.tiejiang.org/20418.html
运维学python之爬虫基础篇(五)正则表达式:http://www.tiejiang.org/20426.html
运维学python之爬虫实战篇(一)爬取百度贴吧:http://www.tiejiang.org/20450.html
上篇讲了如何爬去百度贴吧内容,今天讲一讲图片保存的例子,伯乐在线有个面向对象(就是相亲哦)的网页,里面有很多妹子的个人介绍,我们主要爬取图片,按照编号名称创建文件夹存储在文件夹中。
1 分析url
伯乐在线打开详细页面后的网址为http://date.jobbole.com/4767/
其中4767为个人id,每个人的id是对应的不同页面,好我们就把url分成2部分
baseurl = http://date.jobbole.com/
pn = 4767
2 页面分析
方法是一样的,还是用火狐浏览器F12,打开调试页面
3 写正则过滤规则
pattern = re.compile('<p.*?<img class=”alignnone” src=”(.*?)” width.*?></p>’, re.S)
关于正则匹配的问题,没有办法,只能是多找网页多练习,我也刚接触,也不敢说自己的是最好的,但能实现获取图片的链接就行了。
4 代码实现
代码内容中只是增加了request.urlretrieve的使用,通过这个模块将图片保存下来。
# -*- coding: utf-8 -*- # 爬取伯乐在线相亲妹子图片程序 import re import os import time from urllib import request class BoLe: """ 定义爬取伯乐在线程序的类 """ def __init__(self, baseurl): """ 初始化参数 """ self.baseurl = baseurl def getpage(self, pn): """ 定义获取页面图片方法 """ try: url = self.baseurl + str(pn) time.sleep(1) req = request.Request(url) response = request.urlopen(req) return response.read().decode('utf-8') except request.URLError as e: if hasattr(e, 'reason'): print(e.reason) elif hasattr(e, 'code'): print(e.code) def getimg(self, page, pn): """ 获取当前页面图片 """ # 定义正则,获取内容 pattern = re.compile('<p.*?<img class="alignnone" src="(.*?)" width.*?></p>', re.S) items = re.findall(pattern, page) for item in items: # print(item) # print(pn) # 通过urlretrieve模块将图片保存下来,图片名称用time.time()生成当前时间,防止重名覆盖 request.urlretrieve(str(item), 'E://' + str(pn) + "//" + '% s' % time.time() + '.jpg') def mkdir(self, pn): """ 创建文件夹方法,将获取的个人id作为文件夹名称创建文件,图片保存在这个文件夹下 pn指的是每个妹子的个人id """ # 定义路径变量 path = 'E://' + str(pn) # 通过os模块的exists方法判断目录是否存在,存在返回False,不存在则创建 if os.path.exists(path): return False else: # 通过mkdir创建文件夹 os.mkdir(path) # print(path + '*****************') return True def start(self, start, end): """ 启动方法,通过传入的start,end参数获取这个断内的所有号码作为用户id 爬取每个id的主页图片 """ # 通过for循环方式执行,pn为start和end+1之间的数字,也就是个人id for pn in range(start, end+1): page = self.getpage(pn) # 通过判断,如果不存在就打印网页不存在,存在就保存再相应的id目录中 if page is None: print("编号%s的网页不存在" % pn) continue else: self.mkdir(pn) self.getimg(page, pn) if __name__ == '__main__': baseurl = 'http://date.jobbole.com/' bole = BoLe(baseurl) bole.start(4750, 4850)
最终效果:
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/54640.html