Python疫起学习·万丈高楼平地起Day09(精简版|浓缩就是精华)爬虫知识附上案例爬取北京地区短租房信息、爬取酷狗TOP500的数据以及爬取网易云音乐热歌榜单
爬蟲知識
- Requests庫
部分運行結果如下:
有時爬蟲需要加入請求頭來偽裝成瀏覽器,以便更好地抓取數據。在Chrome瀏覽器中按F12鍵打開Chrome開發者工具,刷新網頁后找到User-Agent進行復制,如圖
請求頭的使用方法:
Requests庫不僅有get()方法,還有post()等方法。post()方法用于提交表單來爬取需要登錄才能獲得數據的網站,這部分內容會在后面學習,這里不再贅述。學習get()方法足夠我們爬取大部分的網站了。
Requests庫請求并不會“一帆風順”,當遇到一些情況時,Requests庫會拋出錯誤或者異常,Requests庫的錯誤和異常主要有以下4種。
● Requests拋出一個ConnectionError異常,原因為網絡問題(如DNS查詢失敗、拒絕連接等)。
● Response.raise_for_status()拋出一個HTTPError異常,原因為HTTP請求返回了不成功的狀態碼(如網頁不存在,返回404錯誤)。
● Requests拋出一個Timeout異常,原因為請求超時。
● Requests拋出一個TooManyRedirects異常,原因為請求超過了設定的最大重定向次數。
所有Requests顯式拋出的異常都繼承自requests.exceptions.RequestException,當發現這些錯誤或異常進行代碼修改重新再來時,爬蟲的程序又開始重新運行了,爬取到的數據又會重新爬取一次,這對于爬蟲的效率和質量來說都是不利的。這時,便可通過Python中的try來避免異常了,具體使用方法如下:
通過try和except,如果請求成功了,會打印網頁的源代碼。如果請求出現了ConnectionError異常,則會打印“拒絕連接”,這樣程序就不會報錯,而是給編程者一個提示,不會影響下面代碼的運行。
- BeautifulSoup庫
BeautifulSoup庫是一個非常流行的Python模塊。通過BeautifulSoup庫可以輕松地解析Requests庫請求的網頁,并把網頁源代碼解析為Soup文檔,以便過濾提取數據。
看上去與Requests庫請求返回的網頁源代碼類似,但通過BeautifulSoup庫解析得到的Soup文檔按照標準縮進格式的結構輸出,為結構化的數據,為數據的過濾提取做好準備。
BeautifulSoup庫除了支持Python標準庫中的HTML解析器外,還支持一些第三方的解析器。
注意:BeautifulSoup庫官方推薦使用lxml作為解析器,因為效率更高。
該方法類似于中國 > 湖南省 > 長沙市,從大到小,提取需要的信息,這種方式可以通過Chrome復制得到
#page_list > ul > li:nth-child(1) > div.result_btm_con.lodgeunitname > div:nth-child(1) > span > i
通過代碼即可得到房子價格:
import requests from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36' } res = requests.get('http://bj.xiaozhu.com/', headers=headers) # try: # print(res.text) # except ConnectionError: # print('拒絕連接') soup = BeautifulSoup(res.text, 'html.parser') # print(soup.prettify()) price = soup.select('#page_list > ul > li:nth-child(1) > div.result_btm_con.lodgeunitname > div:nth-child(1) > span > i')print(price)
為了做短租房的平均價格分析,當然是要把所有的房租價格全部提取出來。把selector改為:
#page_list > ul > li > div.result_btm_con.lodgeunitname > div:nth-child(1) > span > i
就可以得到整個頁面的所有價格,這樣提取的信息為列表,可以通過循環分別打印出來也可以存儲起來。
詳細展示如下:
這時程序就已經爬取了一頁中所有的房價信息,但該網站有多個網頁,這時就需要構造URL列表
案例一、爬取北京地區短租房信息
通過手動翻動網頁不難找到一個規律,只需更改p后面的數字即可,以此來構造出13個網頁
本次爬蟲在詳細頁面中進行,因此先需爬取進入詳細頁面的網址鏈接,進而爬取數據。需要爬取的信息有:標題、地址、價格、房東名稱、房東性別和房東頭像的鏈接
詳細代碼如下:
#-*- codeing = utf-8 -*- #@Time : 2020/4/25 18:49 #@Author : Richard #@File : Peiking.pyfrom bs4 import BeautifulSoup import requests import timeheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36' }def judgement_sex(gender):if gender == ['member_ico1']:return '女'else:return '男'def get_links(url): #定義獲取詳細頁URL的函數wb_data = requests.get(url, headers = headers)soup = BeautifulSoup(wb_data.text, 'lxml')links = soup.select('#page_list > ul > li > a')for link in links:href = link.get('href')get_info(href)def get_info(url): #定義獲取網頁信息的函數wb_data = requests.get(url, headers = headers)soup = BeautifulSoup(wb_data.text, 'lxml')titles = soup.select('div.pho_info > h4')addresses = soup.select('span.pr5')prices = soup.select('#pricePart > div.day_l > span')names = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')sexes = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')for title, address, price, name, sex in zip(titles, addresses, prices, names, sexes):data = {'title' : title.get_text().strip(),'address' : address.get_text().strip(),'price' : price.get_text(),'sex' : judgement_sex(sex.get('class'))}print(data)if __name__ == '__main__':urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number) for number in range(1, 14)]for url in urls:get_links(url)time.sleep(1)代碼分析:
(1)第1~3行導入程序需要的庫,Requests庫用于請求網頁獲取網頁數據。BeautifulSoup用于解析網頁數據。time庫的sleep()方法可以讓程序暫停。
(2)第5~7行通過Chrome瀏覽器的開發者工具,復制User-Agent,用于偽裝為瀏覽器,便于爬蟲的穩定性。
(3)之后定義judgment_sex()函數,用于判斷房東的性別。
(4)之后定義了get_links()函數,用于獲取進入詳細頁的鏈接。傳入URL后,進行請求和解析。通過Chrome瀏覽器的“檢查”并“Copy selector”,可以找到進入詳細頁的URL鏈接,但URL鏈接并不是嵌套在標簽中,而是在標簽的屬性信息中
(5)之后定義get_info()函數,用于獲取網頁信息并輸出信息。
(6)之后設定程序的主入口,通過對網頁URL的觀察,利用列表的推導式構造13個URL,并依次調用get_links()函數,time.sleep(2)的意思是每循環一次,讓程序暫停2秒,防止請求網頁頻率過快而導致爬蟲失敗。
案例二、爬取酷狗TOP500的數據
通過實驗表明,改動-8888.html前的數字就相當于翻頁
我們搞爬蟲數據分析的就是不安裝你的客戶端也能搞看更多內容
經過計算得我們需要搞23頁才能導出全部的500首歌
需要爬取的信息有排名情況、歌手、歌曲名和歌曲時間
詳細代碼如下:
#-*- codeing = utf-8 -*- #@Time : 2020/4/25 19:55 #@Author : Richard #@File : KugouMusic.pyimport requests from bs4 import BeautifulSoup import timeheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36' }def get_info(url):wb_data = requests.get(url, headers=headers)soup = BeautifulSoup(wb_data.text, 'lxml')ranks = soup.select('span.pc_temp_num')titles = soup.select('div.pc_temp_songlist > ul > li > a')times = soup.select('span.pc_temp_tips_r > span')for rank, title, time in zip(ranks, titles, times):data = {'rank': rank.get_text().strip(),'singer': title.get_text().split('-')[0],'song': title.get_text().split('-')[1],'time': time.get_text().strip()}print(data)if __name__ == '__main__':urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(1, 24)]for url in urls:get_info(url)time.sleep(1)這里在附上一個網易云音樂的爬取榜單吧
詳細代碼如下:
#-*- codeing = utf-8 -*- #@Time : 2020/4/25 20:23 #@Author : Richard #@File : CloudMusic.pyimport requests from bs4 import BeautifulSoupdef get_music():url = 'http://music.163.com/discover/toplist?id=3778678'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'}html = requests.get(url,headers=headers).textsoup = BeautifulSoup(html,'lxml')find_list = soup.find('ul',class_="f-hide").find_all('a')i = 0for a in find_list:# music_url = 'http://music.163.com'+a['href']music_name = a.texti += 1print(str(i),music_name)if __name__ == '__main__':get_music()部分運行情況如下:
可見今年夏天的風非常火
如果這篇爬蟲有些地方沒看懂也沒關系,我最近會更新爬蟲的知識的
如果喜歡我的文章,請記得一鍵三連哦,點贊關注收藏,你的每一個贊每一份關注每一次收藏都將是我前進路上的無限動力 !!!↖(▔▽▔)↗感謝支持
總結
以上是生活随笔為你收集整理的Python疫起学习·万丈高楼平地起Day09(精简版|浓缩就是精华)爬虫知识附上案例爬取北京地区短租房信息、爬取酷狗TOP500的数据以及爬取网易云音乐热歌榜单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 某城商行超融合建设:从方案设计到融合部署
- 下一篇: 自学JavaScript第四天- JS