閱讀本文前可先參考前文:爬蟲案例一:基礎
前言
我在秋招期間,有幸做了一家電商公司的線上題目,然後發現這個題目比較全面,所以我就準備以這個題目爲核心寫個系列教程,不過爲了公平起見,我就不寫公司名字了。
題目網站
題目
- 點擊進入第二個題目
- 題目描述和提交答案的地方
- 題目提供的網頁
如何分析
- 根據前一篇文章我們已經知道了如何獲取單頁面上的所有的數字,那麼如何獲取多頁面上的數字呢,這裏我們點擊翻頁觀察一下
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
上面會不定期分享有關爬蟲、算法、環境搭建以及有趣的帖子
歡迎大家一起交流學習
轉載請註明