0%

小白爬虫第一弹之抓取妹子图

2018 年 12 月 11 日 入口页面多了一个连接 早期图片 更新了处理过后的代码(删掉了早期图片的 URL,大家可以自己尝试下载这个页面下的所有套图) 2017 年 8 月 30 日:mzitu.com 更新了防盗链导致下载图片全部失效,已更新处理办法: scrapy 版本也已更新 2017 年 4 月 24 日:用 scrapy 重写了一个 mzitu 的全站爬虫: 小白进阶之 Scrapy 第四篇(图片下载管道篇) 2017 年 3 月 31 号 更新 http://www.mzitu.com/all 这个地址已经被站长屏蔽了。下面的代码没法使了哦!仅提供学习方法。 PS:更改了一个新手比较难理解的坑(切换目录的问题),大陆之外的小伙伴儿 需要翻墙,mzitu.com 对大陆之外好像不可访问。倒数第四个代码块儿是 没有函数的脚本写法,看函数有困难的小伙伴儿,可以先看看这个。 这是一篇完全给新手写的爬虫教程、也是我第一次写博文···也不知道怎么写(我也是个菜鸟啊!各路大神拍砖轻点儿啊!)QQ图片20161021223818由于经常在群里装逼加上群主懒啊(你看有多久没更新文章就知道了),让我来一篇爬虫的教程。QQ图片20161021224219如此装逼机会怎么能错过,今天我来给大家来一篇基础爬虫教程。 你要问目标是啥? 要知道 XX 才是学习最大的动力啊!所以目标就是 mzitu.com , QQ图片20161021224731(废话真多还不开始) , 下面请各位跟我的教程一步一步走,喂!!说的就是你啊!别看着了,照着教程做啊!9555112 1、基础环境部分: 工欲其事必先利器,要想把心爱的妹子搬进你的给她准备的房子,总得有几把斧子才行啊!下面这就是几把斧子! 1.1:Python 基础运行环境:本篇教程采用 Python3 来写,所以你需要给你的电脑装上 Python3 才行,我就说说 Windows 的环境(会玩 Linux 的各位应该不需要我多此一举了)。 anaconda (点我下载)(这是一个 Python 的科学计算发行版本,作者打包好多好多的包, QQ图片20161021230903不知道干啥的没关系,你只需要知道拥有它之后,那些 Windows 下 pip 安装包报错的问题将不复存在) 下载不顺利的同学我已经传到百度云了:http://pan.baidu.com/s/1boAYaTL 1.2:Requests urllib 的升级版本打包了全部功能并简化了使用方法(点我查看官方文档1.3: beautifulsoup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.(点我查看官方文档)(QQ图片20161022193315作为一个菜鸟就别去装逼用 正则表达式了,匹配不到想要的内容,容易打击积极性。老老实实的用beautifulsoup 吧!虽然性能差了点、但是你会爱上它的。) 1.4:LXML 一个 HTML 解析包 用于辅助 beautifulsoup 解析网页(如果你不用 anaconda,你会发现这个包在 Windows 下 pip 安装报错,QQ图片20161021230903用了就不会啦。)。 上面的模块需要 单独安装,下面几个就不用啦。 1.5: OS 系统内置模块 下面是IDE 你喜欢用什么就用什么啦! 1.6: PyCharm 一个草鸡好用的 PythonIDE 工具 、真滴!草鸡好用··(我是下载地址)试用三十天 足够完成这个小爬虫啦。(如果你电脑已经存在 Python 环境 又需要使用 anaconda 的话,请按照下面的图设置一下哦!) QQ图片20161022200505 好啦、下面开始安装需要的模块。 因为我安装的是anaconda这个科学计算的发行版,安装方式是酱紫滴:conda install 包名(当然 pip install 包名也是可以的哦!)

1
2
3
4
5
6
7
conda install requests
conda install beautifulsoup4
conda install lxml
或者
pip install requests
pip install beautifulsoup4
pip install lxml

QQ图片20161022200031 大概界面就是上面的样子了。其余类似安装即可,好啦 下面开始正题了 首先我们打开 PyCharm 新建一个 Python 文件,写入以下代码(喂喂!不要复制哦 自己敲一遍 印象更佳啦。)

