爬蟲案例二:分頁

閱讀本文前可先參考前文:爬蟲案例一:基礎

前言

我在秋招期間,有幸做了一家電商公司的線上題目,然後發現這個題目比較全面,所以我就準備以這個題目爲核心寫個系列教程,不過爲了公平起見,我就不寫公司名字了。

題目網站

題目

  • 點擊進入第二個題目
    在這裏插入圖片描述
  • 題目描述和提交答案的地方
    在這裏插入圖片描述
  • 題目提供的網頁
    在這裏插入圖片描述

如何分析

  • 根據前一篇文章我們已經知道了如何獲取單頁面上的所有的數字,那麼如何獲取多頁面上的數字呢,這裏我們點擊翻頁觀察一下 URL
    在這裏插入圖片描述在這裏插入圖片描述
  • 這裏我們發現除了 page= 後面的頁數 其餘都是不變的,所以我們只需要根據 URL 的生成規則把所有頁面的 URL 拼接生成即可,然後把生成的 URL 按照單頁面的獲取方式獲取頁面

拼接生成1000頁的URL

  • 代碼
    #range 方法在不指定第一個參數的情況下是返回從0開始的數字列表,然後後面指定到哪裏截止
    for page in range(1,1001):
        url='http://glidedsky.com/level/web/crawler-basic-2?page=%s'%page
        print(url)
    
  • 運行結果
    在這裏插入圖片描述

封裝好單個頁面獲取值的方法

  • 這部分的分析請看上篇文章,代碼如下
    import requests
    from bs4 import BeautifulSoup
    
    #計算方法,根據傳入的url請求網頁並計算返回網頁上值的合
    def calculate(url):
        headers={
            'Host':'glidedsky.com',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Accept-Encoding':'gzip, deflate',
            'Referer':'http://glidedsky.com/level/crawler-basic-1',
            'Connection':'keep-alive',
            'Cookie':'XSRF-TOKEN=eyJpdiI6Im5ORlZabitEd1d3UHdMdldQT0s3VUE9PSIsInZhbHVlIjoiMDJsNjhCUUR5clhFU25cL2FJQ21MQWpyd2V2a0RDVUh5UURPZGJ2OXNLdmFMZ0N5amVZWVg0Q3FQYkZIN1RhZDMiLCJtYWMiOiI2YTljYmE4OGJlNTQ2YTFlMGI3Yzk4MTNlNmYyMzZlM2JiMmU2NjJhOThiNGVmNDQxMjVlN2MzNjI1ZDk1Yjg4In0%3D; glidedsky_session=eyJpdiI6InBwTFhZbjZLR1BOUk1tbE1wZDBPMnc9PSIsInZhbHVlIjoiMlZsVjNJbVwvWUpIRlJxWHR2YmUzNUUyUitaQ2V2VDNsSTBaVmthdkhxTDhOMnBHK0hMQk5KNjlXd2JPdEh4eUsiLCJtYWMiOiJjZjgxNGI2YmY5YWJkN2Y5NGFiN2ZhY2U3ZWEyNzBmNjZlODE4YTNkYTFjZWJlNGIzMzc4NjliNjMwN2I4OTc1In0%3D; footprints=eyJpdiI6IkNNUWpGQ3FkWFwvQWQ0bU4yRDVlREpBPT0iLCJ2YWx1ZSI6IlhLeE9DZXgwbHRGYmZYa2pmYlE3YTAwY1hzOW1JNEdjY1lKZU04bUZocTkrb3NQNUppbmU3R1wveTRFejJwbU01IiwibWFjIjoiYzg5MDBjYjllZjM5OTA3Y2UwNmM1MmExYjczZmFhYzJhZjYzN2Y5YjVhOTRiNTIzNzczOGI5YWRkYmUyNmE2MiJ9; Hm_lvt_020fbaad6104bcddd1db12d6b78812f6=1573610190; Hm_lpvt_020fbaad6104bcddd1db12d6b78812f6=1573611039; _ga=GA1.2.157021610.1573610191; _gid=GA1.2.1296302792.1573610191; remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d=eyJpdiI6IlwvNmJXbTR1K0lENWM2ZGZGdEJBamJnPT0iLCJ2YWx1ZSI6InJkUmE3V2ExXC9JNURpWWZZbElHVXA0aDNxdHcxOFwvR2tMUkpISzdVN1FCRjROOE9iZklcL29Lb3RBY0dmVjNOV0M5K1k4bVp3dTZvb2hiYXVDK0w5YTFFUUpEbW85b3o0UEVsUkN4UHpoSnU1Q2NKYlZCXC9UbkY3cUhqVlg1bW1hXC9wXC96SndtR3NJOVNKN3BYaXFscmhvUzhBMGNwdDNySHZidGJzUUNocFowWT0iLCJtYWMiOiIxMzE5NmE0Y2IzMmI5YmNmZjUwMGYyOGNiYTM5OGIwOTVhMGY4Y2E3MDFlMDg4Y2I5Y2VhOWZjY2Q2YzE0MWQ2In0%3D',
            'Upgrade-Insecure-Requests':'1',
            'Pragma':'no-cache',
            'Cache-Control':'no-cache'
        }
        response=requests.get(url,headers=headers)
        #生成解析器對象
        soup=BeautifulSoup(response.text,'lxml')
        #根據標籤的特徵獲取所有滿足特徵的標籤
        divs=soup.find_all('div',attrs={'class':'col-md-1'})
        #換成列表推導式
        nums=[int(div.text.strip()) for div in divs]
        sum_num=sum(nums)
        return sum_num
    
  • 用第二頁做測試,返回結果,結果計算,結果正確
    在這裏插入圖片描述在這裏插入圖片描述

