<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爬蟲 | 批量爬取今日頭條街拍美圖

          共 6340字,需瀏覽 13分鐘

           ·

          2021-07-06 10:08

               
          點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書

          浮云一別后,流水十年間。



          專欄作者:霖hero,在職爬蟲工程師,熟悉JS逆向與分布式爬蟲。喜歡鉆研,熱愛學(xué)習(xí),樂于分享。公眾號后臺回復(fù)入群,拉你進(jìn)技術(shù)群與大佬們近距離交流。
              


          01

          前言


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



          02

          網(wǎng)頁分析


          在抓取之前,首先分析抓取的邏輯。打開今日頭條的街拍美圖https://so.toutiao.com/search?dvpf=pc&source=input&keyword=%E8%A1%97%E6%8B%8D,如下圖:


          我們點(diǎn)擊第一個,這個請求的URL是:


          隨后我們打開開發(fā)者工具,切換到Network選項卡,重新刷新頁面并下滑,可以發(fā)現(xiàn)這里出現(xiàn)了很多的條目,點(diǎn)擊‘search?keyword=%’開頭的條目,可以發(fā)現(xiàn)里面有很多圖片信息的數(shù)據(jù),其中img_small_url、img_url是圖片鏈接,如下圖:


          我們只需要用Python來模擬這個Ajax請求,然后提取相關(guān)美圖鏈接并下載下來就可以了,但是在這之前,我們還需要分析一下URL的規(guī)律。

          切換回Headers選項卡,觀察一下它的請求URL和Headers信息,如下圖:


          可以看到,這是一個GET請求,請求URL的參數(shù)有keyword、pd、dvpf、aid、page_num、search_json、rawJSON、search_id。我們需要找到這些參數(shù)的規(guī)律,這樣才可以方便地用程序構(gòu)造出來。

          接下來,滑動頁面,多加載一些新結(jié)果。在加載的同時可以發(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

          爬蟲實(shí)戰(zhàn)


          定義一個get_page()方法,實(shí)現(xiàn)加載單個Ajax請求的結(jié)果。其中唯一變化的參數(shù)就是page_num,所以我們將它當(dāng)作參數(shù)傳遞,實(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

          這里我們用urlencode()方法構(gòu)造請求的GET參數(shù),然后用requests請求這個鏈接,如果返回狀態(tài)碼為200,則調(diào)用response的json()方法將結(jié)果轉(zhuǎn)為JSON格式,然后返回。

          接下來,再實(shí)現(xiàn)一個解析方法:提取每條數(shù)據(jù)的img_url字段的圖片鏈接,將圖片鏈接返回,此時我們通過構(gòu)造器來實(shí)現(xiàn),實(shí)現(xiàn)代碼如下:

              
          def get_images(json):
              images=json.get('rawData').get('data')
              for image in images:
                  link = image.get('img_url')
                  yield link

          接下來,實(shí)現(xiàn)一個保存圖片的方法saving_images(),其中l(wèi)ink是前面get_images()方法返回的圖片鏈接,實(shí)現(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

          最后,只需要構(gòu)造一個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)

          這樣整個程序就完成了,運(yùn)行之后可以發(fā)現(xiàn)街拍美圖保存下載下來了,這里我們只遍歷了兩個page_num,爬取了80張圖片,如下圖:



          04

          小結(jié)


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

          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群

          萬水千山總是情,點(diǎn)個【在看】行不行

          /今日留言主題/

          隨便說一兩句吧!

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  青娱视频亚洲免费 | 无码在线播放观看 | 国产男人天堂 | 爽爽爽网站最新地址 | 国内屄视频 |