自己写爬虫主要是用来学习python,请大家不要过分的爬取别人的站点,给浏览网站造成影响

上篇讲了如何爬去百度贴吧内容,今天讲一讲图片保存的例子,伯乐在线有个面向对象(就是相亲哦)的网页,里面有很多妹子的个人介绍,我们主要爬取图片,按照编号名称创建文件夹存储在文件夹中。

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)

最终效果: