MyModHeaven 发表于 2022-4-10 21:47

爬取电脑壁纸网站,软件区同步分享成品

本帖最后由 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)

```

MyModHeaven 发表于 2022-4-11 08:14

hackerbob 发表于 2022-4-10 22:07
感谢分享,不过用Beautifulsoup是不是麻烦了,用re和xpath好像简洁

正则表达式没有学过,网络爬虫用 lxml 和 bs4 现在还能满足我。

相比 lxml ,我更喜欢用 bs4 ,因为 Tag 对象可以返回对应的 HTML,找错的时候非常方便。lxml 只返回一个对象类型和内存地址,没什么用

MyModHeaven 发表于 2022-4-25 16:08

芫恬夜悟 发表于 2022-4-25 14:31
楼主那个644张壁纸的帖子怎么没有啦,可以再发一次吗?我想保存一下

那个被删了,说是不让发写真。。。

o824 发表于 2022-4-10 22:05

支持楼主,楼主牛皮

hackerbob 发表于 2022-4-10 22:07

感谢分享,不过用Beautifulsoup是不是麻烦了,用re和xpath好像简洁

两仪樱 发表于 2022-4-10 22:14

谢谢分享

wfys66 发表于 2022-4-10 22:23

支持支持

sbzylwdnc 发表于 2022-4-10 23:05

感谢分享

wine54088 发表于 2022-4-10 23:13

支持楼主,可以尽情的换壁纸了

Dragon0617 发表于 2022-4-10 23:17

谢谢分享,看起来很方便

KyrieIrving11 发表于 2022-4-11 00:42

感谢分享

ShanGuiOne 发表于 2022-4-11 07:22

感谢分享
页: [1] 2 3
查看完整版本: 爬取电脑壁纸网站,软件区同步分享成品