热爱技术
专注分享

【肥宅快乐贴】用python制作爬虫批量下载图片站上的漂亮小姐姐

本来想另外找一个漂亮小姐姐的图片站,可是百度了一下,那些网站的图片尺度略大,我的博客又是备案过的,不敢瞎搞,所以还是找了一个中规中矩的cosplay网站来写这篇文章。这个网站之前我用火车头爬过,看之前的文章:

简单使用火车头采集器批量采集整站网页图片(解决闪退)

不过用这种爬虫软件来爬,说实话不如自己写程序来得方便。今天就来演示一下怎么用python来爬这个网站的图片。当然这篇文章的方法也适用于其他的图片站,大家学会了就可以自由发挥了(~ ̄▽ ̄)~。

准备工具:python环境的电脑,python的requests模块和beautifulsoup4模块,谷歌浏览器,有一点代码基础。

目标站:http://www.cosplaymore.com/

目标:爬取cos板块所有帖子中的图片。

一、环境配置

这篇文章我们用的是python3环境,可以直接去python官网下载:https://www.python.org/downloads/

下载完了直接安装就行。requests模块beautifulsoup4模块直接在cmd里执行pip install requests 和 pip install beautifulsoup4就行了。

这里不多说,如果连安装都有问题,那么下面可能就不用看了。

二、分析网页

爬虫的本质其实是找到网页的规律,然后通过这个规律去编写一个适应这个规律的程序,然后通过这个程序来获取我们需要的东西。所以首先我们要分析网页,来找到这个规律。

1.分析第一级页面规则,获取所有帖子的链接。

打开谷歌浏览器,进入我们需要爬取的网站,切换到 cos 这一栏。我们今天就来爬cos这一栏里所有帖子的图片。

可以看到网址是一个比较规则的地址,我们把网址后缀的 "30-1.html"改为“30-2.html”,页面就会跳转到第二页。

image.png

观察一下网页排版,看下我们需要爬取的东西和不需要的东西。

image.png

我们需要的是下面帖子区域的内容,一共有98页2729个帖子

image.png

右键其中一个帖子,然后右键“检查”,在右边弹出的任务栏里,鼠标往上移动,直到移动到一个位置,网页全选了整个帖子的部分,这个被选中的标签 <div class="con">就是帖子区域的的标签层,包含了整个帖子区域。在这个层里,包含了所有的帖子链接。

image.png

可以看到,这个div层下每个<li>标签都包含了一个帖子:

image.png

再展开其中一个<li>标签,看到它包含了这个帖子的2个链接和1个缩略图链接,我们需要的是是帖子链接。

这里我们就找到了帖子排布的规律,那么第一级页面的规则也基本分析完成了。规则如下:

① 通过改变网页链接,实现翻页。

② 找到<dlv class="con">这个标签。

③找到②中div包含的所有<li>标签中的链接。

一级页面爬取后,即可获得cosplay板块所有帖子的链接。

2.分析二级页面规则,获得所有图片的链接。

随便打开一个帖子,同样右键一张帖子里的图片,然后右键“检查”。往上移动鼠标,直到整个帖子区域被选中:

image.png

这个class="PiccontentPart fl 的div标签,里面包含了整个帖子的图片内容。同样,可以看到这个div下的每个<p>标签里包含的就是每张图片的信息。可以看到,<p>标签里很简单粗暴地包含了一个图片地址。

image.png

那么二级页面的规则也分析完了。规则如下:

① 通过一级页面获得的帖子链接,进入帖子,找到 class="PiccontentPart fl 的div标签

② 找到上面div标签中的<p>标签

③ 获得<p>标签中的链接

三、开始写python程序

上面我们安装的requests模块用于网页访问,beautifulsoup4模块用于网页解析。

1.获取第一级页面并解析出帖子中的链接

image.png

注释在程序里已经写好了,其中的requests的get传递的参数headers可以不填,这个是拿来表明身份的,表示你是浏览器而不是python程序。

运行一下效果图:

image.png

一共爬到了2729个帖子链接,一共98页,每页是28个帖子,数量刚好差不多。

2.解析二级页面:帖子中图片的地址


image.png

这里我贴了其中两个帖子做测试,结果如下:

