前言
嗨喽!大家好!小姐姐是很多人都会欣赏的,不论男女,那么我们今天就来用Python爬取小姐姐图片网站上的美图,不在一张张下载,让自己通过代码拥有许多存货!零基础也能学会的通用爬虫,当然这里也给大家带来了多线程爬虫,加快爬虫速度
零基础通用爬虫
零基础的小伙伴可以看一下这个方法哦
网址:https://www.kanxiaojiejie.com/page/5
因审核机制原因,以下载的小姐姐图片不好发出来,感兴趣可以点击网址直接查看图片哦!
本方法亮点:
- 系统分析目标网页
- html标签数据解析方法
- 海量图片数据一键保存
环境介绍
- python 3.8
- pycharm 2021专业版 >>> 激活码
- requests >>> pip install requests
- parsel >>> pip install parsel
分析网站 (思路分析)
- 确定需要爬取的内容
- 通过查看源代码分析数据内容
爬虫最基本思路
- 找到目标
- 发送请求 (人为操作: 访问网站)
- 获取数据 (HTML代码 就是服务器返回的数据)
- 数据提取 (筛选里面的内容)
- HTML网页代码
- 保存数据 (把图片下载下来)
简单的通用爬虫代码
这里因为很细所以就整合放一起了,里面每行代码已经给大家标好注释了
import requests
import parsel
import re
import os
for page in range(1, 11):
print(f'==================正在爬取第{page}页==================')
# 1.向目标网站发送请求(get,post)
response = requests.get(f'https://www.kanxiaojiejie.com/page/{page}')
# 2. 获取数据(网页源代码)
data_html = response.text
# 3. 解析网页(re正则表达式,css选择器,xpath,bs4,json) 提取每一个详情页的链接与标题
zip_data = re.findall('<a href="(.*?)" target="_blank"rel="bookmark">(.*?)</a>', data_html)
for url, title in zip_data:
print(f'----------------正在爬取{title}----------------')
if not os.path.exists('img/' + title):
os.mkdir('img/' + title)
# 4. 向详情页发送请求
resp = requests.get(url)
# 5. 获取数据(网页源代码)
url_data = resp.text
# 6. 解析网页 (提取图片链接)
selector = parsel.Selector(url_data)
img_list = selector.css('p>img::attr(src)').getall()
for img in img_list:
# 7. 向图片链接发送请求
# 8. 获取数据(图片二进制数据)
img_data = requests.get(img).content
# 9. 保存数据
img_name = img.split('/')[-1]
with open(f"img/{title}/{img_name}", mode='wb') as f:
f.write(img_data)
print(img_name, '爬取成功!!!')
print(title,'爬取成功!!!')
升级 多线程版本
网址:https://www.kanxiaojiejie.com/page/5
因审核机制原因,以下载的小姐姐图片不好发出来,感兴趣可以点击网址直接查看图片哦!
本方法亮点:
- 系统分析目标网页
- html标签数据解析方法
- 海量图片数据一键保存
环境介绍:
- python 3.6
- pycharm
- requests >>> pip install requests
- re
- time
- concurrent.futures
把每一块都封装一个函数, 每个函数都有它特定的功能
先导入模块
import requests # 第三方模块 pip install requests
import re # 正则表达式模块 内置模块
import time
import concurrent.futures
import os
import parsel
发送请求
def get_response(html_url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
}
# 为什么这里要 requests.get() post() 请求会更安全...
response = requests.get(url=html_url, headers=headers)
return response
保存数据
def save(title, img_url):
img_data = requests.get(img_url).content
img_name = img_url.split('/')[-1]
with open("img\\" + title + '\\' + img_name, mode='wb') as f:
f.write(img_data)
print(img_name, '爬取成功')
解析数据 获取图片url地址以及标题
def parse_1(data_html):
zip_data = re.findall('<a href="(.*?)" target="_blank"rel="bookmark">(.*?)</a>', data_html)
print(zip_data)
return zip_data
解析数据 获取图片url地址以及标题
def parse_2(html_data):
selector = parsel.Selector(html_data)
img_list = selector.css('p>img::attr(src)').getall()
return img_list
创建文件夹
def mkdir_img(title):
if not os.path.exists('img\\' + title):
os.mkdir('img\\' + title)
主函数
def main(html_url):
html_data = requests.get(html_url).text
zip_data = parse_1(html_data)
for url, title in zip_data:
mkdir_img(title)
html_data_2 = get_response(url).text
img_list = parse_2(html_data_2)
for img in img_list:
save(title, img)
print(title, '爬取成功!!!')
程序的入口
if __name__ == '__main__':
time_1 = time.time()
exe = concurrent.futures.ThreadPoolExecutor(max_workers=10)
for page in range(1, 11):
url = f'https://www.kanxiaojiejie.com/page/{page}'
exe.submit(main, url)
exe.shutdown()
time_2 = time.time()
use_time = int(time_2) - int(time_1)
print(f'总计耗时:{use_time}秒')
总计耗时就按大家自己的想法来定啦(☆▽☆)
这篇文章到这里就结束了,如过你感觉这篇文章对你有用,你学到了东西,可以支持一下我哦!!最后祝大家每天开开心心、学业大成!!!(ง •_•)ง