Python 爬取壁纸源码(多线程)
前言
采用requests模块发送网络请求,os模块进行创建文件夹以及threading模块实施多线程从而更快爬取图片
一、request模块介绍
Requests模块是一个用于网络请求的模块,主要用来 模拟浏览器发请求 。 其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能。
二、使用步骤
1.引入库(以及库的作用)
代码如下(示例):
# 发送网络请求
import requests
# 正则表达式作用到对象中
import re
# python和操作系统交互的程序包
import os
# 多线程
import threading as th
2.判断是否存在图库
if not os.path.exists("./图库"):
os.mkdir("./图库")
3.爬虫代码
代码如下所示(该代码块封装了run方法用于之后的多线程使用)
def run(x,y):
# 设置页面区间(从外部传参x,y在函数内使用)
for page_num in range(x,y):
print("--------------------------------这是第"+str(page_num)+"页面内容---------------------------------------------")
# 第几页面
page_name = f'index_{page_num}.html'
# 第几页面的url
url = f"https://pic.netbian.com/{page_name}"
# get获取页面框架数据
html_ba = requests.get(url=url).text
# 正则表达:img src中所有的链接
ex = '<img src="(.*?)" alt.*?>'
# 正则作用于获取到的页面数据
new_url = re.findall(ex,html_ba,re.S)
# 创建主页面链接
img_url = "https://pic.netbian.com"
# 遍历获取到的src中的链接
for i in new_url:
# 拼接链接
new_imgurl = img_url+i
print(new_imgurl)
# 通过split函数去划分/范围锁定最后一位作为照片名字
img_name = new_imgurl.split('/')[-1]
# 获取图片
img_get = requests.get(url=new_imgurl).content
# 保存地址和图片名字
img_path = "./图库/"+img_name
# 创建链接用于存储照片
with open(img_path,'wb') as fp:
# 写入照片
fp.write(img_get)
print(img_name+"下载成功")
3.多线程
从此处将run方法中的x,y传参给到range函数当作页面区间
if __name__ == '__main__':
# 线程1
t1 = th.Thread(target=run,args=(2,5))
# 线程2
t2 = th.Thread(target=run,args=(6,9))
# 启动
t1.start()
t2.start()
4.完整源码
import requests
import re
import os
import threading as th
if not os.path.exists("./图库"):
os.mkdir("./图库")
def run(x,y):
for page_num in range(x,y):
print("--------------------------------这是第"+str(page_num)+"页面内容---------------------------------------------")
page_name = f'index_{page_num}.html'
url = f"https://pic.netbian.com/{page_name}"
html_ba = requests.get(url=url).text
ex = '<img src="(.*?)" alt.*?>'
new_url = re.findall(ex,html_ba,re.S)
img_url = "https://pic.netbian.com"
for i in new_url:
new_imgurl = img_url+i
print(new_imgurl)
img_name = new_imgurl.split('/')[-1]
img_get = requests.get(url=new_imgurl).content
img_path = "./图库/"+img_name
with open(img_path,'wb') as fp:
fp.write(img_get)
print(img_name+"下载成功")
if __name__ == '__main__':
t1 = th.Thread(target=run,args=(2,5))
t2 = th.Thread(target=run,args=(6,9))
# 启动
t1.start()
t2.start()
总结
代码块的理解应该不难,中间的页面框架返回中文乱码还没处理完整,还请见谅。
新手小白编写,有什么不大好的地方麻烦给个建议,谢谢!!!