【python】python 爬虫(python抓取网站的图片)

本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载。
在这里插入图片描述

1.什么是爬虫

以前从来没学过如何写爬虫,借学python的机会,学习写爬虫,什么是爬虫呢?

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

2.爬虫的思想

比如说网站http://www.mzitu.com/,这里面有很多诱惑的图片,我们想下载下来,我要一个一个的去下载吗?这也太难了,太繁琐了,写个程序下载就好了,而下载我们知道下载图片需要图片的地址比如http://i.meizitu.net/2018/02/03c03.jpg这个图片的连接

<a href="http://www.mzitu.com/118979/4"><img src="http://i.meizitu.net/2018/02/03c03.jpg" alt="软妹子艾可丝从青涩稚嫩向成熟性感蜕变"></a>

但是我们不知道图片的连接啊,所以我要去下载到有图片网站的html文件,从里面分析出来图片的地址。然后发请求去获取图片的内容,最后存储到本地,就是下载了。
那么由此可见爬虫分为以下几步:

1。确定要爬虫爬取的目标:http://www.mzitu.com/xinggan/
2。分析网站html

在这里插入图片描述

看图知道总共有98页,每页又有很多图集。

3。点开一个图集

在这里插入图片描述

每个图集都有很多图片

那么我们需要先获取2。3两步的数字,才能获取这个性感标签下的所有图片。

一些知识

1 。 环境的搭建请看:

http://blog.csdn.net/qq_21383435/article/details/79240276

2 .

使用from urllib import request我们知道能根据一个超链接地址发送请求获取里面的html,但是这个去抓取网页图片会被禁止,所以我们要伪造来源reference,不然会这样

在这里插入图片描述

人家看你一直起请求数据,会认为你是恶意来抓取图片的,时间久了会禁止你连接,所以我们要在程序运行期间不停地伪造来源reference

3 。:Requests urllib的升级版本打包了全部功能并简化了使用方法(点我查看官方文档)

4 : beautifulsoup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.(点我查看官方文档)(QQ图片20161022193315作为一个菜鸟就别去装逼用 正则表达式了,匹配不到想要的内容,容易打击积极性。老老实实的用beautifulsoup 吧!虽然性能差了点、但是你会爱上它的。)

5 :LXML 一个HTML解析包 用于辅助beautifulsoup解析网页(如果你不用anaconda,你会发现这个包在Windows下pip安装报错,QQ图片20161021230903用了就不会啦。)。

上面的模块需要 单独安装,下面几个就不用啦。

6 : OS 系统内置模块

代码

from bs4 import BeautifulSoup  ##导入bs4中的BeautifulSoup
import os
import requests ##导入requests

#浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
headers = {'Accept': '*/*',
           'Accept-Language': 'en-US,en;q=0.8',
           'Cache-Control': 'max-age=0',
           'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
           'Connection': 'keep-alive',
           'Referer': 'http://www.mzitu.com/'
          }

all_url = 'http://www.mzitu.com/xinggan/'  ##开始的URL地址
start_html = requests.get(all_url,  headers=headers).content.decode('utf-8')
# print(start_html)
###########   我们的低2步 获取98页的超链接
Soup = BeautifulSoup(start_html, 'lxml')  ##使用BeautifulSoup来解析我们获取到的网页(‘lxml’是指定的解析器 具体请参考官方文档哦)
all_a = Soup.find('div', class_='nav-links').find_all("a")[-2].get_text()  ##意思是先查找 class为 all 的div标签,然后查找所有的<a>标签。
#print(all_a)
for page in range(1, int(all_a)+1):
    page_url = all_url + 'page/' + str(page) + "/"  ##同上
    #print(page_url)

    ###########   我们的3步 获取98页中每一页图的超链接
    page_html = requests.get(page_url, headers=headers).content.decode('utf-8')
    #print(page_html)
    #print("===================")
    mpage_scop = BeautifulSoup(page_html, 'lxml')
    page_html_html = mpage_scop.find('ul', id='pins').find_all('a')  # .find_all("a")[-2].get_text()
    print("==========>",page_html_html)
    for a in page_html_html:
        tu_href = a['href']  # 取出a标签的href 属性

        title = a.get_text()  # 取出a标签的文本
        path = str(title).strip()
        if path != '':
            # 这一点在循环里不停地伪造来源
            headerstwo = {'Accept': '*/*',
                       'Accept-Language': 'en-US,en;q=0.8',
                       'Cache-Control': 'max-age=0',
                       'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
                       'Connection': 'keep-alive',
                       'Referer': tu_href
                       }
            # 因为目录不能包含以下特殊字符 否则会报错
            path = path.replace(":", "")
            path = path.replace("?", "")
            path = path.replace("?", "")
            path = path.replace("\\", "")
            path = path.replace("\/", "")
            path = path.replace("*", "")
            path = path.replace("'", "")
            path = path.replace("\"", "")
            path = path.replace("<", "")
            path = path.replace(">", "")
            path = path.replace("|", "")
            print("=========", path)
            os.makedirs(os.path.join("J:\mzitu3", path)) ##创建一个存放套图的文件夹
            os.chdir("J:\mzitu3\\"+path) ##切换到上面创建的文件夹

            ###########   我们的4步 获取98页中每一页图的超链接 对应图集的每张图的超链接
            tu_html = requests.get(tu_href, headers=headerstwo).content.decode('utf-8')
            tu_scop = BeautifulSoup(tu_html, 'lxml')
            tu_html = tu_scop.find('div', class_='pagenavi').find_all("a")[-2].get_text()
            #print(tu_html)
            for tu_real in range(1, int(tu_html)+1):
                each_url = tu_href + '/' + str(tu_real)
                print(each_url)
                each_html = requests.get(each_url, headers=headerstwo).content.decode('utf-8')
                img_Soup = BeautifulSoup(each_html, 'lxml')
                img_url = img_Soup.find('div', class_='main-image').find('img')['src']
                #print(img_url)
                name = img_url[-9:-4]  ##取URL 倒数第四至第九位 做图片的名字
                img = requests.get(img_url, headers=headerstwo)
                f = open(name + '.jpg', 'ab')  ##写入多媒体文件必须要 b 这个参数!!必须要!!
                f.write(img.content)  ##多媒体文件要是用conctent哦!
                f.close()

运行结果

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九师兄

你的鼓励是我做大写作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值