Python3 实现妹子图爬虫

2023-01-31 01:01:01 爬虫 妹子 python3

一.项目说明

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输入

[php] view plain copy
print?
  1. pip --version  
pip --version

安装成功之后


3.window上安装Beautifulsoup,request,lxml

[python] view plain copy
print?
  1. pip install PackageName  
pip install PackageName
第一步:windows安装lxml


第二步,安装库BeautifulSoup4

[python] view plain copy
print?
  1. pip install beautifulsoup4  
pip install beautifulsoup4

第三步,安装库Requests

[python] view plain copy
print?
  1. pip install requests  
pip install requests

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

三.项目实现

1.目标

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

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

2.程序结构


3.流程说明

  1. 通过 Request 获得目标页面源码,之后通过 BeautifulSoup 解析概源码,通过正则表达式提取出专题链接
[python] view plain copy
print?
  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)
[html] view plain copy
print?
  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 解析概源码,通过正则表达式提取出列表链接,并提取列表标题,新建文件夹。

[python] view plain copy
print?
  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 解析概源码,通过正则表达式提取出图片链接,本网站的图片是非常有规律的,这里用了点技巧来构造图片链接,以及做了异常处理,保存图片的到文件夹中

[python] view plain copy
print?
  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.多线程实现抓取,并构造页码

[python] view plain copy
print?
  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

相关文章