一.本文介绍
wallhaven是一个可以获取免费图片的优秀资源网站,由于网站资源开源因此对我们爬虫的初学者来说比较友好。代码也比较简短,大家可以一起看看。
二.主要内容
在此我将逐段向大家解释源码的构成(本文并未用到多线程多进程进行爬取)
1.首先介绍一下我们接下来将会用到的库
import requests
from lxml import etree
import os
第一个便是我们大家熟知的requests库了,它用来帮助我们请求网页内容。第二行所导入的库将用来进行xpath的数据内容清洗。第三个os库将用来创建文件夹。
2.接下来是我们目标网页各组照片的url的获取
#url我们将用for循环的形式给到函数
def get_href(url,headers):
r = requests.post(url=url,headers=headers)
#进行数据清洗
et = etree.HTML(r.text)
#括号里的内容直接在网页中复制xpath即可
hrefs = et.xpath('/html/body/section/div[3]/div/div/div/a/img/@src')
index = [] #给每个网址按顺序加上索引
for q in range(1, len(hrefs)):
index.append(q)
#将索引和网址用字典进行一一对应的封装
dic = dict(zip(index,hrefs))
return dic
3.接下来是数据的保存,我们将创建一个大文件夹,把爬取到的每套数据放在一个下边的小文件夹中。
def Down_data(headers):
#接收一下上边函数所传出的数据
dic = get_href(url,headers)
#处理一下由于文件夹可能重复被建而报错的异常
try:
#建一个文件夹
os.mkdir(f"E:\\爬虫\\pics\\wallhaven\\{page}")
except:
pass
#把获取到的各个图片的网址传入进行保存
for index,href in dic.items():
req = requests.get(url=href,headers=headers).content
with open(f'E:\\爬虫\\pics\\wallhaven\\{page}\\{index}.jpg',mode='wb')as f:
f.write(req)
print('正在下载',page,' ',index)
Down_data(headers)
4.在上边代码完成后,传入hreders,url便可以进行数据的爬取了
下边我们将加上for循环进行多页爬取
#加上防盗链以及UA伪装
headers = {
'referer': 'https://www.so.com/s?ie=utf-8&src=hao_360so_b_cube&shb=1&hsid=e9d239476ff95ce7&q=%E6%B7%98%E5%AE%9D%E7%BD%91.',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
#通过for循环遍历出多个目标网址
for page in range(100):
url = f'https://wallhere.com/zh/user/14286?order=popular&page={page}'
三.让我们将上边所以代码组合一下,可以得到该次爬取的源码如下:
import requests
from lxml import etree
import os
headers = {
'referer': 'https://www.so.com/s?ie=utf-8&src=hao_360so_b_cube&shb=1&hsid=e9d239476ff95ce7&q=%E6%B7%98%E5%AE%9D%E7%BD%91.',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
for page in range(100):
url = f'https://wallhere.com/zh/user/14286?order=popular&page={page}'
def get_href(url,headers):
r = requests.post(url=url,headers=headers)
et = etree.HTML(r.text)
hrefs = et.xpath('/html/body/section/div[3]/div/div/div/a/img/@src')
index = []
for q in range(1, len(hrefs)):
index.append(q)
dic = dict(zip(index,hrefs))
return dic
def Down_data(headers):
dic = get_href(url,headers)
try:
os.mkdir(f"E:\\爬虫\\pics\\wallhaven\\{page}")
except:
pass
for index,href in dic.items():
req = requests.get(url=href,headers=headers).content
with open(f'E:\\爬虫\\pics\\wallhaven\\{page}\\{index}.jpg',mode='wb')as f:
f.write(req)
print('正在下载',page,' ',index)
Down_data(headers)
# for i in range(5):
# t = threading.Thread(target=Down_data)
# time.sleep(0.1)
# t.start()
希望这个简单的小爬虫可以帮助到大家,如果有什么问题我们可以一起交流一下!