image.png

当然我们也可以改进下,找到帖子的标题,也是层级查找:

image.png

3.合并完整程序

最后我们把两个查找合并嵌套一下,获取所有帖子中的所有图片的链接,控制下访问速度,再做下错误处理并完善下提示。

完整代码如下:

import requests
from bs4 import BeautifulSoup
from time import sleep

header ={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
         'cookie':'UM_distinctid=1663384985d6fd-03db9719bc459f-8383268-1fa400-1663384985f5c5; CNZZDATA1256110375=1639678596-1538460026-%7C1538460026; pgv_pvi=6300302336; pgv_si=s7801597952; yunsuo_session_verify=61e64cd8bf75fa31a03c96c3195f46f5'}

topic_count = 0
img_count = 0
err_count = 0
for i in range(1,99):
    try:
        #根据规律遍历生成98个页面地址
        url = 'http://www.cosplaymore.com/list-30-'+str(i)+'.html'
        #使用requests的get方法访问这98个页面
        r = requests.get(url=url,headers=header,timeout=30)
        #将返回的页面内容通过beautifulsoup的网页解析器解析出来
        r_html = BeautifulSoup(r.text,'html.parser')
        #查找class名字为'con'的div
        html_board = r_html.find('div',class_='con')
        #遍历class名字为‘pic imgholder’的a标签
        for topic_link in html_board.find_all('a',class_='pic imgholder'):
            sleep(5)
            topic_count+=1
            print('访问第'+str(topic_count)+'个帖子')
            # 访问每一个帖子
            r_topic = requests.get(url=topic_link.get('href'), headers=header, timeout=30)
            # 将帖子内容解析为html网页
            topic_html = BeautifulSoup(r_topic.text, 'html.parser')
            # 找出帖子的标题
            topic_title = topic_html.find('div', class_='PiccontentTitle').find('font').text
            # 找出这个帖子中的贴图区域
            topic_board = topic_html.find('div', class_='PiccontentPart fl')
            # 从贴图区域找出所有的img标签
            title_count=0
            for img_link in topic_board.find_all('img'):
                # 从img标签中获取链接
                #print(img_link.get('src'))
                title_count += 1
                img_count += 1
                #print(topic_title+str(title_count))
                #下载图片保存到d盘的img文件夹
                img_file = requests.get(url=img_link.get('src'),headers=header,timeout=30)
                img_path = 'd:/img/'+topic_title+str(title_count)+'.jpg'
                with open(img_path,'wb') as f:
                    f.write(img_file.content)
                    print('图片已保存=====>'+img_path)
    except:
        err_count+=1
        print('出错,跳过'+str(err_count))

print('共爬取到'+str(topic_count)+'个帖子链接')
print('共爬取到'+str(img_count)+'张图片地址')
print('出错的帖子:'+str(err_count)+'个')

效果如下:

image.png

image.png

四、后记

        这篇文章的例子爬取还是很简单的,结构很清晰,通过class名字就能直接找到标签,是比较基础的那种,也是为了便于大家理解。实际情况中,多数网站做了反爬虫处理,除了class名随机,标签的排列也不一定是固定的顺序。且不同的帖子结构不一样,会让你很难下手。不过对于python来说,这都不是问题,可以通过正则匹配来解决这个问题。爬取的内容也可以通过list或者dic等方式进行处理,真不行还能使用pymysql进行数据去重和整理。爬虫爬取的方式千变万化,唯有核心思想不会变:根据网页结构的规律,写出适合这个规律的程序。

        多数网站也做了访问速度处理,如果你访问速度过快就会封你的ip。所以爬虫也需要适时限速,爬一个帖子休息几秒钟,反正写好了代码后台运行,让它挂着运行就好了。

beautifulsoup4模块官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

requests模块官方文档:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

赞(7) 打赏
未经允许不得转载:小伟博客 » 【肥宅快乐贴】用python制作爬虫批量下载图片站上的漂亮小姐姐

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    哇,正想搞这个

    QQ游客 7个月前 (10-30) 来自天朝的朋友 谷歌浏览器 Windows 10 回复

小伟博客 热爱技术 专注分享

网站发展历程WKM萌妹博客

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