51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

运维学python之爬虫实战篇(二)爬取伯乐在线面向对象图片

历史:

运维学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 {#1-url}

伯乐在线打开详细页面后的网址为http://date.jobbole.com/4767/
其中4767为个人id,每个人的id是对应的不同页面,好我们就把url分成2部分
baseurl = http://date.jobbole.com/
pn = 4767

2 页面分析 {#2-}

方法是一样的,还是用火狐浏览器F12,打开调试页面
运维学python之爬虫实战篇(二)爬取伯乐在线面向对象图片_https://www.tiejiang.org_python_第1张

3 写正则过滤规则 {#3-}

pattern = re.compile('<p.*?<img class="alignnone" src="(.*?)" width.*?></p>', re.S)
关于正则匹配的问题,没有办法,只能是多找网页多练习,我也刚接触,也不敢说自己的是最好的,但能实现获取图片的链接就行了。

4 代码实现 {#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('&lt;p.?&lt;img class="alignnone" src="(.?)" width.*?&gt;&lt;/p&gt;', 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)


最终效果:
运维学python之爬虫实战篇(二)爬取伯乐在线面向对象图片_https://www.tiejiang.org_python_第2张

赞(1)
未经允许不得转载:工具盒子 » 运维学python之爬虫实战篇(二)爬取伯乐在线面向对象图片