历史:
运维学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,打开调试页面
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('<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)
最终效果: