mmjpg.com网站图片的爬取

mmjpg.com网站图片的爬取

今天依然无心学习,又爬了一个网站。这个网站爬取的难点在于难以获取每个套图的页数,尝试了很多种方法都不好用,最后用正则表达式进行提取,但是依然会产生一些我懒得处理的问题。这个网站的图片和最开始我爬的那个很多都是一样的。下面就开始介绍这个网站的爬取吧!

此外这次我没有使用那个get_title()函数,因为这一次我采用字典存储的形式把标题和链接对应了起来,这样可以提高爬虫的效率。

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

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
4
5
6
7
8
9
10
11
12
13
14
15
def download_pic(url, name):
import requests
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) " \
"A®ppleWebKit/537.36 (KHTML, like Gecko) " \
"Chrome/66.0.3359.181 Safari/537.36",
"Accept": "image/webp,image/apng,image/*,*/*;q=0.8",
"Referer": "http://www.mmjpg.com/",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"}
res = requests.get(url, headers=headers)
res.raise_for_status()
playFile = open(name, 'wb')
for chunk in res.iter_content(100000):
playFile.write(chunk)
playFile.close()

这个函数和那个爬妹子图网站的函数是一样的。

获取所有套图的链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def get_all_links():
from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
html = urlopen("http://www.mmjpg.com/")
bsObj = BeautifulSoup(html, "html.parser")
totalpage = int(re.findall(r"/home/(.+)", bsObj.findAll("a", {"class": "last"})[0].attrs["href"])[0])
link = []
for i in bsObj.ul.findAll("span", {'class': 'title'}):
link.append({'title': i.a.get_text(), 'link': i.a.attrs["href"]})
print("第", 1, "页提取完成···")
totalpage += 1
for j in range(2, totalpage):
url2 = "http://www.mmjpg.com/" + "home/" + str(j)
html = urlopen(url2)
bsObj = BeautifulSoup(html, "html.parser")
nn = 0
for m in bsObj.ul.findAll("span", {'class': 'title'}):
link.append({'title': m.a.get_text(), 'link': m.a.attrs["href"]})
print("第", j, "页提取完成···")
return link

根据某个套图的首页链接获取该套图的所有链接

这里就是难点所在,很难获取每个套图的总页数,尝试了很多方法都不好用,最后采用了下面的正则表达式进行提取的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def get_pic_links(url):
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen(url)
bsObj = BeautifulSoup(html, "html.parser")
link = []
link.append(re.findall(r"data-img=\"(.+?)\"", str(bsObj.findAll("div", {"class": 'content'})[0]))[0])
print("已获取第", 1, "张图片链接")
try:
num = int(re.findall(r"上一篇123456(.+)全部图片下一张", str(bsObj.findAll('div', {'class': 'page'})[0].get_text()))[0]) + 1
except:
num = 100
for ii in range(1, num):
url2 = url + "/" + str(ii)
html = urlopen(url2)
bsObj = BeautifulSoup(html, "html.parser")
link.append(re.findall(r"data-img=\"(.+?)\"", str(bsObj.findAll("div", {"class": 'content'})[0]))[0])
print("已获取第", ii, "张图片链接")
return link

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

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)

开始整站爬取

get_all_links()函数似乎还是有问题,所以我就加了一个错误处理机制。遇到错误的套图就直接丢掉了。

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
import os
os.chdir("/Users/mr.cheng/Desktop/Python网络数据采集")
make_and_cd("mmjpg")
cwd = os.getcwd()
all_links = get_all_links()
total_length = len(all_links)
progress = 0
for i in all_links:
progress += 1
speed = progress / total_length * 100
## 下面两个判断语句都是为了减少出错后再次运行的重复运行量。22.6为上次运行出错最后的进度
if speed >= 0:
title = i['title']
if not os.path.exists(title):
print("正在下载:", title)
make_and_cd(title)
m = 1
try:
for j in get_pic_links(i['link']):
download_pic(str(j), name = str(m)+".jpg")
m += 1
except:
print("该套图下载失败!")
print("下载成功")
os.chdir(cwd)
progress += 1
speed = progress/total_length * 100
print("已完成", speed, "%")

写到这里,我那边的爬虫已经顺利的下载到了13组套图,顺利通过测试。我决定给自己制定一个黄金标准——“能针对至少10种输入运行产生正确的结果的程序才是好程序!”

# Python

评论

程振兴

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

Your browser is out-of-date!

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

×