【python爬虫】爬取美女图片

发布时间 2023-04-12 20:17:16作者: 秋天中的一片叶

一,导入包文件

  • os:用于文件操作。这里是为了创建保存图片的目录
  • re:正则表达式模块。代码中包含了数据处理,因此需要导入该模块
  • request:请求模块。通过该模块向对方服务器发送请求获取数据包
  • lxml:通过etree模块中的xpath方法来获取html标签中的属性值或者文本内容
  • headers:根据使用的浏览器不同,headers也不同。这里主要是做一层ua伪装。不然对方服务器很容易就看出我们的请求不是一个正常的请求而是一个爬虫。

 

import os
import re
import time
import requests
from lxml import etree

# 1.ua伪装
headers = {
    'Cookie': 'UM_distinctid=183de2bde63bdd-0a9891aebfde0c-26021f51-15f900-183de2bde64211; __gads=ID=12c03794dd79a744-22151ed314d7003e:T=1665879761:RT=1665879761:S=ALNI_MayIUbqx7Eoqn3Rfhw4y3sdBWO8Hw; __gpi=UID=00000b63230f485e:T=1665879761:RT=1665879761:S=ALNI_MY73_h2FkMuU64S-R9TpNud-Rao2Q; _d_id=1ac93cdb5a0e86565209190f7f0314; CNZZDATA1281132404=586521712-1665876889-https%253A%252F%252Fwww.baidu.com%252F%7C1665983833',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
}

二,程序入口和参数传值

  • main是程序的入口文件。代码的主要逻辑是因为我们发现,要访问的url网址,指定人物的第一页和第二页以后的地址不同。因此不能直接获取。所以需要做一个判断把两种情况都包含在内,这样就可以获取指定人物的所有分页中的图片。这个规律对这个网站的其他人物同样适用。
  • 将url传递给get_url函数中进行图片链接的获取并返回回来。返回值是links。这里存储着返回归来的图片地址。
  • 再将获取到的links数组传递给download函数进行处理和下载。
if __name__ == '__main__':
    # 每个url链接的第一页的页码和第二页以后的页面不同因此这里需要做一个判断
    for i in range(1, 2):
        if i == 1:
            url = 'http://www.cgtpw.com/xgmn/732.html'
        else:
            url = f'http://www.cgtpw.com/xgmn/732_{i + 1}.html'

        # 将url传递给get_url函数,并获得返回后的结果
        links = get_url(url)

        # 将get_url返回后的结果传递给download函数
        download(links)

  

三,获取图片链接

  • 注释中都细讲了每个步骤的意思,请参照注释。
# 2.获取url
def get_url(url):
    all_link = []  # 用于存储获取到的链接

# 发送请求 r = requests.get(url) time.sleep(1) r.encoding = r.apparent_encoding # 解决代码中文乱码问题 html = etree.HTML(r.text) # 获取链接指定目录页下的所有链接 pic_links = html.xpath('//div[@class="art-picBox"]/ul/li//a/@href') # 去重 set_links = list(set(pic_links)) # 获取的链接不完整,因此需要加上链接头部拼接链接 for link in set_links: index_urls = 'http://www.cgtpw.com' + link # 将拼接好的链接添加到all_link数组中并返回 all_link.append(index_urls) return all_link

四,下载并保存图片

 

# 3.下载图片
def download(links):
    # 遍历链接数组
    for link in links:
        # 通过正则表达式将链接中.html以外的部分提取出来。因为每个链接页跟之前一样第一页和第二页页码不同需要做处理
        new_str_list = re.sub(r'\.html$', '', link)

        try:
            # 为了存储图片要给图片编号因此这里用到了枚举
            for num, i in enumerate(range(1, 19)):
                num += 1

                # 如果链接为第一页则直接用Link,反之则拼接一下页码
                if i == 1:
                    url = link
                else:
                    url = new_str_list + f'_{i}.html'
                r = requests.get(url, headers=headers)
                time.sleep(1)

                # 这里是为了防止中文乱码
                r.encoding = r.apparent_encoding
                # 提取链接中的所有图片和title名称
                html = etree.HTML(r.text)
                title = html.xpath('//div[@class="art-top"]/h1/text()')[0]
                img_urls = html.xpath('/html/body/div[3]/div[2]//div[@class="artbody"]//img/@src')

                # 创建目录,如果目录不存在就创建目录文件夹。为了存储不同类型的照片
                if not os.path.exists(f'美女图片/{title}'):
                    os.makedirs(f'美女图片/{title}')

                # 获取到每个人对应的所有地址后进行逐一遍历
                for img in img_urls:
                    # 将图片以二进制码流的方式输出
                    pics = requests.get(img, headers=headers).content
                    # 存盘
                    with open(f'美女图片/{title}/{title}_{num}.jpg', 'wb') as f:
                        f.write(pics)
                        print(f'已下载>>{title}...编号:{num}')
                    # 关闭读写
                    f.close()
        except Exception:
            continue

