Xiexian 发表于 2023-2-6 18:27

爬取桌面壁纸()


新人贴哈!刚刚学完如何爬取图片。
前言
1、本人作为一名初学者,爬取网页仅做学习
2、代码仅供参考,多有不足望指教
3、可自行更换爬取始末页以及某页中图片的爬取始页,代码中有注释
4、需要在项目路径下自己创建爬取图片保存路径,如代码所示
代码还有很多不足,请大佬们宽容见谅哈.

import requests
from lxml import etree
import re
import json
from concurrent.futures import ThreadPoolExecutor

domain = "https://desk.zol.com.cn"


def get_detail_href(url):
    """
    该函数负责获取到每一个详情页的href的值
    """
    resp = requests.get(url)
    resp.encoding = "gbk"
    et = etree.HTML(resp.text)
    # 获取详情页的地址
    hrefs = et.xpath("//ul[@class='pic-list2clearfix']/li/a/@href")   # 这里有点问题所以无法执行
    # 处理一下href. 需要添加域名
    new_hrefs = []
    # 去掉最前面得两个li
    del hrefs   # 不算后面哪个
#   del hrefs      删除一个后会形成一个新得列表
#   del hrefs
    for href in hrefs:
      new_hrefs.append(domain + href)
      print(href)



    return new_hrefs


def get_img_srcs(href):
    """
    访问每一个详情页. 得到每个详情页背后对应的一组图片的下载路径
    """
    resp = requests.get(href)
    resp.encoding = "gbk"
    obj = re.compile(r"var deskPicArr.*?=(?P<desk_str>.*?);", re.S)
    # 提取页面中关于图片路径的信息
    result = obj.search(resp.text).group("desk_str")
    desk_dict = json.loads(result)# 把页面中提取到的字符串处理成字典
    img_src_list = []
    for item in desk_dict['list']:
      ori = item.get("oriSize")
      img_src = item.get("imgsrc")
      img_src = img_src.replace("##SIZE##", ori)
      img_src_list.append(img_src)
    return img_src_list


def download_img(img_src):
    """
    下载图片
    :param img_src:xxxx
    """
    name = img_src.split("/")[-1]
    print(f"开始下载{name}")
    resp = requests.get(img_src)
    with open(f"new/{name}", mode="wb") as f:
      f.write(resp.content)
    print(f"{name}下载完毕!")


def main():
    for i in range(1, 10):
      url = "https://desk.zol.com.cn/pc/"
      if i !=1 :
            url = url + f"{i}.html"
      print(url)


      print("抓取到首页中每个详情页的href......")
      hrefs = get_detail_href(url)
      
      print("抓取到首页中每个详情页的href......搞定!")

      print("访问每一个详情页. 得到每个详情页背后对应的一组图片的下载路径")
      img_list = []# 装着所有的图片下载地址
      for href in hrefs:
            # 2. 访问每一个详情页. 得到每个详情页背后对应的一组图片的下载路径
            img_src_list = get_img_srcs(href)
            for img in img_src_list:
                img_list.append(img)
      print("访问每一个详情页. 得到每个详情页背后对应的一组图片的下载路径....搞定!!!")

      # 3. 开始下载图片
      with ThreadPoolExecutor(20) as t:
            for img in img_list:# img: 图片下载路径
                t.submit(download_img, img)

      print("all over!!!")


if __name__ == '__main__':
    main()

zhcj66 发表于 2023-2-6 21:01

感谢分享,小女生很喜欢

kaishia 发表于 2023-2-6 21:24

感谢分享,学到了

leoxxxiyu 发表于 2023-2-6 21:34

谢谢很喜欢

lcsj52 发表于 2023-2-6 21:35

哈哈哈点进来之前我还以为真的是获取桌面壁纸

BOSS123 发表于 2023-2-6 21:46


感谢分享,学到了

Mimikko 发表于 2023-2-6 22:39

66666,解我燃眉之急

waweiggfnh 发表于 2023-2-7 08:37

女孩子们最喜欢这种卡通的啦

Xiexian 发表于 2023-2-7 08:51

没想到第一次发学习贴这么多人看,我还以为我这种小白没人看嘞,谢谢大家!

XiaoZouYu 发表于 2023-2-7 10:01

哈哈哈,女朋友可喜欢了。感谢楼主
页: [1] 2
查看完整版本: 爬取桌面壁纸()