<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批量下載今日頭條街拍美圖

          共 4533字,需瀏覽 10分鐘

           ·

          2021-06-24 15:03


          大家好,歡迎來到 Crossin的編程教室 !
          在以前的文章中我們學了Ajax數(shù)據(jù)爬取,這篇文章我們以今日頭條為例,通過分析Ajax請求來抓取今日頭條的街拍美圖,并將圖片下載到本地保存下來。準備好沒,我們現(xiàn)在開始!


          02

          網(wǎng)頁分析


          在抓取之前,首先分析抓取的邏輯。打開今日頭條的街拍美圖
          https://so.toutiao.com/search?dvpf=pc&source=input&keyword=%E8%A1%97%E6%8B%8D
          如下圖:
          們點擊第一個,這個請求的URL是:
          隨后我們打開開發(fā)者工具,切換到Network選項卡,重新刷新頁面并下滑,可以發(fā)現(xiàn)這里出現(xiàn)了很多的條目,點擊‘search?keyword=%’開頭的條目,可以發(fā)現(xiàn)里面有很多圖片信息的數(shù)據(jù),其中img_small_url、img_url是圖片鏈接,如下圖:
          我們只需要用Python來模擬這個Ajax請求,然后提取相關美圖鏈接并下載下來就可以了,但是在這之前,我們還需要分析一下URL的規(guī)律。

          切換回Headers選項卡,觀察一下它的請求URL和Headers信息,如下圖:
          可以看到,這是一個GET請求,請求URL的參數(shù)有keyword、pd、dvpf、aid、page_num、search_json、rawJSON、search_id。我們需要找到這些參數(shù)的規(guī)律,這樣才可以方便地用程序構造出來。
          接下來,滑動頁面,多加載一些新結果。在加載的同時可以發(fā)現(xiàn),Network中又出現(xiàn)了許多Ajax請求。如下圖:
          觀察后續(xù)鏈接的參數(shù),可以發(fā)現(xiàn)發(fā)生變化的參數(shù)只有page_num,其他參數(shù)都沒有變化,而且page_num的偏移量為1,因此我們可以用page_num參數(shù)來控制數(shù)據(jù)分頁,這樣一來,我們就可以通過接口批量獲取數(shù)據(jù)了,然后將數(shù)據(jù)解析,將圖片下載下來即可。


          03

          爬蟲實戰(zhàn)


          定義一個get_page()方法,現(xiàn)加載單個Ajax請求的結果。其中唯一變化的參數(shù)就是page_num,所以我們將它當作參數(shù)傳遞,實現(xiàn)代碼如下:
          def get_page(page_num):
              global headers
              headers = {
                  'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
              }
              params = {
                  'keyword':urllib.parse.unquote('%E8%A1%97%E6%8B%8D'),
                  'pd':'atlas',
                  'dvpf':'pc',
                  'aid':4916,
                  'page_num':page_num,
                                  'search_json':'%7B%22from_search_id%22%3A%22202106100003510102121720341003A4ED%22%2C%22origin_keyword%22%3A%22%E8%A1%97%E6%8B%8D%22%2C%22image_keyword%22%3A%22%E8%A1%97%E6%8B%8D%22%7D',
                  'rawJSON'1,
                  'search_id':'202106100004290101500200495C05B763'
              }
              url='https://so.toutiao.com/search?'+urlencode(params)
              try:
                  response=requests.get(url,headers=headers,params=params)
                  if response.status_code==200:
                      return response.json()
              except requests.ConnectionError:
                  return None
          注意:如果請求失敗,需要在 headers 里增加 referer、host 和 cookie 信息!
          這里我們用urlencode()方法構造請求的GET參數(shù),然后用requests請求這個鏈接,如果返回狀態(tài)碼為200,則調用response的json()方法將結果轉為JSON格式,然后返回。
          接下來,再實現(xiàn)一個解析方法:提取每條數(shù)據(jù)的img_url字段的圖片鏈接,將圖片鏈接返回,此時我們通過構造器來實現(xiàn),實現(xiàn)代碼如下:
          def get_images(json):
              images=json.get('rawData').get('data')
              for image in images:
                  link = image.get('img_url')
                  yield link
          接下來,實現(xiàn)一個保存圖片的方法saving_images(),其中l(wèi)ink是前面get_images()方法返回的圖片鏈接,實現(xiàn)代碼如下:
          def saving_img(link):
              global name
              print(f'-------正在打印第{name}張圖片')
              data=requests.get(link,headers=headers).content
              with open(f'image1/{name}.jpg','wb')as f:
                      f.write(data)
                      name+=1
          最后,只需要構造一個page_num數(shù)組,遍歷page_num,提取圖片鏈接,并將其下載即可,具體代碼如下:
          def main(paga_num):
              json=get_page(paga_num)
              for link in get_images(json):
                  saving_img(link)
          if __name__ == '__main__':
              for i in range(0,2):
                  main(i)
          這樣整個程序就完成了,運行之后可以發(fā)現(xiàn)街拍美圖保存下載下來了,這里我們只遍歷了兩個page_num,爬取了80張圖片,如下圖:


          04

          小結


          好了,Python爬蟲——今日頭條街拍美圖的爬取就講解到這里,感謝觀看!當然,該程序仍有很多可以完善的地方,例如:使用多進程的進程池來實現(xiàn)多進程下載。

          05

          源碼領取


          獲取本文相關代碼、數(shù)據(jù)及演示地址,請點擊下方公眾號名片,回復關鍵字

          頭條

          如果文章對你有幫助,歡迎轉發(fā)/點贊/收藏~

          作者:霖hero(在職爬蟲工程師,熟悉JS逆向與分布式爬蟲。喜歡鉆研,熱愛學習,樂于分享)

          來源:菜J學Python


          _往期文章推薦_

          為了讓大家更好地學習python爬蟲,我們做了一個“靶子”




          如需了解付費精品課程教學答疑服務
          請在Crossin的編程教室內回復: 666

          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  2018人人操 | 亚洲中文字幕组 | 9.1豆花免费网站亚洲天堂 | 国产日本视频完整版无删减在线观看 | 亚洲A无|