五,完整代码

import os
import re
import time
import requests
from lxml import etree

# 1.ua伪装
headers = {
    'Cookie': 'UM_distinctid=183de2bde63bdd-0a9891aebfde0c-26021f51-15f900-183de2bde64211; __gads=ID=12c03794dd79a744-22151ed314d7003e:T=1665879761:RT=1665879761:S=ALNI_MayIUbqx7Eoqn3Rfhw4y3sdBWO8Hw; __gpi=UID=00000b63230f485e:T=1665879761:RT=1665879761:S=ALNI_MY73_h2FkMuU64S-R9TpNud-Rao2Q; _d_id=1ac93cdb5a0e86565209190f7f0314; CNZZDATA1281132404=586521712-1665876889-https%253A%252F%252Fwww.baidu.com%252F%7C1665983833',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
}


# 2.获取url
def get_url(url):
    all_link = []  # 用于存储获取到的链接

    r = requests.get(url)
    time.sleep(1)
    r.encoding = r.apparent_encoding  # 解决代码中文乱码问题
    html = etree.HTML(r.text)
    # 获取链接指定目录页下的所有链接
    pic_links = html.xpath('//div[@class="art-picBox"]/ul/li//a/@href')
    # 去重
    set_links = list(set(pic_links))

    # 获取的链接不完整,因此需要加上链接头部拼接链接
    for link in set_links:
        index_urls = 'http://www.cgtpw.com' + link

        # 将拼接好的链接添加到all_link数组中并返回
        all_link.append(index_urls)
    return all_link


# 3.下载图片
def download(links):
    # 遍历链接数组
    for link in links:
        # 通过正则表达式将链接中.html以外的部分提取出来。因为每个链接页跟之前一样第一页和第二页页码不同需要做处理
        new_str_list = re.sub(r'\.html$', '', link)

        try:
            # 为了存储图片要给图片编号因此这里用到了枚举
            for num, i in enumerate(range(1, 19)):
                num += 1

                # 如果链接为第一页则直接用Link,反之则拼接一下页码
                if i == 1:
                    url = link
                else:
                    url = new_str_list + f'_{i}.html'
                r = requests.get(url, headers=headers)
                time.sleep(1)

                # 这里是为了防止中文乱码
                r.encoding = r.apparent_encoding
                # 提取链接中的所有图片和title名称
                html = etree.HTML(r.text)
                title = html.xpath('//div[@class="art-top"]/h1/text()')[0]
                img_urls = html.xpath('/html/body/div[3]/div[2]//div[@class="artbody"]//img/@src')

                # 创建目录,如果目录不存在就创建目录文件夹。为了存储不同类型的照片
                if not os.path.exists(f'美女图片/{title}'):
                    os.makedirs(f'美女图片/{title}')

                # 获取到每个人对应的所有地址后进行逐一遍历
                for img in img_urls:
                    # 将图片以二进制码流的方式输出
                    pics = requests.get(img, headers=headers).content
                    # 存盘
                    with open(f'美女图片/{title}/{title}_{num}.jpg', 'wb') as f:
                        f.write(pics)
                        print(f'已下载>>{title}...编号:{num}')
                    # 关闭读写
                    f.close()
        except Exception:
            continue


if __name__ == '__main__':
    # 每个url链接的第一页的页码和第二页以后的页面不同因此这里需要做一个判断
    for i in range(1, 2):
        if i == 1:
            url = 'http://www.cgtpw.com/xgmn/732.html'
        else:
            url = f'http://www.cgtpw.com/xgmn/732_{i + 1}.html'

        # 将url传递给get_url函数,并获得返回后的结果
        links = get_url(url)

        # 将get_url返回后的结果传递给download函数
        download(links)
爬取春光图片网美女图片