最終代碼

  • 只需要把封裝的方法放到for循環裏面,並把方法返回的結果累加即可
    import requests
    from bs4 import BeautifulSoup
    
    #計算方法,根據傳入的url請求網頁並計算返回網頁上值的合
    def calculate(url):
        headers={
            'Host':'glidedsky.com',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Accept-Encoding':'gzip, deflate',
            'Referer':'http://glidedsky.com/level/crawler-basic-1',
            'Connection':'keep-alive',
            'Cookie':'XSRF-TOKEN=eyJpdiI6Im5ORlZabitEd1d3UHdMdldQT0s3VUE9PSIsInZhbHVlIjoiMDJsNjhCUUR5clhFU25cL2FJQ21MQWpyd2V2a0RDVUh5UURPZGJ2OXNLdmFMZ0N5amVZWVg0Q3FQYkZIN1RhZDMiLCJtYWMiOiI2YTljYmE4OGJlNTQ2YTFlMGI3Yzk4MTNlNmYyMzZlM2JiMmU2NjJhOThiNGVmNDQxMjVlN2MzNjI1ZDk1Yjg4In0%3D; glidedsky_session=eyJpdiI6InBwTFhZbjZLR1BOUk1tbE1wZDBPMnc9PSIsInZhbHVlIjoiMlZsVjNJbVwvWUpIRlJxWHR2YmUzNUUyUitaQ2V2VDNsSTBaVmthdkhxTDhOMnBHK0hMQk5KNjlXd2JPdEh4eUsiLCJtYWMiOiJjZjgxNGI2YmY5YWJkN2Y5NGFiN2ZhY2U3ZWEyNzBmNjZlODE4YTNkYTFjZWJlNGIzMzc4NjliNjMwN2I4OTc1In0%3D; footprints=eyJpdiI6IkNNUWpGQ3FkWFwvQWQ0bU4yRDVlREpBPT0iLCJ2YWx1ZSI6IlhLeE9DZXgwbHRGYmZYa2pmYlE3YTAwY1hzOW1JNEdjY1lKZU04bUZocTkrb3NQNUppbmU3R1wveTRFejJwbU01IiwibWFjIjoiYzg5MDBjYjllZjM5OTA3Y2UwNmM1MmExYjczZmFhYzJhZjYzN2Y5YjVhOTRiNTIzNzczOGI5YWRkYmUyNmE2MiJ9; Hm_lvt_020fbaad6104bcddd1db12d6b78812f6=1573610190; Hm_lpvt_020fbaad6104bcddd1db12d6b78812f6=1573611039; _ga=GA1.2.157021610.1573610191; _gid=GA1.2.1296302792.1573610191; remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d=eyJpdiI6IlwvNmJXbTR1K0lENWM2ZGZGdEJBamJnPT0iLCJ2YWx1ZSI6InJkUmE3V2ExXC9JNURpWWZZbElHVXA0aDNxdHcxOFwvR2tMUkpISzdVN1FCRjROOE9iZklcL29Lb3RBY0dmVjNOV0M5K1k4bVp3dTZvb2hiYXVDK0w5YTFFUUpEbW85b3o0UEVsUkN4UHpoSnU1Q2NKYlZCXC9UbkY3cUhqVlg1bW1hXC9wXC96SndtR3NJOVNKN3BYaXFscmhvUzhBMGNwdDNySHZidGJzUUNocFowWT0iLCJtYWMiOiIxMzE5NmE0Y2IzMmI5YmNmZjUwMGYyOGNiYTM5OGIwOTVhMGY4Y2E3MDFlMDg4Y2I5Y2VhOWZjY2Q2YzE0MWQ2In0%3D',
            'Upgrade-Insecure-Requests':'1',
            'Pragma':'no-cache',
            'Cache-Control':'no-cache'
        }
        response=requests.get(url,headers=headers)
        #生成解析器對象
        soup=BeautifulSoup(response.text,'lxml')
        #根據標籤的特徵獲取所有滿足特徵的標籤
        divs=soup.find_all('div',attrs={'class':'col-md-1'})
        #換成列表推導式
        nums=[int(div.text.strip()) for div in divs]
        sum_num=sum(nums)
        return sum_num
    
    #range 方法在不指定第一個參數的情況下是返回從0開始的數字列表,然後後面指定到哪裏截止
    sum_num=0
    for page in range(1,1001):
        url='http://glidedsky.com/level/web/crawler-basic-2?page=%s'%page
        num=calculate(url)
        sum_num+=num
    print('1000頁的總結果爲',sum)
    
  • 運算結果
    在這裏插入圖片描述
  • 結果提交
    在這裏插入圖片描述

GitHub源碼:https://github.com/coderyyn/spider_example

相關文章

我的個人博客網站是:www.coderyyn.cn
上面會不定期分享有關爬蟲、算法、環境搭建以及有趣的帖子
歡迎大家一起交流學習

轉載請註明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章