1
2
3
import requests ##导入requests
from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
import os

好啦!准备工作完了、 我们来开始让妹子到碗里来吧ヽ(●-`Д´-)ノ 一个简单爬虫的诞生大慨需要下面几个步骤。(我知道图很简陋、请务必不要吐槽) QQ20161029-1

  • 爬虫入口:顾名思义我需要程序从什么地方开始获取网页
  • 存储数据:如果获取的网页有你需要的内容则取出数据保存
  • 找到资料所在的地址:如果你你获取到的网页没有你需要的数据、但是有前往该数据页面的地址 URL、则获取这个地址 URL,再获取该 URL 的页面内容(也就等于当作爬虫入口了)

好啦!图很简陋、将就着看看,现在来开始看看网页找一个爬虫入口(开始爬取的页面) QQ截图20161023150410 良心站长啊!居然有一个页面有整站所有的数据地址是http://www.mzitu.com/all 我们就以这个页面开始爬取(PS:真良心站长) 下面是我们的第一段代码:用作获取http://www.mzitu.com/all这个页面。

1
2
3
4
5
6
7
8
import requests ##导入requests
from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
import os

headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
all_url = 'http://www.mzitu.com/all' ##开始的URL地址
start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)

PS: 如果对 requests.get(all_url, headers=headers)感到不解的各位,请务必去再看一遍官方文档哦(解释得很清楚呢) 你在你的 IDE 中运行的时候会打印出下面的内容: QQ截图20161024203912 第一段部分完成啦!!是不感觉超简单!!!!看懂没?没看懂继续瞅瞅、对于看懂的各位小哥儿(妹儿)我只想说··· 小哥儿(妹儿)!你老牛逼了!! 没看懂?报错?没关系!看见屏幕右边那个群号没?加它!热心的群友会为你耐心解答滴············ 好啦!第一部分获取网页的部分完成啦!我们来开始第二部分提取我们想要的内容吧!! 在 Chrome 中打开我们第一部分请求的网址:http://www.mzitu.com/all 、 按下 F12 调出 Chrome 的开发者调试工具(不熟练的同学一定要去了解一下哦!爬虫中绝大部分工作要靠这个来完成呢!是必备技能哦!) 是这样: QQ截图20161024205256 看见图中那句话没?没看见?仔细看看那可是我们必须要使用的工具哦!!好啦下面我们看看使用方法 QQ图片20161025222942 好啦、我们就是通过这种方法来找到我们需要的数据在那一个标签里面的、方便后面提取出来啦!(实例很简陋 看不懂的童鞋百度一下啦!教程很多的) 你会发现这个页面并没有我们需要的图片地址啊!没有那么怎么办呢?上面那张超级简陋的流程图看了嘛?没看?赶快去瞅瞅·· 你就知道我们该干啥啦! 嗯,我们需要找到图片地址所在的页面! QQ截图20161025224053 观察一下网页你会发现图片页面的地址全部都在

  • ...
  • 标签中、(讲真!这么良心,还这么有规律的网页不多了啊!)不信啊?你展开
  • 标签瞅瞅就知道啦 QQ截图20161025224601 点开
  • 标签你会发现图片页面的地址标签的 href 属性中、主题标签中(搞不清楚的这两个的区别的同学、去了解一下 html 的基础啦!) 实现逻辑就是:先找到页面中的全部
  • 标签、然后提取出中间标签的 href 属性值与标签的类容,前者我们用来继续请求 html 看看会不会有我们需要的图片下载地址,后者我们存储的时候给文件夹命名使用。 可能有小哥儿(妹儿)会问,为什么不直接查找标签? 你观察一下网页就知道呐!还有其他地方使用了标签,如果直接查找标签就会多出很多我们不需要的东西,也不方便我们提取想要的东西,先查找
  • 标签就是限制一下标签的范围啦! 通过上面的方法、知道了需要的数据的位置!该我们的beautifulsoup来大展身手啦!!!加上上面的一段代码现在应该是这样的啦!看不懂?没关系 看注释 看注释。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import requests ##导入requests
    from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
    import os



    headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
    all_url = 'http://www.mzitu.com/all' ##开始的URL地址
    start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
    #print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
    Soup = BeautifulSoup(start_html.text, 'lxml') ##使用BeautifulSoup来解析我们获取到的网页(‘lxml’是指定的解析器 具体请参考官方文档哦)
    li_list = Soup.find_all('li') ##使用BeautifulSoup解析网页过后就可以用找标签呐!(find_all是查找指定网页内的所有标签的意思,find_all返回的是一个列表。)
    for li in li_list: ##这个不解释了。看不懂的小哥儿回去瞅瞅基础教程
    print(li) ##同上

    运行一下试试! QQ截图20161028113340 诶!!!不对啊!!抓到了我们不需要的东西啊!!!这可怎么办啊!! 别急 别急!我们再去看看网页的 F12 瞅瞅。 QQ截图20161028113957 找到啦!原来有其他地方有

  • 标签、观察不仔细啦!现在我们怎么办? 我们再去 F12 瞅瞅! QQ截图20161028114348 哈哈!这就简单了,我们推翻上面的思路 现在我们先找到
  • 标签呢!! 你仔细瞅瞅网页!在
    这个模块里面的
    标签的全是我们需要的东西,就不需要
  • 标签来限制提取范围啦!所以就直接扔掉了不用了。也方便写代码啊。 现在我们改改上面的代码!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import requests ##导入requests
    from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
    import os

    headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
    all_url = 'http://www.mzitu.com/all' ##开始的URL地址
    start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
    #print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
    Soup = BeautifulSoup(start_html.text, 'lxml') ##使用BeautifulSoup来解析我们获取到的网页(‘lxml’是指定的解析器 具体请参考官方文档哦)
    #li_list = Soup.find_all('li') ##使用BeautifulSoup解析网页过后就可以用找标签呐!(find_all是查找指定网页内的所有标签的意思,find_all返回的是一个列表。)
    #for li in li_list: ##这个不解释了。看不懂的效小哥儿回去瞅瞅基础教程
    #print(li) ##同上
    all_a = Soup.find('div', class_='all').find_all('a') ##意思是先查找 class为 all 的div标签,然后查找所有的<a>标签。
    for a in all_a:
    print(a)

    PS: ‘find’ 只查找给定的标签一次,就算后面还有一样的标签也不会提取出来哦! 而 ‘find_all’ 是在页面中找出所有给定的标签!有十个给定的标签就返回十个(返回的是个 list 哦!!),想要了解得更详细,就是看看官方文档吧! 来看看运行结果! QQ截图20161028150438 哇哦!!全是我们需要的类容诶!什么?你的和这个不一样?或者报错了?回头看看 你做的和我有什么不一样······ 实在不行,群里求助吧! 好啦!现在我们该来提取我们想要的内容了!又该我们 BeautifulSoup 大展身手了。 我们需要提取出标签的 href 属性和文本。怎么做呢?看代码!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import requests ##导入requests
    from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
    import os

    headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
    all_url = 'http://www.mzitu.com/all' ##开始的URL地址
    start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
    #print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
    Soup = BeautifulSoup(start_html.text, 'lxml') ##使用BeautifulSoup来解析我们获取到的网页(‘lxml’是指定的解析器 具体请参考官方文档哦)
    #li_list = Soup.find_all('li') ##使用BeautifulSoup解析网页过后就可以用找标签呐!(find_all是查找指定网页内的所有标签的意思,find_all返回的是一个列表。)
    #for li in li_list: ##这个不解释了。看不懂的效小哥儿回去瞅瞅基础教程
    #print(li) ##同上
    all_a = Soup.find('div', class_='all').find_all('a') ##意思是先查找 class为 all 的div标签,然后查找所有的<a>标签。
    # 页面更改 多了一个早期图片 需要删掉(小伙伴们 可以自己尝试处理一下这个页面)
    all_a.pop(0)
    # 上面是删掉列表的第一个元素
    for a in all_a:
    title = a.get_text() #取出a标签的文本
    href = a['href'] #取出a标签的href 属性
    print(title, href)

    就多了两行!很方便吧!!为什么这么写?自己去看官方文档啦!(我要全解释了,估计有些小哥儿官方文档都不会去看。这样很不好诶。) 来来!看看结果怎么样 我们来打印一下看看! QQ截图20161028152315 哈哈 果然是我们想要的内容!我们已经找向目标前进了一半了!好啦前面已经把怎么实现的方法讲清楚了哦(如果你觉得什么地方有问题或者不清楚,在群里说说 我好改改)下面就要开始加快节奏了!!(篇幅长了 会被人骂的!) 上面我们找到了 图片的标题(暂时不管,这是后面用来创建文件夹的)和 图片页面的地址(这是我们这一步需要做的),需要做什么请参考最上面那个超简陋的流程图。 先查看一下图片页面有什么东西 你会发现一个页面只有一张图片啊!想要下载一套啊! 你点一下面的 1 、2、3、4········ 你会发现地址栏里面的 URL 在变化啊!这就是我们的入手的地方了! QQ截图20161028164035 页码在标签中,我们只需要获取最后一个页面的页码, 从 1 开始历遍,和我们上面获取的 URL 拼接在一起就是每张图片的页面地址啦! 在页面的源代码搜一下标签 [![QQ截图20161028191747](http://cdn.cuiqingcai.com/wp-content/uploads/2016/10/QQ截图20161028191747-1024x554.png)](http://cdn.cuiqingcai.com/wp-content/uploads/2016/10/QQ截图20161028191747.png) 可以发现最后一个页面的标签是第二十一个标签,因为在 html 中标签是成对的,所以我需要查找的是第十一个标签(BeautifulSoup 是以开始的标签定位,而不是结尾的。开始的标签是这样<>;结束的标签是这样) 废话不多说上代码! PS:下面的代码我已经把注释掉的删掉了,所以看起来和上面的不太一样。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import requests ##导入requests
    from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
    import os


    headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
    all_url = 'http://www.mzitu.com/all' ##开始的URL地址
    start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
    Soup = BeautifulSoup(start_html.text, 'lxml') ##使用BeautifulSoup来解析我们获取到的网页(‘lxml’是指定的解析器 具体请参考官方文档哦)
    all_a = Soup.find('div', class_='all').find_all('a') ##意思是先查找 class为 all 的div标签,然后查找所有的<a>标签。
    # 页面更改 多了一个早期图片 需要删掉(小伙伴们 可以自己尝试处理一下这个页面)
    all_a.pop(0)
    # 上面是删掉列表的第一个元素
    for a in all_a:
    title = a.get_text() #取出a标签的文本
    href = a['href'] #取出a标签的href 属性
    html = requests.get(href, headers=headers) ##上面说过了
    html_Soup = BeautifulSoup(html.text, 'lxml') ##上面说过了
    max_span = html_Soup.find('div', class_='pagenavi').find_all('span')[-2].get_text() ##查找所有的<span>标签获取第十个的<span>标签中的文本也就是最后一个页面了。
    for page in range(1, int(max_span)+1): ##不知道为什么这么用的小哥儿去看看基础教程吧
    page_url = href + '/' + str(page) ##同上
    print(page_url) ##这个page_url就是每张图片的页面地址啦!但还不是实际地址!

    好啦!运行一下试试!就是下面这样: QQ截图20161028194230 完美!!每个页面的地址都出来啦!!! 下面开始找图片的实际地址啦! 随意打开上面的地址地用 F12 调试工具试试! QQ截图20161028195338 会发现我们需要的地址在

    中的标签的 src 属性中。是不是很眼熟啊!知道怎么写了吧?下面上代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    import requests ##导入requests
    from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
    import os


    headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
    all_url = 'http://www.mzitu.com/all' ##开始的URL地址
    start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
    Soup = BeautifulSoup(start_html.text, 'lxml') ##使用BeautifulSoup来解析我们获取到的网页(‘lxml’是指定的解析器 具体请参考官方文档哦)
    all_a = Soup.find('div', class_='all').find_all('a') ##意思是先查找 class为 all 的div标签,然后查找所有的<a>标签。
    # 页面更改 多了一个早期图片 需要删掉(小伙伴们 可以自己尝试处理一下这个页面)
    all_a.pop(0)
    # 上面是删掉列表的第一个元素
    for a in all_a:
    title = a.get_text() #取出a标签的文本
    href = a['href'] #取出a标签的href 属性
    html = requests.get(href, headers=headers) ##上面说过了
    html_Soup = BeautifulSoup(html.text, 'lxml') ##上面说过了
    max_span = html_Soup.find('div', class='pagenavi').find_all('span')[-2].get_text() ##查找所有的<span>标签获取第十个的<span>标签中的文本也就是最后一个页面了。
    for page in range(1, int(max_span)+1): ##不知道为什么这么用的小哥儿去看看基础教程吧
    page_url = href + '/' + str(page) ##同上
    img_html = requests.get(page_url, headers=headers)
    img_Soup = BeautifulSoup(img_html.text, 'lxml')
    img_url = img_Soup.find('div', class_='main-image').find('img')['src'] ##这三行上面都说过啦不解释了哦
    print(img_url)

    运行一下 QQ截图20161028200330 完美!就是我们想要的东西,下面开始保存了哦!哈哈!妹子马上就可以到你碗里去了! 首先我们要给每套图建一个文件夹,然后将下载的图片以 URL 的 xxxxx.jpg 中的 xxxxx 命名保存在这个文件夹里面。直接上代码了!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import requests ##导入requests
    from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
    import os


    headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
    all_url = 'http://www.mzitu.com/all' ##开始的URL地址
    start_html = requests.get(all_url, headers=headers) ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
    Soup = BeautifulSoup(start_html.text, 'lxml') ##使用BeautifulSoup来解析我们获取到的网页(‘lxml’是指定的解析器 具体请参考官方文档哦)
    all_a = Soup.find('div', class_='all').find_all('a') ##意思是先查找 class为 all 的div标签,然后查找所有的<a>标签。
    # 页面更改 多了一个早期图片 需要删掉(小伙伴们 可以自己尝试处理一下这个页面)
    all_a.pop(0)
    # 上面是删掉列表的第一个元素
    for a in all_a:
    title = a.get_text() #取出a标签的文本
    path = str(title).strip() ##去掉空格
    os.makedirs(os.path.join("D:\mzitu", path)) ##创建一个存放套图的文件夹
    os.chdir("D:\mzitu\\"+path) ##切换到上面创建的文件夹
    href = a['href'] #取出a标签的href 属性
    html = requests.get(href, headers=headers) ##上面说过了
    html_Soup = BeautifulSoup(html.text, 'lxml') ##上面说过了
    max_span = html_Soup.find('div', class_='pagenavi').find_all('span')[-2].get_text() ##查找所有的<span>标签获取第十个的<span>标签中的文本也就是最后一个页面了。
    for page in range(1, int(max_span)+1): ##不知道为什么这么用的小哥儿去看看基础教程吧
    page_url = href + '/' + str(page) ##同上
    img_html = requests.get(page_url, headers=headers)
    img_Soup = BeautifulSoup(img_html.text, 'lxml')
    img_url = img_Soup.find('div', class_='main-image').find('img')['src'] ##这三行上面都说过啦不解释了哦
    name = img_url[-9:-4] ##取URL 倒数第四至第九位 做图片的名字
    img = requests.get(img_url, headers=headers)
    f = open(name+'.jpg', 'ab')##写入多媒体文件必须要 b 这个参数!!必须要!!
    f.write(img.content) ##多媒体文件要是用conctent哦!
    f.close()

    好了!!来运行一下 QQ截图20161028205004 哈哈哈完美!!!以上完毕!下面我们来整理一下代码,弄个函数什么的提示下逼格!加点提示什么的 首先我们上面 requests 一共使用了三次,我们写一个函数复用 (别怕!一点都不难)

    1
    2
    3
    4
    def request(url):
    headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
    content = requests.get(url, headers=headers)
    return content

    当调用 request 的时候会获取 URL 地址的网页然后返回获取到的 response (response 是啥? 你理解成请求网页地址返回的源码就好了! 注意:如果请求的是多媒体文件的话 response 返回的是二进制文件哦!) 哈哈!第一个就写好啦,简单吧! 第二个是创建文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def mkdir(self, path):
    path = path.strip()
    isExists = os.path.exists(os.path.join("D:\mzitu", path))
    if not isExists:
    print(u'建了一个名字叫做', path, u'的文件夹!')
    os.makedirs(os.path.join("D:\mzitu", path))
    return True
    else:
    print(u'名字叫做', path, u'的文件夹已经存在了!')
    return False

    调用 mkdir 这个函数时,会在 D:\mzitu 文件下创建一个 path 这个参数的文件夹(是参数 不是 path 哦!就是你调用的时候传递什么参数给这个函数 就创建什么文件夹!这个函数可以存着,下载东西到本地 都可以用),另外一个好处就是在文件夹已经存在的情况下不会报错退出程序哦! 不使用就会诶! 好啦 剩下的我就一股脑的写出来了! PS: 感谢Lucibriel的提醒!(因为我的程序就在 D 盘,所以疏忽了 程序没在 D 盘 os.chdir() 不能切换目录的问题、已经就改过来了;非常抱歉。)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    import requests
    from bs4 import BeautifulSoup
    import os

    class mzitu():

    def __init__(self):
    self.headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"}
    def all_url(self, url):
    html = self.request(url)##调用request函数把套图地址传进去会返回给我们一个response
    all_a = BeautifulSoup(html.text, 'lxml').find('div', class_='all').find_all('a')
    # 页面更改 多了一个早期图片 需要删掉(小伙伴们 可以自己尝试处理一下这个页面)
    all_a.pop(0)
    # 上面是删掉列表的第一个元素
    for a in all_a:
    title = a.get_text()
    print(u'开始保存:', title) ##加点提示不然太枯燥了
    path = str(title).replace("?", '_') ##我注意到有个标题带有 ? 这个符号Windows系统是不能创建文件夹的所以要替换掉
    self.mkdir(path) ##调用mkdir函数创建文件夹!这儿path代表的是标题title哦!!!!!不要糊涂了哦!
    href = a['href']
    self.html(href) ##调用html函数把href参数传递过去!href是啥还记的吧? 就是套图的地址哦!!不要迷糊了哦!

    def html(self, href): ##这个函数是处理套图地址获得图片的页面地址
    html = self.request(href)
    self.headers['referer'] = href
    max_span = BeautifulSoup(html.text, 'lxml').find('div', class_='pagenavi').find_all('span')[-2].get_text()
    for page in range(1, int(max_span) + 1):
    page_url = href + '/' + str(page)
    self.img(page_url) ##调用img函数

    def img(self, page_url): ##这个函数处理图片页面地址获得图片的实际地址
    img_html = self.request(page_url)
    img_url = BeautifulSoup(img_html.text, 'lxml').find('div', class_='main-image').find('img')['src']
    self.save(img_url)

    def save(self, img_url): ##这个函数保存图片
    name = img_url[-9:-4]
    img = self.request(img_url)
    f = open(name + '.jpg', 'ab')
    f.write(img.content)
    f.close()

    def mkdir(self, path): ##这个函数创建文件夹
    path = path.strip()
    isExists = os.path.exists(os.path.join("D:\mzitu", path))
    if not isExists:
    print(u'建了一个名字叫做', path, u'的文件夹!')
    os.makedirs(os.path.join("D:\mzitu", path))
    os.chdir(os.path.join("D:\mzitu", path)) ##切换到目录
    return True
    else:
    print(u'名字叫做', path, u'的文件夹已经存在了!')
    return False

    def request(self, url): ##这个函数获取网页的response 然后返回
    content = requests.get(url, headers=self.headers)
    return content

    Mzitu = mzitu() ##实例化
    Mzitu.all_url('http://www.mzitu.com/all') ##给函数all_url传入参数 你可以当作启动爬虫(就是入口)

    QQ截图20161028215007 完美!!好啦!结束了! 如果大家觉得还能看懂、还行的话 我后面在写点儿其他的。 给大家看看我的成果 QQ截图20161028220006 最后感谢 mzitu.com 的站长。 后续几篇:

    小白爬虫第二弹之健壮的小爬虫

    小白爬虫第三弹之去重去重

    小白爬虫第四弹之爬虫快跑(多进程+多线程)

    小白进阶之 Scrapy 第一篇

    小白进阶之 Scrapy 第二篇(登录篇)

    Scrapy 分布式的前篇–让 redis 和 MongoDB 安全点

    小白进阶之 Scrapy 第三篇基于 Scrapy-Redis 的分布式以及 cookies 池