吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5920|回复: 37
收起左侧

[Python 转载] Python爬虫实现下载某图片站内容

  [复制链接]
此称江初 发表于 2020-6-18 21:50
本帖最后由 此称江初 于 2020-6-19 08:30 编辑

原创的一个小爬虫
偶然间发现这个网站上面的图片特别多,而且也蛮有欣赏价值,索性利用闲暇时间分析了一下网站源码、路由、结构。然后用PyCharm写下了这个网站的爬虫程序。

环境:Python
所需库:lxml requests threading2

全站图片多线程下载!!!
站点链接在Code里面
Centos 7、Debian 9/10、Windows7/10 均通过测试正常运行

python运行记得安装所需库


运行截图:
D@72KSZ$R1SP_`Q)DAHTV.png
Code:
[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#Code by 此称江初
import requests,os,threading
from lxml import etree

Url = "https://www.moestack.com/all"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"}

def Mkdir(path):
    path = path.strip()
    path = path.rstrip("\\")
    isExists = os.path.exists(path)
    if not isExists:
        os.makedirs(path)
        return True
    else:
        pass

def Get_Page(x):
    Page = requests.get(x,headers=headers)
    Page.encoding = "utf-8"
    Page = Page.text
    Page = etree.HTML(Page)
    return Page
def end():
    ImgUrl = GetImgUrl[i]
    save_img = requests.get(ImgUrl, headers=headers)
    with open(r"Moe/" + Title[0] + "/" + ImgUrl[-27:] + ".jpg", "wb") as fh:
        fh.write(save_img.content)
        fh.flush()
def DownImg():
    global i
    global t
    path = "Moe/" + Title[0] + "/"
    Mkdir(path)
    threads = []
    for i in range(len(GetImgUrl)):
        t = threading.Thread(target=end,daemon=True)
        t.start()
        threads.append(t)
    for t in threads:
        t.join()
    print("下载完成")

def OnePageDown(x):
    global Title,GetImgUrl
    GetImgUrl = Get_Page(x).xpath('//*/div[2]/div/div[1]/p/img/@src')
    Title = Get_Page(x).xpath('//*[@class="entry-title"]/text()')
    print("标题:" + Title[0])
    print("一共有%d张图片"%len(GetImgUrl))
    DownImg()

def PageDown(x):
    ImgPageUrl = Get_Page(x).xpath('//*[@class="entry-media"]/div/a/@href')
    for i in ImgPageUrl:
        OnePageDown(i)

def AllDown(x):
    PageNum = Get_Page(x).xpath('/html/body/div/div[3]/div/div[2]/div/div/main/div[2]/ul/li[6]/a/text()')
    print("全站共有%d页"%int(PageNum[0]))
    for i in range(int(PageNum[0])):
        i = i + 1
        if i == '1':
            PageUrl = "https://www.moestack.com/all"
            PageDown(PageUrl)
        else:
            PageUrl = "https://www.moestack.com/all" + "/page/" + str(i)
            PageDown(PageUrl)

def main():
    print("菜单:\n1.单页下载\n2.页面下载\n3.全站下载(Boom!!!)")
    Choice = input("请选择:")
    if Choice == '1':
        ImgPageUrl = input("请输入链接:")
        OnePageDown(ImgPageUrl)
    elif Choice == '2':
        PageUrl = input("请输入页面链接:")
        PageDown(PageUrl)
    elif Choice == '3':
        AllDown(Url)

if __name__ == "__main__":
    main()#Code by 此称江初


下载地址:https://52pojie.shop

Python小白,大佬勿喷。

转载请注明出处

免费评分

参与人数 10吾爱币 +11 热心值 +9 收起 理由
7860045 + 1 + 1 我很赞同!
hahaxi + 1 谢谢@Thanks!
科学家玩家 + 1 + 1 我很赞同!
王星星 + 1 + 1 谢谢@Thanks!
lmt19841123 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
gengjianl + 1 + 1 我很赞同!
sgch007 + 1 + 1 谢谢@Thanks!
宅男℃ + 1 + 1 我很赞同!
loo1221ool + 1 + 1 我很赞同!
xccxvb + 2 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

WuMingCop 发表于 2021-2-27 02:16
下全站的时候老是卡死或者报错,不知道是不是我电脑的原因。
于是我简单的改造了一下,加了个 超时重试 和 缓存判断
[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Code by 此称江初
import random
import os
import requests
import threading
import time
from lxml import etree

Url = "https://www.moestack.com/all"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"}


def Mkdir(path):
    path = path.strip()
    path = path.rstrip("\\")
    isExists = os.path.exists(path)
    if not isExists:
        os.makedirs(path)
        return True
    else:
        pass


def Get_Page(x):
    Page = gethtml(x, headers=headers)
    Page.encoding = "utf-8"
    Page = Page.text
    Page = etree.HTML(Page)
    return Page


def gethtml(url, headers):
    i = 0
    while i < 3:
        try:
            html = requests.get(url, headers=headers, timeout=5)
            return html
        except requests.exceptions.RequestException:
            i += 1
    print("超时:" + url)


def end():
    ImgUrl = GetImgUrl[i]
    save_img = gethtml(ImgUrl, headers=headers)
    if not os.path.exists(r"Moe/" + Title[0] + "/" + ImgUrl[-27:] + ".jpg"):
        with open(r"Moe/" + Title[0] + "/" + ImgUrl[-27:] + ".jpg", "wb") as fh:
            fh.write(save_img.content)
            fh.flush()


def GetFiles(path):
    dirnum = 0
    filenum = 0
    for lists in os.listdir(path):
        sub_path = os.path.join(path, lists)
        # print(sub_path)
        if os.path.isfile(sub_path):
            filenum = filenum+1
        elif os.path.isdir(sub_path):
            dirnum = dirnum+1
    return filenum


def DownImg():
    global i
    global t
    path = "Moe/" + Title[0] + "/"
    if os.path.exists(path):
        if GetFiles(path) == len(GetImgUrl):
            print('以缓存:' + Title[0])
            return
    print('开始下载:' + Title[0])
    Mkdir(path)
    threads = []
    for i in range(len(GetImgUrl)):
        t = threading.Thread(target=end, daemon=True)
        t.start()
        threads.append(t)
    for t in threads:
        # time.sleep(0.1)
        t.join()
    print("下载完成")


def OnePageDown(x):
    global Title, GetImgUrl
    GetImgUrl = Get_Page(x).xpath('//*/div[2]/div/div[1]/p/img/@src')
    Title = Get_Page(x).xpath('//*[@class="entry-title"]/text()')
    print("标题:" + Title[0])
    print("一共有%d张图片" % len(GetImgUrl))
    DownImg()


def PageDown(x):
    ImgPageUrl = Get_Page(x).xpath('//*[@class="entry-media"]/div/a/@href')
    print("此页共有%d章" % len(ImgPageUrl))
    # OnePageDown(ImgPageUrl[random.randint(1, len(ImgPageUrl))])
    for i in ImgPageUrl:
    	OnePageDown(i)


def AllDown(x):
    PageNum = Get_Page(x).xpath('/html/body/div/div[3]/div/div[2]/div/div/main/div[2]/ul/li[6]/a/text()')
    print("全站共有%d页" % int(PageNum[0]))
    PageUrl = "https://www.moestack.com/all" + "/page/" + str(random.randint(1, int(PageNum[0])))
    #PageDown(PageUrl)
    for i in range(int(PageNum[0])):
        i = i + 1
        if i == '1':
            PageUrl = "https://www.moestack.com/all"
            PageDown(PageUrl)
        else:
            PageUrl = "https://www.moestack.com/all" + "/page/" + str(i)
            PageDown(PageUrl)


def main():
    print("菜单:\n1.单页下载\n2.页面下载\n3.全站下载(Boom!!!)")
    Choice = input("请选择:")
    if Choice == '1':
        ImgPageUrl = input("请输入链接:")
        OnePageDown(ImgPageUrl)
    elif Choice == '2':
        PageUrl = input("请输入页面链接:")
        PageDown(PageUrl)
    elif Choice == '3':
        AllDown(Url)


if __name__ == "__main__":
    main()  # Code by 此称江初
bookaccount 发表于 2020-6-19 07:02
xccxvb 发表于 2020-6-18 21:56
 楼主| 此称江初 发表于 2020-6-18 21:58
xccxvb 发表于 2020-6-18 21:56
我只要你第八行代码!

拿去吧 紫薯布丁
cherrypi 发表于 2020-6-18 22:05
谢谢分享。学习学习。
xccxvb 发表于 2020-6-18 22:12

你试过全站下载没,会不会封ip
 楼主| 此称江初 发表于 2020-6-18 22:15
xccxvb 发表于 2020-6-18 22:12
你试过全站下载没,会不会封ip

并不会,请准备50GB硬盘,挂服务器上了好几次 15G磁盘全部塞满
xccxvb 发表于 2020-6-18 22:17
此称江初 发表于 2020-6-18 22:15
并不会,请准备50GB硬盘,挂服务器上了好几次 15G磁盘全部塞满

我是感觉硬盘可能会不够用,我这就去换个移动硬盘存着,希望网站不要坏掉哈哈
涛涛大胖胖 发表于 2020-6-18 22:43
我怀疑你在ghs,我上去第一张就,,,,
barnett2016 发表于 2020-6-18 22:59
你这个shop网站源码有吗,看上去是个很简洁的网盘
 楼主| 此称江初 发表于 2020-6-18 23:00
barnett2016 发表于 2020-6-18 22:59
你这个shop网站源码有吗,看上去是个很简洁的网盘

Powered by  h5ai
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-16 15:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表