如何利用python多線程爬取天氣網(wǎng)站圖片并保存
1.1 題目
指定一個(gè)網(wǎng)站,爬取這個(gè)網(wǎng)站中的所有的所有圖片,例如中國氣象網(wǎng)(www.weather.com.cn),分別使用單線程和多線程的方式爬取。(限定爬取圖片數(shù)量為學(xué)號(hào)后3位)
輸出信息: 將下載的Url信息在控制臺(tái)輸出,并將下載的圖片存儲(chǔ)在images子文件中,并給出截圖。
1.2 思路
1.2.1 發(fā)送請(qǐng)求
構(gòu)造請(qǐng)求頭
import requests,re
import urllib
headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
url = "http://www.weather.com.cn/"
request = urllib.request.Request(url, headers=headers)
發(fā)送請(qǐng)求
request = urllib.request.Request(url, headers=headers) r = urllib.request.urlopen(request)
1.2.2 解析網(wǎng)頁
頁面解析,并且替換回車,方便后續(xù)進(jìn)行正則匹配圖片。
html = r.read().decode().replace('\n','')

1.2.3 獲取結(jié)點(diǎn)
使用正則匹配,先獲取所有的a標(biāo)簽,然后爬取a標(biāo)簽下面的所有圖片
urlList = re.findall('<a href="(.*?)" ',html,re.S)
獲取所有的圖片
allImageList = []
for k in urlList:
try:
request = urllib.request.Request(k, headers=headers)
r = urllib.request.urlopen(request)
html = r.read().decode().replace('\n','')
imgList = re.findall(r'<img.*?src="(.*?)"', html, re.S)
allImageList+=imgList
except Exception as e:
pass
這里的請(qǐng)求其實(shí)也是要用多線程爬取的,所有后續(xù)會(huì)補(bǔ)上!
1.2.4 數(shù)據(jù)保存 (單線程)
for i, img in enumerate(allImageList[:102]):
print(f"正在保存第{i + 1}張圖片 路徑:{img}")
resp = requests.get(img)
with open(f'./image/{img.split("/")[-1]}', 'wb') as f: # 保存到這個(gè)image路徑下
f.write(resp.content)

1.2.4 數(shù)據(jù)保存 (多線程)
引入多進(jìn)程模塊
import threading
# 多線程
def download_imgs(imgList,limit):
threads = []
T = [
threading.Thread(target = download, args=(url,i))
for i, url in enumerate(imgList[:limit + 1])
]
for t in T:
t.start()
threads.append(t)
return threads
編寫下載函數(shù)
def download(img_url,name):
resp = requests.get(img_url)
try:
resp = requests.get(img_url)
with open(f'./images/{name}.jpg', 'wb') as f:
f.write(resp.content)
except Exception as e:
print(f"下載失敗: {name} {img_url} -> {e}")
else:
print(f"下載完成: {name} {img_url}")
就很隨機(jī)

總結(jié)
到此這篇關(guān)于如何利用python多線程爬取天氣網(wǎng)站圖片并保存的文章就介紹到這了,更多相關(guān)python爬取天氣網(wǎng)站圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3 googletrans超時(shí)報(bào)錯(cuò)問題及翻譯工具優(yōu)化方案 附源碼
這篇文章主要介紹了python3 googletrans超時(shí)報(bào)錯(cuò)問題及翻譯工具優(yōu)化方案 附源碼,本文給大家分享解決方法,通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-12-12
python生成xml時(shí)規(guī)定dtd實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于python生成xml時(shí)規(guī)定dtd實(shí)例方法,需要的朋友們學(xué)習(xí)參考下。2020-09-09
python中溫度單位轉(zhuǎn)換的實(shí)例方法
在本篇文章里小編給大家整理關(guān)于python中溫度單位轉(zhuǎn)換的實(shí)例方法,有需要的朋友們可以學(xué)習(xí)參考下。2020-12-12
Python 讀取千萬級(jí)數(shù)據(jù)自動(dòng)寫入 MySQL 數(shù)據(jù)庫
這篇文章主要介紹了Python 讀取千萬級(jí)數(shù)據(jù)自動(dòng)寫入 MySQL 數(shù)據(jù)庫,本篇文章會(huì)給大家系統(tǒng)的分享千萬級(jí)數(shù)據(jù)如何寫入到 mysql,分為兩個(gè)場景,兩種方式2022-06-06
python實(shí)戰(zhàn)scrapy操作cookie爬取博客涉及browsercookie
這篇文章主要為大家介紹了python實(shí)戰(zhàn)scrapy操作cookie爬取博客涉及browsercookie,下面來學(xué)習(xí)一下 scrapy 操作 Cookie來爬取博客吧2021-11-11
python中numpy包使用教程之?dāng)?shù)組和相關(guān)操作詳解
這篇文章主要給大家介紹了關(guān)于python中numpy包的使用教程,包含數(shù)組和相關(guān)操作等內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
python 劃分?jǐn)?shù)據(jù)集為訓(xùn)練集和測(cè)試集的方法
今天小編就為大家分享一篇python 劃分?jǐn)?shù)據(jù)集為訓(xùn)練集和測(cè)試集的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
關(guān)于Python函數(shù)參數(shù)的進(jìn)階用法
這篇文章主要給大家分享的是Python函數(shù)參數(shù)的進(jìn)階用法,Python函數(shù)的參數(shù)根據(jù)函數(shù) 在調(diào)用時(shí) 傳參的形式分為關(guān)鍵字參數(shù)和位置參數(shù),下面文章小編就來介紹相關(guān)資料,需要的朋友可以參考一下2021-10-10
python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性
TCP協(xié)議的socket一次只能和一個(gè)客戶端通信, 而socketsever可以時(shí)間和多個(gè)客戶端通信。本文將講解socketserver的具體使用2021-05-05

