Python3 实现妹子图爬虫
一.项目说明
1.项目介绍
本项目通过使用python 实现一个妹子图图片收集爬虫,学习并实践 BeautifulSoup、Request,Urllib 及正则表达式等知识。在项目开发过程中采用瀑布流开发模型。
2.用到的知识点
本项目中将会学习并实践以下知识点:
- python3 编程
- 使用 BeautifulSoup 解析 html 页面
- 使用 Request 爬取 WEB 页面
- 使用正则表达式提取所需的关键信息
- urllib下载图片
爬取后的目录结构如下:(只爬取了一个专题的)
每个目录中都有一系列的图片:
(是不是感觉有点小激动,我也是嫌官网上的查看太麻烦了,so...爬下来慢慢看)
二.基础工具
1.安装Chrome,为了方便查看源代码,推荐开发者经常使用的Chrome浏览器
2.安装Python3,如果你还不会安装,请看下基础安装python,然后安装pip,(打开你安装的文件夹,找到Script,将这个文件夹的路径添加到环境变量中)
使用下面命令测试下,当然window系统需要打开cmd输入
- pip --version
pip --version
安装成功之后
3.window上安装Beautifulsoup,request,lxml
- pip install PackageName
pip install PackageName
第一步:windows安装lxml
第二步,安装库BeautifulSoup4
- pip install beautifulsoup4
pip install beautifulsoup4
第三步,安装库Requests
- pip install requests
pip install requests
4.使用PyCharm进行开发,具体请自行Google。
三.项目实现
1.目标
本个项目中我们将分别按照如下步骤:
- 抓取每个专题的等信息
- 抓取每个专题的列表,并按列表新建文件夹
- 抓取每一个列表的图片,把每一个MM的写真图片按照文件夹保存到本地
2.程序结构
3.流程说明
- 通过
Request
获得目标页面源码,之后通过BeautifulSoup
解析概源码,通过正则表达式提取出专题链接
- 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)
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)
- 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
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
Request
获得每个专题链接的目标页面源码,之后通过 BeautifulSoup
解析概源码,通过正则表达式提取出列表链接,并提取列表标题,新建文件夹。
- #获取专题的列表页
- 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)
#获取专题的列表页
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
解析概源码,通过正则表达式提取出图片链接,本网站的图片是非常有规律的,这里用了点技巧来构造图片链接,以及做了异常处理,保存图片的到文件夹中
- #获取列表页的详细信息
- 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!!!!!!!!!!!!!!!!!!!!!')
#获取列表页的详细信息
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.多线程实现抓取,并构造页码
- 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())
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
相关文章