前言
嗨喽,大家好呀~这里是爱看美女的茜茜呐
无论在什么时候,表情包都是一大神奇~
它促进人与人之间的距离~使人和睦关爱的相处 😀
环境使用]:
-
Python 3.8
-
Pycharm 2021.2版本
模块使用]:
-
import requests >>> pip install requests
-
import re
基本套路
一. 数据来源分析
-
明确自己需求
-
url 唯一资源定位符 <图片 视频 音频 都是唯一url地址>
二. 代码实现步骤
-
发送请求, 用python代码模拟浏览器对于url地址发送请求
-
获取数据, 获取服务器返回响应数据
-
解析数据, 提取我们想要图片url以及图片的标题
-
保存数据, 图片内容保存本地文件夹
代码
导入模块
import requests # 数据请求模块
import re # 正则表达式
import time # 时间模块
import concurrent.futures
发送请求函数
:param html_url
: 形式参数, 不具备实际意义
:return
:某些你不加伪装,也可以得到数据 <网站反爬>
headers
字典数据类型,
Cookie
用户信息, 常用于检测是否有登陆账号 <需要你登陆账号之后才能看到数据>
User-Agent
: 用户代理 表示浏览器基本身份标识
def get_response(html_url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
}
response = requests.get(url=html_url, headers=headers)
return response # <Response [200]> 响应对象, 200表示状态码 请求成功
获取图片信息函数
:param html_url
: 网址
:return
:
def get_img_info(html_url):
response = get_response(html_url=html_url) # 调用函数
# print(response.text)
# <a href=".*?" title="(.*?)"> () 表示精确匹配, 我们想要数据内容 .*? 通配符 可以匹配任意字符 除了(\n换行符)
# 正则表达式就是复制粘贴 想要的数据用(.*?)表示就可以了
title_list = re.findall('<a href=".*?" title="(.*?)">', response.text)
url_list = re.findall('<img class="ui image lazy" data-original="(.*?)"', response.text)
zip_data = zip(title_list, url_list) # zip() 内置函数, 可以把两个列表数据打包放到一起返回zip对象
return zip_data # <zip object at 0x000001B6B38A8900>
保存数据
:param title
: 图片标题
:param img_url
: 图片网址
:return
:
def save(title, img_url):
# 保存数据, 一定有数据
title = re.sub(r'[\/:*?"<>|\n]', '', title)
img_content = get_response(html_url=img_url).content # 调用前面定义好的发送请求函数 .content 获取图片二进制数据内容
with open('img\\' + title + '.' + img_url.split('.')[-1], mode='wb') as f:
f.write(img_content)
print(title, '保存成功')
主函数, 整合上面所有功能
:param link
:
:return
:
def main(link):
zip_data = get_img_info(html_url=link)
for title, img_url in zip_data:
save(title, img_url)
采集多页数据内容
可以分析请求url地址变化规律
思路可以通用, 但是代码是不能通用
每个网站数据结构不一样, 代码写法就不一样
if __name__ == '__main__':
time_1 = time.time()
exe = concurrent.futures.ProcessPoolExecutor(max_workers=7)
for page in range(1, 201):
url = f'https://fabiaoqing.com/biaoqing/lists/page/{page}.html'
exe.submit(main, url)
exe.shutdown()
time_2 = time.time()
use_time = int(time_2) - int(time_1)
print('总计耗时: ', use_time)
单线程 采集20页数据 总计耗时: 71
多线程 采集20页数据 总计耗时: 14
青灯讲过爬虫 100多个案例 不同平台 网站 <学了不用担心 不会写代码 实践案例管饱…>
尾语 💝
感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。
最后,博主要一下你们的三连呀(点赞、评论、收藏),不要钱的还是可以搞一搞的嘛~
不知道评论啥的,即使扣个6666也是对博主的鼓舞吖 💞 感谢 💐