吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1284|回复: 17
收起左侧

[已解决] 各位大佬,求助,爬取故宫桌面-有诸多细节让热心坛友指出了,希望小伙伴都来看看。

[复制链接]
user999 发表于 2022-5-23 19:15
本帖最后由 user999 于 2022-5-23 21:25 编辑

网址是这个:https://www.dpm.org.cn/lights/royal/p/1.html
路径清晰,网站带宽也足够。
但是,为什么总是随机的在某个图片,就出现错误。
因为需要组合网址,前面都没事,大概到了38张左右,就组合不上了。
下面是我的代码,有什么问题吗?如果有问题,为什么前面不出错,要到后面出错呢?
我观察了一下,如果不限制速度,大概26张左右就不行了。
我现在是随机4-8秒停顿,可以到38张左右。

[Python] 纯文本查看 复制代码
url = 'https://www.dpm.org.cn/lights/royal/p/1.html'
url2 = 'https://www.dpm.org.cn'
pno = 0
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
}

for no in range(1, 125):
        url = f'https://www.dpm.org.cn/lights/royal/p/{no}.html'
        r = requests.get(url=url, headers=headers)
        r.encoding = r.apparent_encoding
        allLink = parsel.Selector(r.text).xpath('//div[@class="list clearfix"]/div')
        
        for scanLink in allLink:
                time.sleep(random.randint(4, 8))
                title = scanLink.xpath('./h3').get()
                title = title.replace("<h3>", "")
                title = title.replace("</h3>", "")
                picLink = scanLink.xpath('./div/a/@href').get()
                piclink_2 = url2 + picLink
                picDown = requests.get(url=piclink_2, headers=headers)
                picDown.encoding = picDown.apparent_encoding
                imgLink = parsel.Selector(picDown.text).xpath('//div[@class="pictureshow"]/img/@src').get()
                print(imgLink)
                imgDown = requests.get(url=imgLink, headers=headers).content
                pno += 1
                print(f'------正在保存第{pno}张壁纸{title}----------')
                with open('img\\故宫壁纸\\' + title + ".jpeg", mode='wb') as f:
                        f.write(imgDown)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
applefans007 + 1 + 1 用心讨论,共获提升!

查看全部评分

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

getstr88 发表于 2022-5-23 19:44
你的描述就已经很说明问题了。尝试下中途更换IP,基本可以判断是同一个IP限定一段时间的下载次数
applefans007 发表于 2022-5-23 19:44
不懂 只能帮你加加人气了 话说我都不知道有这么个网站 正好ipad需要壁纸 还是谢谢lz了
XiaoZouYu 发表于 2022-5-23 19:48
 楼主| user999 发表于 2022-5-23 19:55
applefans007 发表于 2022-5-23 19:44
不懂 只能帮你加加人气了 话说我都不知道有这么个网站 正好ipad需要壁纸 还是谢谢lz了

壁纸相当无敌 ,你去看看就知道了。哈哈。
 楼主| user999 发表于 2022-5-23 19:57
getstr88 发表于 2022-5-23 19:44
你的描述就已经很说明问题了。尝试下中途更换IP,基本可以判断是同一个IP限定一段时间的下载次数

你好,谢谢你的回复。我请教一下:
我基本上就没找到可以用的免费代{过}{滤}理。。请问你有推荐吗
getstr88 发表于 2022-5-23 20:37
user999 发表于 2022-5-23 19:57
你好,谢谢你的回复。我请教一下:
我基本上就没找到可以用的免费代{过}{滤}理。。请问你有推荐吗

这个可不能推荐,不合规
JUNGLE_CN 发表于 2022-5-23 20:39
本帖最后由 JUNGLE_CN 于 2022-5-23 20:41 编辑

你写的太密了 看的头疼 简单重新写一个 没出现你说的断的问题  共爬了50多页 400+张   

也没出现什么IP问题


微信图片_20220523203801.png




import requests
import wget
import re
import time
old_time = time.time()
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36'
}

for i in range(0,124):

    url = 'https://www.dpm.org.cn/lights/royal/p/{}.html'.format(str(i))

    data = requests.get(url, headers=headers).text

    re_ = re.compile(r'<a class="a3" href="javascript:;" primaryId="(.*?)" litpic13')

    result = re_.findall(data)

    for it in result:
        print('正在下载', it)
        url2 = 'https://www.dpm.org.cn/download/lights_image/id/{0}/img_size/9.html'.format(it)

        wget.download(url2, 'img/{0}_{1}.jpg'.format(i, it))

print('下载完成')
current_time = time.time()
print("运行时间为" + str(current_time - old_time) + "s")

免费评分

参与人数 1吾爱币 +1 收起 理由
user999 + 1 谢谢你的测试,那就是我技术不到家了。回去继续研究。谢谢你的回答。

查看全部评分

surepj 发表于 2022-5-23 21:07
[Python] 纯文本查看 复制代码
import requests
import time
from lxml import etree

url = 'https://www.dpm.org.cn'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
}
for page in range(1, 125):
    resp = requests.get(url + f'/lights/royal/p/{page}.html', headers=headers)  # 循环翻页
    resp.encoding = resp.apparent_encoding
    # print(resp.text)
    html = etree.HTML(resp.text)
    pic_list = html.xpath('//*[@class="list clearfix"]/div')
    for i in pic_list:
        detail_url = i.xpath('./div[1]/a[1]/@href')[0]  # 壁纸详情页地址
        title = i.xpath('./h3/text()')[0]               # 壁纸标题(会有重名)
        # print(title,url + detail_url)
        time.sleep(1)
        detail_resp = requests.get(url + detail_url, headers=headers)  # 向详情页发起请求
        detail_resp.encoding = detail_resp.apparent_encoding
        # print(detail_resp.text)
        html_detail = etree.HTML(detail_resp.text)
        pic_url = html_detail.xpath('//*[@class="pictureshow"]/img/@src')[0]  # 壁纸高清图片地址
        if 'http' not in pic_url:  #  大概在38~39页后图片src就没有[url]https://www.dpm.org.cn[/url]开头了,故作判断
            pic_url = url + pic_url
        print(f'\r正在下载第{page}页:  {title}  {pic_url}',end='')
        time.sleep(1)
        with open(f'../img-test/000/{title}_{(pic_url.split("/"))[-1]}',mode='wb') as f:
            f.write((requests.get(pic_url, headers=headers)).content)  # 向图片地址发起请求,并保存内容
print('全部下载完成!')


楼主那个会中断,可能是因为后面的图片地址变了,没有https://www.dpm.org.cn开头了,所有请求会出错,我这里修改了下,做了判断,没有那个开头,就加上,应该就正常了。

免费评分

参与人数 1热心值 +1 收起 理由
user999 + 1 谢谢@Thanks!

查看全部评分

 楼主| user999 发表于 2022-5-23 21:14
surepj 发表于 2022-5-23 21:07
[mw_shl_code=python,true]import requests
import time
from lxml import etree

对,对对。就是你说的这个情况。
但是我奇怪的是,
我组合URL,最开始定义了前半段,后面是在XPATH里提取的。
奇怪的是,开始都是URL+XPATH提取,后面就变成了XPATH的那一段,URL不见了。
这种丢失的情况是为什么呢?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-1-13 02:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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