Python3 实现妹子图爬虫

发布时间:2019-08-12 11:52:20编辑:auto阅读(2487)

    一.项目说明

    1.项目介绍

    本项目通过使用Python 实现一个妹子图图片收集爬虫,学习并实践 BeautifulSoup、Request,Urllib 及正则表达式等知识。在项目开发过程中采用瀑布流开发模型。

    2.用到的知识点

    本项目中将会学习并实践以下知识点:

    1. Python3 编程
    2. 使用 BeautifulSoup 解析 HTML 页面
    3. 使用 Request 爬取 Web 页面
    4. 使用正则表达式提取所需的关键信息
    5. urllib下载图片
    3.项目效果

    爬取后的目录结构如下:(只爬取了一个专题的)



    每个目录中都有一系列的图片:


    (是不是感觉有点小激动,我也是嫌官网上的查看太麻烦了,so...爬下来慢慢看)

    二.基础工具

    1.安装Chrome,为了方便查看源代码,推荐开发者经常使用的Chrome浏览器



    2.安装python3,如果你还不会安装,请看下基础安装python,然后安装pip,(打开你安装的文件夹,找到Script,将这个文件夹的路径添加到环境变量中)

    使用下面命令测试下,当然window系统需要打开cmd输入

    1. pip --version  
    pip --version

    安装成功之后


    3.window上安装Beautifulsoup,request,lxml

    1. pip install PackageName  
    pip install PackageName
    第一步:windows安装lxml


    第二步,安装库BeautifulSoup4

    1. pip install beautifulsoup4  
    pip install beautifulsoup4

    第三步,安装库Requests

    1. pip install requests  
    pip install requests

    4.使用PyCharm进行开发,具体请自行google。

    三.项目实现

    1.目标

    本个项目中我们将分别按照如下步骤:

    1. 抓取每个专题的等信息
    2. 抓取每个专题的列表,并按列表新建文件夹
    3. 抓取每一个列表的图片,把每一个MM的写真图片按照文件夹保存到本地

    2.程序结构


    3.流程说明

    1. 通过 Request 获得目标页面源码,之后通过 BeautifulSoup 解析概源码,通过正则表达式提取出专题链接
    1. from bs4 import BeautifulSoup  
    2. import requests  
    3. import urllib  
    4. start_url="http://www.mzitu.com/"  
    5. def get_mei_channel(url):  
    6.     web_data=requests.get(url)  
    7.     soup=BeautifulSoup(web_data.text,'lxml')  
    8.     channel=soup.select('body > div.main > div.sidebar > div.widgets_hot > span > a')  
    9.     for list in channel:  
    10.         print(list.get('href'))  
    11. #获取妹子图首页热门专题的链接  
    12. get_mei_channel(start_url)  
    from bs4 import BeautifulSoup
    import requests
    import urllib
    start_url="http://www.mzitu.com/"
    def get_mei_channel(url):
        web_data=requests.get(url)
        soup=BeautifulSoup(web_data.text,'lxml')
        channel=soup.select('body > div.main > div.sidebar > div.widgets_hot > span > a')
        for list in channel:
            print(list.get('href'))
    #获取妹子图首页热门专题的链接
    get_mei_channel(start_url)
    1. http://www.mzitu.com/tag/xiuren  
    2. http://www.mzitu.com/tag/xinggan  
    3. http://www.mzitu.com/tag/youhuo  
    4. http://www.mzitu.com/tag/zhifu  
    5. http://www.mzitu.com/tag/shuiyi  
    6. http://www.mzitu.com/tag/qingchun  
    7. http://www.mzitu.com/tag/xiaohua  
    8. http://www.mzitu.com/tag/rosi  
    9. http://www.mzitu.com/tag/bikini  
    10. http://www.mzitu.com/tag/leg  
    11. http://www.mzitu.com/tag/zouguang  
    12. http://www.mzitu.com/tag/meitun  
    13. http://www.mzitu.com/tag/tgod  
    14. http://www.mzitu.com/tag/shishen  
    15. http://www.mzitu.com/tag/heisi  
    16. http://www.mzitu.com/tag/miitao  
    17. http://www.mzitu.com/tag/ugirls  
    18. http://www.mzitu.com/tag/mistar  
    19. http://www.mzitu.com/tag/bololi  
    20. http://www.mzitu.com/tag/yougou  
    21. http://www.mzitu.com/tag/imiss  
    22. http://www.mzitu.com/tag/dianannan  
    http://www.mzitu.com/tag/xiuren
    http://www.mzitu.com/tag/xinggan
    http://www.mzitu.com/tag/youhuo
    http://www.mzitu.com/tag/zhifu
    http://www.mzitu.com/tag/shuiyi
    http://www.mzitu.com/tag/qingchun
    http://www.mzitu.com/tag/xiaohua
    http://www.mzitu.com/tag/rosi
    http://www.mzitu.com/tag/bikini
    http://www.mzitu.com/tag/leg
    http://www.mzitu.com/tag/zouguang
    http://www.mzitu.com/tag/meitun
    http://www.mzitu.com/tag/tgod
    http://www.mzitu.com/tag/shishen
    http://www.mzitu.com/tag/heisi
    http://www.mzitu.com/tag/miitao
    http://www.mzitu.com/tag/ugirls
    http://www.mzitu.com/tag/mistar
    http://www.mzitu.com/tag/bololi
    http://www.mzitu.com/tag/yougou
    http://www.mzitu.com/tag/imiss
    http://www.mzitu.com/tag/dianannan
       2.通过 Request 获得每个专题链接的目标页面源码,之后通过 BeautifulSoup 解析概源码,通过正则表达式提取出列表链接,并提取列表标题,新建文件夹。

    1. #获取专题的列表页  
    2. def get_page_from(channel,pages):  
    3.     channel=channel+'/page/{}'.format(pages)  
    4.     web_data=requests.get(channel)  
    5.     soup=BeautifulSoup(web_data.text,'lxml')  
    6.     if soup.find('body > div.main > div.main-content > div.currentpath'):  
    7.         pass  
    8.     else:  
    9.         lists = soup.select('#pins > li > span > a')  
    10.         for lists in lists:  
    11.             path='E:\MM\{}'.format(lists.get_text())  
    12.             isExists = os.path.exists(path)  
    13.             if not isExists:  
    14.                 print("[*]偷偷新建了名字叫做" + path + "的文件夹")  
    15.                 os.mkdir(path)  
    16.             else:  
    17.                 # 如果目录存在则不创建,并提示目录已存在  
    18.                 print("[+]名为" + path + '的文件夹已经创建成功')  
    19.             for i in range(1,101):  
    20.                 get_list_info(lists.get('href'),i,path)  
    21.             # page_list.insert_one({'url': lists.get('href'), 'title': lists.get_text()})  
    22. get_page_from('http://www.mzitu.com/tag/xiuren',1)  
    #获取专题的列表页
    def get_page_from(channel,pages):
        channel=channel+'/page/{}'.format(pages)
        web_data=requests.get(channel)
        soup=BeautifulSoup(web_data.text,'lxml')
        if soup.find('body > div.main > div.main-content > div.currentpath'):
            pass
        else:
            lists = soup.select('#pins > li > span > a')
            for lists in lists:
                path='E:\MM\{}'.format(lists.get_text())
                isExists = os.path.exists(path)
                if not isExists:
                    print("[*]偷偷新建了名字叫做" + path + "的文件夹")
                    os.mkdir(path)
                else:
                    # 如果目录存在则不创建,并提示目录已存在
                    print("[+]名为" + path + '的文件夹已经创建成功')
                for i in range(1,101):
                    get_list_info(lists.get('href'),i,path)
                # page_list.insert_one({'url': lists.get('href'), 'title': lists.get_text()})
    get_page_from('http://www.mzitu.com/tag/xiuren',1)
      3.通过 Request 获得每个专题链接的目标页面源码,之后通过 BeautifulSoup 解析概源码,通过正则表达式提取出图片链接,本网站的图片是非常有规律的,这里用了点技巧来构造图片链接,以及做了异常处理,保存图片的到文件夹中

    1. #获取列表页的详细信息  
    2. def get_list_info(url,page,mmpath):  
    3.     # url='http://www.mzitu.com/69075'  
    4.     web_data=requests.get(url)  
    5.     soup=BeautifulSoup(web_data.text,'lxml')  
    6.     src=soup.select('body > div.main > div.content > div.main-image > p > a > img')  
    7.     for src in src:  
    8.         image_url=src.get('src').split('net')[1].split('01.')[0]  
    9.     if page < 10:  
    10.         pages='0'+str(page)  
    11.     else:  
    12.         pages =str(page)  
    13.     url_split='http://i.meizitu.net'+image_url+'{}.jpg'.format(pages)  
    14.     try:  
    15.         html = urlopen(url_split)  
    16.         name = url_split.split('/')[5].split('.')[0]  
    17.         data = html.read()  
    18.         fileName = '{}\meizi'.format(mmpath) + name + '.jpg'  
    19.         fph = open(fileName, "wb")  
    20.         fph.write(data)  
    21.         fph.flush()  
    22.         fph.close()  
    23.     except Exception:  
    24.         print('[!]Address Error!!!!!!!!!!!!!!!!!!!!!')  
    #获取列表页的详细信息
    def get_list_info(url,page,mmpath):
        # url='http://www.mzitu.com/69075'
        web_data=requests.get(url)
        soup=BeautifulSoup(web_data.text,'lxml')
        src=soup.select('body > div.main > div.content > div.main-image > p > a > img')
        for src in src:
            image_url=src.get('src').split('net')[1].split('01.')[0]
        if page < 10:
            pages='0'+str(page)
        else:
            pages =str(page)
        url_split='http://i.meizitu.net'+image_url+'{}.jpg'.format(pages)
        try:
            html = urlopen(url_split)
            name = url_split.split('/')[5].split('.')[0]
            data = html.read()
            fileName = '{}\meizi'.format(mmpath) + name + '.jpg'
            fph = open(fileName, "wb")
            fph.write(data)
            fph.flush()
            fph.close()
        except Exception:
            print('[!]Address Error!!!!!!!!!!!!!!!!!!!!!')
    4.多线程实现抓取,并构造页码

    1. from multiprocessing import Pool  
    2. from mmspider_channel import channel_list  
    3. from mmspider_parase import get_page_from  
    4. def get_pages_from(channel):  
    5.     for i in range(1,100):  
    6.             get_page_from(channel,i)  
    7.   
    8. if __name__ == '__main__':  
    9.     pool = Pool()  
    10.     # pool = Pool(processes=6)  
    11.     pool.map(get_pages_from,channel_list.split())  
    from multiprocessing import Pool
    from mmspider_channel import channel_list
    from mmspider_parase import get_page_from
    def get_pages_from(channel):
        for i in range(1,100):
                get_page_from(channel,i)
    
    if __name__ == '__main__':
        pool = Pool()
        # pool = Pool(processes=6)
        pool.map(get_pages_from,channel_list.split())
    四.整个项目源码

    项目目录如下


    模块源码已经给出,具体自己整合吧!



    转载自:http://blog.csdn.net/seven_2016/article/details/52245727

关键字

上一篇: Python 操作 AWS S3

下一篇: Python3的fo if while