chongni8.com网站图片的爬取

chongni8.com网站图片的爬取

今天终于会广州了哈,回想过去一个多星期感觉跟梦一样,每次回家都不能待太久,主要是回家之后学习效率就非常低。恰好今天有两部自己想看的电影上映,所以今天就一个人去南村的电影院连续看了两场电影——《西虹市首富》和《狄仁杰之四大天王》。两部电影都很棒,感觉很过瘾。然后晚上回来感觉还想爬爬图片,于是就捡起另外一个图片网站:http://www.chongni8.com/继续用Python爬了一下,思路和之前爬http://m.mzitu.com/的差不多。

设定工作目录,取消全局证书验证

取消全局证书验证的原因依然是由于Python 升级到 2.7.9 之后引入了一个新特性,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书。而当目标网站使用的是自签名的证书时就会抛出此异常。因此需要使用下面的代码全局取消证书验证。

1
2
3
4
import os
os.chdir("/Users/mr.cheng/Desktop/Python网络数据采集")
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

下载图片的函数

测试发现该网站并没有设置防盗链,所以图片可以直接下载。为了模块化设计程序,下面也写了简单的函数用于根据图片链接下载图片。

1
2
3
def download_pic(url, name):
from urllib.request import urlretrieve
urlretrieve(url, name)

获取某个套图的所有图片链接

这个函数的作用是根据某个套图首页链接获取该套图的所有图片链接,返回一个list。例如这个套图:http://www.chongni8.com/taotu/2018/0725/5612.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def get_all_pic_links(url):
from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen(url)
bsObj = BeautifulSoup(html, "html.parser")
link = []
for p in bsObj.p("img"):
link.append("http://www.chongni8.com/" + p.attrs["src"])
i = 2
j = 1
while j == 1:
urltemp = url[0:44] + "_" + str(i) + ".html"
try:
html = urlopen(urltemp)
bsObj = BeautifulSoup(html, "html.parser")
for l in bsObj.p("img"):
link.append("http://www.chongni8.com/" + l.attrs["src"])
except:
j += 1
else:
i += 1
return link

获取所有套图的链接

这个函数可以不需要任何参数就能获取所有套图的链接返回一个list然后输出为csv文件,由于这个网站无法直接获取总页数,所以只能一页一页的测试,如果有就append进list中,反之程序结束。这里就是通过这个项目学习到的东西。
这个网站上有5500组图片(截止2018年7月27日)。也是蛮多的,估计全部下载下来有五六万张。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def get_all_links():
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
url = "http://www.chongni8.com/taotu/"
html = urlopen(url)
bsObj = BeautifulSoup(html, "html.parser")
chongnilink = []
for p in bsObj.findAll("h1", {"class": "post-title"}):
chongnilink.append("http://www.chongni8.com" + p.a.attrs["href"])
print("已处理完第", 1, "页")
i = 2
j = 1
while j == 1:
url = "http://www.chongni8.com/taotu/list_5_" + str(i) + ".html"
try:
html = urlopen(url)
bsObj = BeautifulSoup(html, "html.parser")
for p in bsObj.findAll("h1", {"class": "post-title"}):
chongnilink.append("http://www.chongni8.com" + p.a.attrs["href"])
print("已处理完第", i, "页")
except:
j += 1
else:
i += 1
test = pd.DataFrame(columns = ['url'], data = chongnilink)
test.to_csv("chongni.csv")
return chongnilink

根据某个套图的首页链接获取其名称

这个函数是为了获取套图名称用于作为子文件夹名称的。

1
2
3
4
5
6
def get_title(url):
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen(url)
bsObj = BeautifulSoup(html, "html.parser")
return bsObj.findAll("h1", {"class": "post-title"})[0].get_text()

根据给定字符串创建字文件夹并设定子文件夹为工作目录的函数

这个函数和之前的那个是一模一样的。

1
2
3
4
5
6
7
8
9
10
11
12
def make_and_cd(foldername):
import os
def mkdir(path):
folder = os.path.exists(path)
if not folder: # 判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(path) # makedirs 创建文件时如果路径不存在会创建这个路径
print("--- 创建新文件夹... ---")
print("--- 创建完成 ---")
else:
print("--- 文件夹已存在! ---")
mkdir(foldername)
os.chdir(foldername)

整站爬取

写好了上面的函数就可以进行整个网站图片的下载了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import os
os.chdir("/Users/mr.cheng/Desktop/Python网络数据采集")
make_and_cd("chongni")
cwd = os.getcwd()
all_links = get_all_links()
# 下面的代码用于从csv文件读取一个list
# import csv
# f = open("chongni.csv", 'r')
# csvreader = csv.reader(f)
# all_links = list(csvreader)
total_length = len(all_links)
progress = 0
for i in all_links:
progress += 1
speed = progress / total_length * 100
## 下面两个判断语句都是为了减少出错后再次运行的重复运行量。0为上次运行出错最后的进度
if speed > 0:
title = get_title(i)
if not os.path.exists(title):
print("正在下载:", title)
make_and_cd(title)
m = 1
for j in get_all_pic_links(i):
download_pic(j, name = str(m)+".jpg")
m += 1
print("下载成功")
os.chdir(cwd)
progress += 1
speed = progress/total_length * 100
print("已完成", speed, "%")

# Python

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了604.4k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×