爬虫逻辑
对于有针对性的爬取数据,爬虫的每一层逻辑可以不必多么精妙,但必须力求准确,而这便需要探寻到网站的规律,亦或者逻辑(因为需要管理和维护,所以网站肯定有他自己的规律或者逻辑)
咳咳,还是这个福利网站(mzitu.com)
我们由浅入深
先尝试单个套图的爬取
那么
第一步:获取此套图的所有单页url
从首页F12探寻翻页按钮,我们可以察觉到这个网站的一个套图下的所有图片所在页面的url得规律,基础url+“/”+str(i)
并且我们可以获取到此套图一共42页
根据这个规律我们便可以爬取出这个套图下的所有图片的标题和链接
第二步:根据链接下载对应图片并存进一个目录
对于这个网站的图片服务器来说,如果同一ip访问频率太快,是会被禁止的,但是这个频率的界限存在于多线程,单线程下频率超不过临界,因此不必担心
第三步:并没有第三步,只需两步,只需两步,这个爬虫便能够完成
上代码:
import requests
import os
from lxml import html
all_message = []
def GetAllMessage(url):
global all_message
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
print("开始解析地址:%s" % (url))
page = requests.get(url=url,headers=headers)
tree = html.fromstring(page.text)
result = tree.xpath('//div[@class="pagenavi"]//a[last()-1]/@href')
number_end = int("".join(result).replace(url + '/', ''))
print("解析此套图一共 %d 张" % (number_end))
print("开始解析此套图所有图片名称和地址!")
for i in range(1, number_end + 1):
page_url = url + "/" + str(i)
page2 = requests.get(url=page_url, headers=headers)
tree = html.fromstring(page2.text)
img_url = tree.xpath('//div[@class="main-image"]//img/@src')
img_name = tree.xpath('//div[@class="content"]//h2[@class="main-title"]/text()')
img_list = {'img_name': img_name[0], 'img_url': img_url[0]}
all_message.append(img_list)
print(all_message)
def DownloadImg(url):
global all_message
path = './收藏/' + all_message[0]['img_name']
print("开始构建套图存储目录:%s"%(path))
is_exists = os.path.exists(path)
if not is_exists:
os.makedirs(path)
print("目录 %s 构建成功!" % (path))
else:
print("目录 %s 已存在!" % (path))
for i in range(len(all_message)):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
"Referer": url + "/" + str(i)
}
img = requests.get(url=all_message[i]['img_url'], headers=headers)
with open(path + '/' + all_message[i]['img_name'] + '.jpg', "wb") as f:
f.write(img.content)
f.close()
except Exception as e:
print(e)
pass
print("套图 %s 下载完毕!" % (all_message[0]['img_name']))
if __name__ == '__main__':
url = input("请输入mzitu.com的套图链接(第一页的链接):")
GetAllMessage(url)
DownloadImg(url)
大功告成,只需简简单单的两个方法,此爬虫便宣告完成