<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用Python多線程爬取王者榮耀高清壁紙

          共 3716字,需瀏覽 8分鐘

           ·

          2022-02-13 11:40

          本文將手把手教你用Python多線程爬取王者榮耀高清壁紙,以下是運(yùn)行代碼后的結(jié)果:



          01

          需求分析



          爬取王者榮耀高清壁紙,其實(shí)用傳統(tǒng)方法也可以爬,但是多線程可以提高效率。

          目標(biāo)網(wǎng)址:

          url?=?"https://pvp.qq.com/web201605/wallpaper.shtml"

          壁紙位置:


          本文主要是演示爬取的過程,因此只爬取10頁,上面的一張圖片其實(shí)是一套圖,有八張圖片(大小不一)。初步分析發(fā)現(xiàn)圖片url不在網(wǎng)頁源碼里,所以需要在network里找到該資源,發(fā)現(xiàn)壁紙放在了worklist的json數(shù)據(jù)里:




          02

          解析數(shù)據(jù)



          打開json.cn,得到如下數(shù)據(jù)。(第一步得到的json數(shù)據(jù)的請求url發(fā)起請求得到的json數(shù)據(jù))
          1. response 復(fù)制到了json.cn網(wǎng)站數(shù)據(jù)是錯(cuò)誤的 jsoncallback=Jquery的數(shù)據(jù)刪掉
          2. 每一個(gè)Object就是一組圖片 sProdImgNo_1 是封面小圖 ()




          03

          編寫代碼



          在創(chuàng)建隊(duì)列之前需要對圖片url進(jìn)行預(yù)處理。

          #?通過編號(hào)來獲取不同規(guī)格的圖片?必須把?200?-->?0
          #?發(fā)現(xiàn)圖片的url做了編碼了?parse.unquote?進(jìn)行了一個(gè)解碼
          def?extract_images(data):
          ????image_urls?=?[]
          ????for?x?in?range(1,9):
          ????????image_url?=?parse.unquote(data['sProdImgNo_%d'%x]).replace('200',?'0')
          ????????image_urls.append(image_url)
          ????return?image_urls

          我們需要定義生產(chǎn)者和消費(fèi)者兩個(gè)類,生產(chǎn)者負(fù)責(zé)獲取圖片url鏈接,消費(fèi)者負(fù)責(zé)下載圖片。所以還需要定義兩個(gè)隊(duì)列,一個(gè)儲(chǔ)存page_url(我們要爬取10頁),一個(gè)儲(chǔ)存img_url。由于多線程相較于函數(shù)式編程復(fù)雜了點(diǎn),就不一點(diǎn)點(diǎn)展示了,直接上代碼。

          生產(chǎn)者:

          class?Producer(threading.Thread):
          ????def?__init__(self,page_ueue,image_ueue,*args,**kwargs):
          ????????super(Producer,self).__init__(*args,**kwargs)?#?初始化父類的init方法屬性,父類也有__init__方法,如果不初始化,會(huì)報(bào)錯(cuò).
          ????????self.page_ueue?=?page_ueue
          ????????self.?image_ueue?=?image_ueue

          ????def?run(self)?->?None:
          ????????while?not?self.page_ueue.empty():
          ????????????page_url?=?self.page_ueue.get()
          ????????????res?=?requests.get(page_url,?headers=headers)
          ????????????result?=?res.json()?#?response.json()?是requests第三方庫提供的?是將json類型的數(shù)據(jù)轉(zhuǎn)換成python字典的
          方法

          ????????????datas?=?result['List']
          ????????????for?data?in?datas:
          ????????????????#?extract_images()定義的全局函數(shù)函數(shù)將圖片url的200改成0,并且解碼圖片url(因?yàn)?張圖片大小不一樣,就是由這個(gè)字符串控制,因?yàn)榭吹綀D片url中有特殊字符%13%aab...)
          ????????????????image_urls?=?extract_images(data)?
          ????????????????name?=?parse.unquote(data['sProdName'])
          ????????????????dirpath?=?os.path.join('image',?name)?#?動(dòng)態(tài)的取添加路徑?os.path.join()
          ????????????????if?not?os.path.exists(dirpath):
          ????????????????????os.mkdir(dirpath)
          ????????????????#?把圖片的url放到隊(duì)列當(dāng)中
          ????????????????for?index,image_url?in?enumerate(image_urls):?#??為圖片命名?enumerate()來解決圖片名字的問題?1.jpg?2.jpg?3.jpg
          ????????????????????self.image_ueue.put({'image_url':image_url,'image_path':os.path.join(dirpath,'%d.jpg'%(index+1))})

          消費(fèi)者:

          class?Comsumer(threading.Thread):
          ????def?__init__(self,?image_ueue,*args,**kwargs):
          ????????super(Comsumer,self).__init__(*args,**kwargs)
          ????????self.image_ueue?=?image_ueue

          ????def?run(self)?->?None:
          ????????while?True:
          ????????????try:
          ????????????????image_obj?=?self.image_ueue.get(timeout=10)
          ????????????????image_url?=?image_obj.get('image_url')
          ????????????????image_path?=?image_obj.get('image_path')
          ????????????????try:
          ????????????????????request.urlretrieve(image_url,image_path)
          ????????????????????print("%s下載成功!"%image_path)
          ????????????????except:
          ????????????????????print('下載失敗')
          ????????????except:
          ????????????????break

          主函數(shù),定義隊(duì)列,開啟線程:

          #?創(chuàng)建了3個(gè)生產(chǎn)者線程?5個(gè)消費(fèi)者線程?(因?yàn)橄M(fèi)者做的事情比較多?發(fā)起請求?保存圖片)
          def?main():

          ????#?創(chuàng)建頁面url隊(duì)列一
          ????page_ueue?=?Queue(10)

          ????#?創(chuàng)建圖片url隊(duì)列
          ????image_ueue?=?Queue(3000)


          ????for?i?in?range(10):?#?咱們就爬取10頁
          ????????img_url?=?"https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page={}&iOrder=0&iSortNumClose=1&171003449092155893818_1620870158277&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1620870158575".format(i)

          ????????page_ueue.put(img_url)

          ????#?創(chuàng)建3個(gè)生產(chǎn)者線程
          ????for?i?in?range(3):
          ????????pt?=?Producer(page_ueue,image_ueue)
          ????????pt.start()

          ????#?創(chuàng)建5個(gè)消費(fèi)者線程
          ????for?i?in?range(5):
          ????????ct?=?Comsumer(image_ueue)
          ????????ct.start()



          04

          程序運(yùn)行



          if?__name__?==?'__main__':
          ????main()


          感興趣的小伙伴可以去試一下。

          加入知識(shí)星球【我們談?wù)摂?shù)據(jù)科學(xué)】

          500+小伙伴一起學(xué)習(xí)!








          ·?推薦閱讀?·

          地圖可視化:geopandas繪制拓?fù)渲貓D

          盤點(diǎn)2021最佳數(shù)據(jù)可視化作品

          「Python實(shí)用秘技04」pdf文件批量添加文字水印


          瀏覽 43
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品久久7777 | 韩国一道本在线 | 91豆花网站在线视频 | 啊啊啊啊操我在线动漫 | 人人草人人爱 |