requests库+正则表达式--简单爬虫实例--美女图片篇

正则表达式–简单爬虫实例–4K美女篇

section1:声明

自己的学习笔记,爬取内容不会用于商业

section2:下载链接分析

首先,我们要找到我们想要爬取的详情页 4K美女
在这里插入图片描述
这里的图片就是我们想要的目标。
接下来,我们需要看一下这个页面的源代码进行进一步的分析。(可以选择右击检查或者使用快捷键Ctrl+Shift+I
以第一张图片为例(代码如下):
在这里插入图片描述
出现了源文件标签src,我们就想去拿它后面的内容然后和‘http://pic.netbian.com’部分整和成一个链接,但是如果你提前是网页上去试的话,会出现这个结果。
(为啥是和http://pic.netbian.com这个部分整和呢,因为这是网站首页链接,哈哈哈)
在这里插入图片描述

是一张缩略图,不是我们想要的高清大图。
我们再仔细看一下,源文件标签上面还有一个超链接标签,点一下,来到了这个页面:
在这里插入图片描述
那我们就再对这个页面进行检查一次好了。
在这里插入图片描述
又发现了一个源文件,那我们再和‘http://pic.netbian.com’组合一下试试!
在这里插入图片描述
ohhhhhh,是我们想要的高清大图!

那么接下来就是理清思路,开始爬虫吧!

section3:代码编写

1、导入板块

import requests
import re
import os

2、构造请求

headers = {
    
    
     'user - agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36'
}
url='http://pic.netbian.com/4kmeinv/'
response_1=requests.get(url=url,headers=headers)
html_1=response_1.text

对于Requests库的学习,我之前整理过一点点(当时还不会写,有点点乱)

网络爬虫-----Requests库入门

3、正则表达式的构造

因为我们从详情页到高清图,中间要先去另一个页面,所以我们构造的第一个正则表达式,是去另一个页面的。
在这里插入图片描述
我们需要的是超链接标签href后面的内容,于是正则表达式可以这样写:

<a.*?href.+?(/tupian.+?html)

正则表达式的常见符号,可以参考 正则表达式——常用的匹配规则

4、数据处理

构造完毕,我们就需要把这些数据取出来

image_urls=re.findall('<a.*?href.+?(/tupian.+?html)',html_1,re.S)

我们可以打印一下,看一看结果
在这里插入图片描述
我们可以看到是一个列表,re.findall拿到的结果是一个结果,这里需要注意一下。所以,我们要对这个结果进行遍历,以便我们使用。

for image_url in image_urls:
    picture_urls = 'http://pic.netbian.com' + image_url

因为提取到的结果不是一个完整的链接,所以我在遍历的时候,顺便给补全了。然后我们打印一下,看结果。
在这里插入图片描述
出现了,是一系列的链接,点击第一个,刚刚好是我们刚刚查看的那个,说明我们成功了。

接着,重复上面步骤对这个页面进行分析、提取数据

for image_url in image_urls:
    picture_urls = 'http://pic.netbian.com' + image_url
    # print(picture_urls)
    response_2 = requests.get(url=picture_urls, headers=headers)
    html_2 = response_2.text
    pictures = re.findall('<div.*?photo-pic.*?<img src="(/uploads.+?jpg).*?alt.+?"(.*?)"', html_2, re.S)

这里的正则表达式,我再构建的时候,提取的内容为源文件及alt后面的内容
在这里插入图片描述

    for picture in pictures:
        picture_url = picture[0]
        picture_src = 'http://pic.netbian.com' + picture_url#高清图的源文件链接

        picture_name = picture[1] + '.jpg'#构建准备保存的图片的名称
        picture_name = picture_name.encode('iso-8859-1').decode('gbk')#这里是防止图片名称出现乱码的情况

5、保存数据

首先,我们要创建一个文件夹

if not os.path.exists('D:/4K美女'):
    os.mkdir('D:/4K美女')

其次,对于我们拿到的数据做最后的处理

        picture_data = requests.get(url=picture_src, headers=headers).content#写入文件的内容——也就是想要的高清大图啦
        picture_path = 'D:/4K美女/' + picture_name#构建图片存储路径

最后,写入文件,进行保存收尾

        with open(picture_path, 'wb') as f:
            f.write(picture_data)
            print(picture_path, '下载完成')

6、完整代码

import requests
import re
import os

#创建文件夹
if not os.path.exists('D:/4K美女'):
    os.mkdir('D:/4K美女')

headers = {
    
    
     'user - agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36'
}
url='http://pic.netbian.com/4kmeinv/'
response_1=requests.get(url=url,headers=headers)
html_1=response_1.text
image_urls=re.findall('<a.*?href.+?(/tupian.+?html)',html_1,re.S)
# print(image_urls)
for image_url in image_urls:
    picture_urls = 'http://pic.netbian.com' + image_url
    # print(picture_urls)
    response_2 = requests.get(url=picture_urls, headers=headers)
    html_2 = response_2.text
    pictures = re.findall('<div.*?photo-pic.*?<img src="(/uploads.+?jpg).*?alt.+?"(.*?)"', html_2, re.S)

    for picture in pictures:
        picture_url = picture[0]
        picture_src = 'http://pic.netbian.com' + picture_url#高清图的源文件链接

        picture_name = picture[1] + '.jpg'#构建准备保存的图片的名称
        picture_name = picture_name.encode('iso-8859-1').decode('gbk')#这里是防止图片名称出现乱码的情况

        picture_data = requests.get(url=picture_src, headers=headers).content#写入文件的内容——也就是想要的高清大图啦
        picture_path = 'D:/4K美女/' + picture_name#构建图片存储路径

        # 保存图片
        with open(picture_path, 'wb') as f:
            f.write(picture_data)
            print(picture_path, '下载完成')

section4:补充(多页爬取)

如果想进行多页爬取,只需要给第一个url做一下for循环处理,即:

for i in range(2,5):
    url='http://pic.netbian.com/4kmeinv/index_{}.html'.format(i)
    response_1=requests.get(url=url,headers=headers)
    html_1=response_1.text

那么开冲吧!!!!!

这是我第一次完成一个爬虫实例,感觉我写的不错的小伙伴,可否给个赞支持一下呢,嘿嘿。

我知道,我可能有一些地方用语不是很规范,也希望能有大佬对我进行一些建议。

猜你喜欢

转载自blog.csdn.net/qq_44921056/article/details/112982240