知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
python多線程爬取壁紙 媽媽再也不擔(dān)心我沒壁紙了!
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):82
基于上次的簡單爬蟲之后,這次的爬蟲添加了多線程的新元素,使爬取的速度在原來的基礎(chǔ)上快了N倍,話不多說,來看代碼
首先我們選擇的網(wǎng)站還是上次的H128壁紙,不知道具體流程的可以看下上次寫的入門代碼
傳送門!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
打開網(wǎng)站,這里我選擇的是動漫專區(qū)的壁紙,我們的目的是把所有動漫壁紙爬下來,我們發(fā)現(xiàn)一共有98頁圖片
所以我們要做的是觀察每頁圖片鏈接的關(guān)系,我們打開第二頁圖片觀察
發(fā)現(xiàn)兩頁圖片的鏈接分別是
https://www.h128.com/pc/anime/0/2/1920x1080/t/1.html
https://www.h128.com/pc/anime/0/2/1920x1080/t/2.html
我們發(fā)現(xiàn)兩個網(wǎng)頁只有t/后面的數(shù)據(jù)不同由此我們觀察后面幾頁,最終我們發(fā)現(xiàn)/t/后面的數(shù)字就是代表頁數(shù),所以在最開始我們建立一個函數(shù)來存放我們需要的網(wǎng)頁鏈接
如下:
page_links_list = ['https://www.h128.com/pc/anime/0/2/1920x1080/t/1.html']
def GetUrls(page_links_list):
pages = int(input("請輸入你想爬取的頁數(shù):"))
if pages > 1:
for page in range(2, pages + 1):
url = 'https://www.h128.com/pc/anime/0/2/1920x1080/t/' + str(page) + '.html'
page_links_list.append(url)
else:
page_links_list = page_links_list
然后就是我們多線程的應(yīng)用了,我們要用的是python的threading模塊首先需要導(dǎo)入threading
import threading
首先建立一個glock 用來控制
gLock = threading.Lock()
**threading 提供了 Lock 類,該類能夠在某個線程訪問某個變量的時候?qū)ψ兞考渔i,此時其它線程就不能訪問該變量,直到該 Lock 被釋放其它線程才能夠訪問該變量
**
我們爬蟲需要生產(chǎn)者進程和消費者進程,生產(chǎn)者的線程專門用來生產(chǎn)一些數(shù)據(jù),然后存放到一個中間的變量中。消費者再從這個中間的變量中取出數(shù)據(jù)進行消費。但是因為要使用中間變量,中間變量經(jīng)常是一些全局變量,因此需要使用鎖來保證數(shù)據(jù)完整性。在這個代碼中生產(chǎn)者進程負責(zé)來獲取我們圖片的url,而消費者進程的目的是下載圖片。
生產(chǎn)者代碼如下:
class Generant(threading.Thread):
def run(self):
while len(page_links_list) > 0:
gLock.acquire() #上鎖
page_url = page_links_list.pop()
gLock.release() #釋放鎖
r = requests.get(page_url,headers = headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
a = re.findall('<img src="https:(.*?)" alt',r.text)
gLock.acquire() #上鎖
for i in a :
x = 'https:' + i
x = x.replace('w_487', 'w_1421').replace('h_274', 'h_799')
img_links_list.append(x)
gLock.release() #釋放鎖
消費者代碼如下
class Consumer(threading.Thread,):
def run(self):
while True:
gLock.acquire()
if len(img_links_list) == 0:
gLock.release()
continue
else:
img_url = img_links_list.pop()
gLock.release()
filename = img_url.split('?')[0].split('/')[-1]
r = requests.get(img_url)
print('正在下載:', filename)
path = './picture/' + filename
with open(path,'wb') as f:
f.write(r.content)
f.close()
if len(img_links_list) == 0:
end = time.time()
print("消耗的時間為:", (end - start))
exit()
最后的代碼就是啟動線程
for x in range(5):
Generant().start()
for x in range(5):
Consumer().start()
觀看運行結(jié)果:
這里是下載了50頁圖片的時間,比起單線程還是很快的。
最后附上完整代碼
下面展示一些 內(nèi)聯(lián)代碼片
。
import threading
import requests
import re
import time
import os
page_links_list = ['https://www.h128.com/pc/anime/0/2/1920x1080/t/1.html']
img_links_list = []
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
}
def GetUrls(page_links_list):
pages = int(input("請輸入你想爬取的頁數(shù):"))
if pages > 1:
for page in range(2, pages + 1):
url = 'https://www.h128.com/pc/anime/0/2/1920x1080/t/' + str(page) + '.html'
page_links_list.append(url)
else:
page_links_list = page_links_list
gLock = threading.Lock()
class Generant(threading.Thread):
def run(self):
while len(page_links_list) > 0:
gLock.acquire() #上鎖
page_url = page_links_list.pop()
gLock.release() #釋放鎖
r = requests.get(page_url,headers = headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
a = re.findall('<img src="https:(.*?)" alt',r.text)
gLock.acquire() #上鎖
for i in a :
x = 'https:' + i
x = x.replace('w_487', 'w_1421').replace('h_274', 'h_799')
img_links_list.append(x)
gLock.release() #釋放鎖
class Consumer(threading.Thread,):
def run(self):
while True:
gLock.acquire()
if len(img_links_list) == 0:
gLock.release()
continue
else:
img_url = img_links_list.pop()
gLock.release()
filename = img_url.split('?')[0].split('/')[-1]
r = requests.get(img_url)
print('正在下載:', filename)
path = './picture/' + filename
with open(path,'wb') as f:
f.write(r.content)
f.close()
if len(img_links_list) == 0:
end = time.time()
print("消耗的時間為:", (end - start))
exit()
if __name__ == '__main__':
GetUrls(page_links_list)
if os.path.exists('./picture'):
print("文件已存在")
else:
os.mkdir('./picture')
start = time.time()
for x in range(5):
Generant().start()
for x in range(5):
Consumer().start()
最后如果想要全站的圖片只要把鏈接改一下就OK
相關(guān)案例查看更多
相關(guān)閱讀
- 云南百度小程序
- 網(wǎng)頁制作
- 昆明網(wǎng)站開發(fā)
- 網(wǎng)站排名優(yōu)化
- 昆明做網(wǎng)站
- 云南網(wǎng)站建設(shè)首選
- 報廢車拆解系統(tǒng)
- 軟件定制公司
- 云南省建設(shè)廳官方網(wǎng)站
- python開發(fā)小程序
- 網(wǎng)站建設(shè)方法
- 網(wǎng)站建設(shè)費用
- 網(wǎng)絡(luò)公司電話
- 云南小程序哪家好
- 汽車報廢拆解管理系統(tǒng)
- 出入小程序
- 表單
- 云南網(wǎng)絡(luò)公司
- web開發(fā)
- 網(wǎng)站建設(shè)報價
- 百度推廣
- 云南網(wǎng)站建設(shè)快速優(yōu)化
- 報廢車管理系統(tǒng)
- 云南小程序開發(fā)公司哪家好
- 網(wǎng)站建設(shè)選
- 小程序
- 云南網(wǎng)站建設(shè)優(yōu)化
- 定制小程序開發(fā)
- 百度快速排名
- 網(wǎng)站開發(fā)