本文內容
- 系統分析目標網頁
- 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)