爬取电脑壁纸网站,软件区同步分享成品
本帖最后由 MyModHeaven 于 2022-4-10 22:55 编辑# 背景
- 这是第二次发这个网站的爬虫,第一次在这里:
python爬取壁纸,软件区同步发布成品,以及记录我的倔强
https://www.52pojie.cn/thread-1528918-1-1.html
(出处: 吾爱破解论坛)
- 原来的可能不能用了,网站的 HTML 源码有有改动
- 上一次是用 lxml 库写的,这次用 bs4 库
- 另外还做了一些小改进,提高了程序的稳定性和可读性
- 这次还下载了 666 张美女类别下的壁纸,但中间出了一个小问题,导致下面的下载链接里只有 644 张图片
[!(https://s1.ax1x.com/2022/04/10/LAaz2n.jpg)](https://imgtu.com/i/LAaz2n)
[!(https://s1.ax1x.com/2022/04/10/LAdCrV.jpg)](https://imgtu.com/i/LAdCrV)
下载:
644 张美女电脑壁纸图片
https://www.52pojie.cn/thread-1619753-1-1.html
(出处: 吾爱破解论坛)
# 说明
- 下载下来的图片放在 D 盘的 photo_from_netbian.com 文件夹里
- 爬的网站是:http://www.netbian.com
- 编程语言区不能发软件成品,所以我发在了这里:
电脑壁纸爬取下载软件
https://www.52pojie.cn/thread-1619790-1-1.html
(出处: 吾爱破解论坛)
# 源码
```py
import requests, os
from bs4 import BeautifulSoup
def req(url, direc=True):
headersvalue = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50'
}
r = requests.get(url, headers=headersvalue)
if direc:
r.encoding = 'gbk'
soup = BeautifulSoup(r.text, 'lxml')
return soup
else:
return r
def flag(s):
flag = True
while flag:
try:
n = int(input(s + "\n"))
flag = False
except ValueError:
print('\n输入有误,请输入一个正整数!!!\n')
except:
continue
return n
def get_jpg(index_url):
n = flag('需要下载多少张壁纸?')
ndp, i_url = 0, index_url # ndp: numbers of downloaded phtots
for i in range(1, n//19+2):
print(f'接下来下载所选分类的第 {i} 页')
node_a = req(i_url).find('div', {'class': 'list'}).find_all('a')
page_urls = ['http://www.netbian.com'+a.attrs['href'] for a in node_a]
for page_url in page_urls:
try:
attrs = req(page_url).find('div', {'class': 'pic'}).img.attrs
except requests.exceptions.ConnectionError:
if page_url == 'http://www.netbian.comhttp://pic.netbian.com/':
continue # 跳过每页的第三张图片
else:
print('好像发生了未知错误 1 ,,,')
except:
print('好像发生了未知错误 2 ,,,')
jpg_url, jpg_title = attrs['src'], attrs['title']
if not os.path.exists(r'd:\photo_from_netbian.com'):
os.mkdir(r'd:\photo_from_netbian.com')
with open(fr'd:\photo_from_netbian.com\{jpg_title}.jpg', 'wb') as f:
f.write(req(jpg_url, direc=False).content)
ndp += 1
print(f'第 {ndp} 张图片下载完成!')
if ndp == n:
break
if ndp == n:
break
i_url = '{}index_{}.htm'.format(index_url, i+1)
print(f'{n}张图片全部下载完成,默认保存位置是 d:\photo_from_netbian.com')
print('''网站的壁纸按内容分类,共有 23 种,分别是:\n
1. 日历 2. 动漫 3. 风景 4. 美女 5. 游戏 6. 影视 7. 动态 8. 唯美 9.设计 10.花卉 11.动物 12.节日
13.人物 14.美食 15.水果 16.建筑 17.体育 18.军事 19.非主流20.护眼 21.LOL 22.王者荣耀 23.其他\n\n''')
choice = flag('按照分类下载,输入对应分类序号;随机下载,输入“0”。请输入:')
choices = ['', 'rili/', 'dongman/', 'fengjing/', 'meinv/', 'youxi/', 'yingshi/', 'dongtai/', 'weimei/', 'sheji/', 'huahui/',
'dongwu/', 'jieri/', 'renwu/', 'meishi/', 'shuiguo/', 'jianzhu/', 'tiyu/', 'junshi/', 'feizhuliu/', 's/huyan/',
's/lol/', 's/wangzherongyao/', 'qita/']
index_url = 'http://www.netbian.com/' + choices
get_jpg(index_url)
``` hackerbob 发表于 2022-4-10 22:07
感谢分享,不过用Beautifulsoup是不是麻烦了,用re和xpath好像简洁
正则表达式没有学过,网络爬虫用 lxml 和 bs4 现在还能满足我。
相比 lxml ,我更喜欢用 bs4 ,因为 Tag 对象可以返回对应的 HTML,找错的时候非常方便。lxml 只返回一个对象类型和内存地址,没什么用 芫恬夜悟 发表于 2022-4-25 14:31
楼主那个644张壁纸的帖子怎么没有啦,可以再发一次吗?我想保存一下
那个被删了,说是不让发写真。。。 支持楼主,楼主牛皮 感谢分享,不过用Beautifulsoup是不是麻烦了,用re和xpath好像简洁 谢谢分享 支持支持 感谢分享 支持楼主,可以尽情的换壁纸了 谢谢分享,看起来很方便 感谢分享 感谢分享