前言
大家早好、午好、晚好吖~
环境使用:
- 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 def get_response(html_url): """ 发送请求函数 :param html_url: 形式参数, 不具备实际意义 :return: 某些你不加伪装,也可以得到数据 <网站反爬> headers 字典数据类型, Cookie 用户信息, 常用于检测是否有登陆账号 <需要你登陆账号之后才能看到数据> User-Agent: 用户代理 表示浏览器基本身份标识 """ 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表示状态码 请求成功 源码、解答、教程加Q裙:832157862 def get_img_info(html_url): """ 获取图片信息函数 :param html_url: 网址 :return: """ 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> def save(title, img_url): """ 保存数据 :param title: 图片标题 :param img_url: 图片网址 :return: """ # 保存数据, 一定有数据 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, '保存成功') 源码、解答、教程加Q裙:832157862 def main(link): """ 主函数, 整合上面所有功能 :param link: :return: """ zip_data = get_img_info(html_url=link) for title, img_url in zip_data: save(title, img_url) if __name__ == '__main__': # 采集多页数据内容, 可以分析请求url地址变化规律 # 爬虫思路可以通用, 但是代码是不能通用 # 每个网站数据结构不一样, 代码写法就不一样 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多个案例 不同平台 网站 <学了不用担心 不会写代码 实践案例管饱...>
尾语
好了,我的这篇文章写到这里就结束啦!
有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง
喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/tech/python/276233.html