美文网首页Python
Python爬虫实践-爬取萌妹子图片

Python爬虫实践-爬取萌妹子图片

作者: 程序员LesterXu | 来源:发表于2020-08-16 11:22 被阅读0次

学了一段时间的Python了,上周尝试写了个爬虫练手。在这里分享一下。这次要爬取的是一个图片网站。很多萌妹子图片哦!偷偷背着女朋友爬的,怕被打。纯属学习,不做商业用途。网址:https://www.vmgirls.com/
谷歌浏览器打开网页。

  • 网站首页.png

网页滚到分组图片,今天我们就爬取最新分组图片

网站首页最新组图片.png

然后按F12 打开网页检查(或者鼠标右键单击点开检查),打开后如下图款中所示

  • image.png

然后刷新网页。
网页加载后,我们查看框中的信息。点击类型是document的请求。


image.png

点击后发现了,请求方法请求头等相关信息。


image.png

继续往下滚动,发现了“user-agent”信息,这个可以用来模拟人工网页浏览的行为。


image.png

到目前为止已经具备了基本的爬取网页内容条件了。
下面我们就用"requests"库进行爬取网页内容。
打开pycharm,coding开始。导入“requests”库。顺便把等下要用的库一起导入进来。如下

import requests  # 导入requests库,主要做网络请求
import re  # 导入正则表达式库,用于正则提取目标内容
import os  # 导入操作系统库
import time  # 导入时间库

我们先定义一个类就叫“WeiMeiGirls”类
然后定义一个初始化方法,初始化方法里面,我们定义好网址,请求头信息,主要是“User-Agent”。一个“run”方法

class WeiMeiGirls():
    def __init__(self):
        self.url_main = "https://www.vmgirls.com/"
        self.user_headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
            }

    def run(self):
           pass//run方法里面内容暂时不实现,先用pass,等下再完善
       

接下来我们接着写网页请求方法获取网页内容。

    def get_html_main(self):
        response_main = requests.get(self.url_main, headers=self.user_headers)
        assert response_main.status_code == 200  # 当响应码不是200时候,做断言报错处理
        html_main = response_main.text
        return html_main

这个方法可以返回网页内容。通过打印网页信息,我们发现返回的是HTML内容。部分HTML内容截图如下。


image.png

有了这些内容之后,我们就可以通过正则表达式获取到我们目标内容了。
接下来我们通过谷歌浏览器查看这些图片组的规律。谷歌浏览器左上角有个箭头工具,可以用来产值渲染后网页的原始HTML元素。如下图所示。

image.png

通过观察我们发现了这些组图原来在一个class为"row row-sm list-home list-grouped list-bordered-padding my-n2"大的<div>标签中。大的<div>标签中有嵌套了一组组的小的<div>


image.png

再进行分析这些小的div标签。


image.png

我们发现原来这些<div>标签中有,我们想要的内容,组图标题,组图封面图地址。还有一个很重要的就是组图详情页,详情页就是组图里所有的图片。所以现在我们知道了,只要获取这三个内容就可以。经过观察发现详情页中也包含组图封面,还有组图标题,所以只要获取详情页网址就可以了。
下面就开始写正则匹配需要的的数据。这个网址是写在一个<a>标签中,所以正则可以如下这样写。下面这个方法是获取组图详情页网址的。注意,每次的网络请求最好延迟10秒钟。不要请求过快。不要把服务器弄卡,占用过高的资源。

# 对请求返回内容进行正则表达式 获取组图详情页网址,列表返回。
    def get_detail_url(self,html):
        url_detail_content = re.findall('<a class="media-content" href="(.*?)" title="(.*?) data-bg="(.*?)">', html)
        url_detail_list=[]
        for itme in url_detail_content:
            url_detail = itme[0]
            url_detail_list.append(url_detail)
        return url_detail_list

有了详情页网址列表,我们再定义一个方法来获取下载图片

# 获取图片组名称,图片下载链接,下载并保存图片
    def get_pictures_groupname(self,url_details):
# for循环 到链接列表获取到 链接,然后进行request请求
        for detail_url in url_details:
            # 拼接详情页网址
            detail_url = self.url_main + detail_url
            # 请求详情页
            respons_detail = requests.get(detail_url, headers=self.user_headers)
            assert respons_detail.status_code == 200
            html_detail = respons_detail.text

            # 对请求返回内容进行正则表达式 获取图片下载链接
            url_detail_list = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html_detail)
            # print(url_detail_list)
            # 获取图片组名称
            groupname = re.findall('<a href=".*?" alt=".*?" title="(.*?)">', html_detail)
            print(groupname[0])
            time.sleep(5)  # 设定5秒延时

通过上面已经或到了图片组名称和图片下载链接分别放到了两个列表中,一个是图片链接列表,一个是图片组名称列表,图片组名称取下标为0的元素就可以。
接下来做两个事情,一个是通过拼接图片地址并且下载图片,二是通过组名来命名文件夹名称。然后把图片保存到相应的文件夹。代码如下。

            # 使用enumerate函数,取出列表元素值和下标
            for index, picture_url_tem in enumerate(url_detail_list):
                # 拼接图片地址
                picture_url = self.url_main+picture_url_tem
                # requests get 请求
                picture_reponse = requests.get(picture_url,headers=self.user_headers)
                # 文件夹名字
                dir_name = str(groupname[0])
                file_name = str(index)+'.jpeg'

                if not os.path.exists(dir_name):  # 判断文件夹是否存在,如果不存在:
                    os.mkdir(dir_name)  # 创建一个文件夹

                with open(dir_name + '/' + file_name, 'wb') as f:  # 用wb模式打开创建文件,w写模式
                    f.write(picture_reponse.content)  # 写入二进制文件内容
                time.sleep(5)

到此为止就把整个爬取流程写完了。把这些定义的方法,放到run方法跑起来。

    def run(self):
        # 获取网易内容
        html_main = self.get_html_main()
        # 获取详情页内容,筛选出每组图详情页网址
        detail_url_list = self.get_detail_url(html_main)
        # 获取图片组名称,图片下载链接,下载并保存图片
        get_pictures = self.get_pictures_groupname(detail_url_list)

最后放到main函数跑起来。

if __name__ == "__main__":
    # 实例化这个WeiMeiGirls类
    weimei = WeiMeiGirls()
    # 调用run方法
    weimei.run()

跑起来后,就吹着空调,挖着,撸撸猫,坐等收图。

  • image.png
  • image.png

这里还有很多没有做好的,比如多线程,比如把这些获取的信息存入数据库等等。后面将继续优化。请关注下一篇文章。
源码地址:https://github.com/LesterZoeyXu/pachong
或者对Python感兴趣的朋友可以关注我的简书和公众号。

码农不头秃

相关文章

网友评论

    本文标题:Python爬虫实践-爬取萌妹子图片

    本文链接:https://www.haomeiwen.com/subject/bwnndktx.html