1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3716字,需瀏覽 8分鐘

         ·

        2022-02-13 11:40

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



        01

        需求分析



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

        目標網(wǎng)址:

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

        壁紙位置:


        本文主要是演示爬取的過程,因此只爬取10頁,上面的一張圖片其實是一套圖,有八張圖片(大小不一)。初步分析發(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 復制到了json.cn網(wǎng)站數(shù)據(jù)是錯誤的 jsoncallback=Jquery的數(shù)據(jù)刪掉
        2. 每一個Object就是一組圖片 sProdImgNo_1 是封面小圖 ()




        03

        編寫代碼



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

        #?通過編號來獲取不同規(guī)格的圖片?必須把?200?-->?0
        #?發(fā)現(xiàn)圖片的url做了編碼了?parse.unquote?進行了一個解碼
        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)者和消費者兩個類,生產(chǎn)者負責獲取圖片url鏈接,消費者負責下載圖片。所以還需要定義兩個隊列,一個儲存page_url(我們要爬取10頁),一個儲存img_url。由于多線程相較于函數(shù)式編程復雜了點,就不一點點展示了,直接上代碼。

        生產(chǎn)者:

        class?Producer(threading.Thread):
        ????def?__init__(self,page_ueue,image_ueue,*args,**kwargs):
        ????????super(Producer,self).__init__(*args,**kwargs)?#?初始化父類的init方法屬性,父類也有__init__方法,如果不初始化,會報錯.
        ????????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ù)轉換成python字典的
        方法

        ????????????datas?=?result['List']
        ????????????for?data?in?datas:
        ????????????????#?extract_images()定義的全局函數(shù)函數(shù)將圖片url的200改成0,并且解碼圖片url(因為8張圖片大小不一樣,就是由這個字符串控制,因為看到圖片url中有特殊字符%13%aab...)
        ????????????????image_urls?=?extract_images(data)?
        ????????????????name?=?parse.unquote(data['sProdName'])
        ????????????????dirpath?=?os.path.join('image',?name)?#?動態(tài)的取添加路徑?os.path.join()
        ????????????????if?not?os.path.exists(dirpath):
        ????????????????????os.mkdir(dirpath)
        ????????????????#?把圖片的url放到隊列當中
        ????????????????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))})

        消費者:

        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ù),定義隊列,開啟線程:

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

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

        ????#?創(chuàng)建圖片url隊列
        ????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個生產(chǎn)者線程
        ????for?i?in?range(3):
        ????????pt?=?Producer(page_ueue,image_ueue)
        ????????pt.start()

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



        04

        程序運行



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


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

        加入知識星球【我們談論數(shù)據(jù)科學】

        500+小伙伴一起學習!








        ·?推薦閱讀?·

        地圖可視化:geopandas繪制拓撲著色地圖

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

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


        瀏覽 43
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            东京热AV无码国产东京热AⅤ | 国产波霸巨爆乳无码视频在线 | juliaann双乳喷奶水 | 成熟护士长的蚌肉的滋味 | 欧美午夜精品一区二区三区 | 我给你日b小说 | 东京热在线视频观看 | 伊人五月丁香婷婷大香蕉 | 互换娇妻爽文100系列电影 | 蜜臀Tv精品一区二区三区 |