博客原文:https://weweweha.com
1. 概述
爬取3DM指定网页的游戏壁纸,并且通过多线程来加速爬取图片的速度。
2.使用库
request库用来1解析指定网页,re库用来搜索指定网页中的图片地址,threading多线程模块用来加速图片爬取。
3.网页分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9drAZePc-1590219277095)(练手小项目,爬取3DM图片/1.JPG)]
#3DM
import requests#引入requests库
a = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"
}#定义浏览器抬头,防止反爬
url="https://www.3dmgame.com/tu/3742411.html"
r = requests.get(url,headers=a)
r.encoding=r.apparent_encoding
print(r.text)
结果展示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrteuwJd-1590219277097)(练手小项目,爬取3DM图片/2.JPG)]
3.找到需要的图片地址信息
通过观察网页源代码可以发现所有的壁纸信息都以jpg格式存放,所以通过正则表达式来寻找所要的信息,正则表达式:https://.*?.jpg
#3DM
import requests #引入requests库
import re #引入re库
a = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"
}#定义浏览器抬头,防止反爬
url="https://www.3dmgame.com/tu/3742411.html"
r = requests.get(url,headers=a)
r.encoding=r.apparent_encoding
demo=r.text
urllist=re.findall("https://.*?.jpg",demo)
print(urllist)
结果展示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9JBaqnl6-1590219277097)(练手小项目,爬取3DM图片/3.JPG)]
4.定义下载图片的函数
#3DM
import requests #引入requests库
import re #引入re库
a = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"
}#定义浏览器抬头,防止反爬
url="https://www.3dmgame.com/tu/3742411.html"
r = requests.get(url,headers=a)
r.encoding=r.apparent_encoding
demo=r.text
urllist=re.findall("https://.*?.jpg",demo)
def download(list):
for i in list:
try:
r = requests.get(i, headers=a)
path = "G://游戏图片//" + i.split("/")[-1]
with open(path, "wb") as f:
f.write(r.content)
f.close()
except:
pass
download(urllist)
print("爬取完毕")
结果展示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-szj9KORZ-1590219277099)(练手小项目,爬取3DM图片/4.JPG)]
5.多线程爬取多组壁纸
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-htRTuvPR-1590219277100)(练手小项目,爬取3DM图片/5.JPG)]
可以看到一个页面最多有20组壁纸,那就设定2个线程同时爬取这些壁纸:
#3DM
import requests #引入requests库
import re #引入re库
import threading #引入多线程
a = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"
}#定义浏览器抬头,防止反爬
url="https://www.3dmgame.com/tu_52_1/"
r = requests.get(url,headers=a)
r.encoding=r.apparent_encoding
demo = r.text
b = re.findall("[0-9]+.html", demo)
c = ["https://www.3dmgame.com/tu/" + x for x in b]
def download(urllist):#定义下载函数
for url in urllist:
try:
picture = requests.get(url, headers=a)
path = "G://游戏图片//" + url.split("/")[-1]
with open(path, "wb") as f:
f.write(picture.content)
f.close()
except:
pass
def geturl(urllistall):#定义获取图片地址我的函数
g=[]
for i in urllistall:
try:
r = requests.get(i, headers=a)
demo=r.text
picurl = re.findall("https://.*?jpg", demo)
g+=picurl#叠加每个网页获取的图片地址信息并且存放在g数组中
except:
pass
return g
d = geturl(c)
h = d[0:len(d) // 2]
j = d[len(d) // 2:len(d) - 1]
t1=threading.Thread(target=download,args=(h, ))
t2 = threading.Thread(target=download, args=(j,))
t1.start()
t2.start()
t1.join()#线程阻塞
t2.join()
print("爬取完毕")
结果展示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BWlI6S7U-1590219277100)(练手小项目,爬取3DM图片/6.JPG)]
6.robots协议
3DM网站根目录下没有robots协议,仅学习用,图片已经全部删除。