本文内容
- 系统分析目标网页
- html标签数据解析方法
- 海量图片数据一键保存
- python 3.8
- pycharm
- requests >>> pip install requests
- parsel >>> pip install parsel
- time 时间模块 记录运行时间
import requests # 数据请求模块 第三方模块 pip install requests import parsel # 数据解析模块 第三方模块 pip install parsel import re # 正则表达式模块
url = f'https://fabiaoqing.com/biaoqing/lists/page/{page}html' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36' } response = requests.get(url=url, headers=headers) # <Response [200]> response 对象 200状态码 表示请求成功
解析速度 bs4 解析速度会慢一些,如果你想要对于字符串数据内容,直接取值,只能正则表达式
selector = parsel.Selector(response.text) # 把获取下来html字符串数据内容 转成 selector 对象 title_list = selector.css('.ui.image.lazy::attr(title)').getall() img_list = selector.css('.ui.image.lazy::attr(data-original)').getall() # 把获取下来的这两个列表 提取里面元素 一一提取出来 # 提取列表元素 for循环 遍历 for title, img_url in zip(title_list, img_list): title = re.sub(r'[\/:*?"<>|\n]', '_', title) # 名字太长 报错 img_name = img_url.split('.')[-1] # 通过split() 字符串分割的方法 根据列表索引位置取值 img_content = requests.get(url=img_url).content # 获取图片的二进制数据内容
with open('img\\' + title + '.' + img_name, mode='wb') as f: f.write(img_content) print(title)
def get_response(html_url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36' } response = requests.get(url=html_url, headers=headers) return response
def get_img_info(html_url): response = get_response(html_url) selector = parsel.Selector(response.text) # 把获取下来html字符串数据内容 转成 selector 对象 title_list = selector.css('.ui.image.lazy::attr(title)').getall() img_list = selector.css('.ui.image.lazy::attr(data-original)').getall() zip_data = zip(title_list, img_list) return zip_data
def save(title, img_url): title = re.sub(r'[\/:*?"<>|\n]', '_', title) # 名字太长 报错 img_name = img_url.split('.')[-1] # 通过split() 字符串分割的方法 根据列表索引位置取值 img_content = requests.get(url=img_url).content # 获取图片的二进制数据内容 with open('img\\' + title + '.' + img_name, mode='wb') as f: f.write(img_content) print(title)
def main(html_url): zip_data = get_img_info(html_url) for title, img_url in zip_data: save(title, img_url)
if __name__ == '__main__': start_time = time.time() exe = concurrent.futures.ThreadPoolExecutor(max_workers=10) for page in range(1, 11): url = f'https://fabiaoqing.com/biaoqing/lists/page/{page}html' exe.submit(main, url) exe.shutdown() end_time = time.time() use_time = int(end_time - start_time) print('程序耗时: ', use_time)