本篇文章給大家?guī)砹岁P(guān)于Python的相關(guān)知識,其中主要介紹了關(guān)于爬蟲的相關(guān)知識,爬蟲簡單的來說就是用程序獲取網(wǎng)絡(luò)上數(shù)據(jù)這個過程的一種名稱,下面一起來看一下,希望對大家有幫助。
爬蟲是什么
爬蟲簡單的來說就是用程序獲取網(wǎng)絡(luò)上數(shù)據(jù)這個過程的一種名稱。
爬蟲的原理
如果要獲取網(wǎng)絡(luò)上數(shù)據(jù),我們要給爬蟲一個網(wǎng)址(程序中通常叫URL),爬蟲發(fā)送一個HTTP請求給目標網(wǎng)頁的服務(wù)器,服務(wù)器返回數(shù)據(jù)給客戶端(也就是我們的爬蟲),爬蟲再進行數(shù)據(jù)解析、保存等一系列操作。
流程
爬蟲可以節(jié)省我們的時間,比如我要獲取豆瓣電影 Top250 榜單,如果不用爬蟲,我們要先在瀏覽器上輸入豆瓣電影的 URL ,客戶端(瀏覽器)通過解析查到豆瓣電影網(wǎng)頁的服務(wù)器的 IP 地址,然后與它建立連接,瀏覽器再創(chuàng)造一個 HTTP 請求發(fā)送給豆瓣電影的服務(wù)器,服務(wù)器收到請求之后,把 Top250 榜單從數(shù)據(jù)庫中提出,封裝成一個 HTTP 響應(yīng),然后將響應(yīng)結(jié)果返回給瀏覽器,瀏覽器顯示響應(yīng)內(nèi)容,我們看到數(shù)據(jù)。我們的爬蟲也是根據(jù)這個流程,只不過改成了代碼形式。
HTTP請求
HTTP 請求由請求行、請求頭、空行、請求體組成。
請求行由三部分組成:
1.請求方法,常見的請求方法有 GET、POST、PUT、DELETE、HEAD
2.客戶端要獲取的資源路徑
3.是客戶端使用的 HTTP 協(xié)議版本號
請求頭是客戶端向服務(wù)器發(fā)送請求的補充說明,比如說明訪問者身份,這個下面會講到。
請求體是客戶端向服務(wù)器提交的數(shù)據(jù),比如用戶登錄時需要提高的賬號密碼信息。請求頭與請求體之間用空行隔開。請求體并不是所有的請求都有的,比如一般的GET都不會帶有請求體。
上圖就是瀏覽器登錄豆瓣時向服務(wù)器發(fā)送的HTTP POST 請求,請求體中指定了用戶名和密碼。
HTTP 響應(yīng)
HTTP 響應(yīng)格式與請求的格式很相似,也是由響應(yīng)行、響應(yīng)頭、空行、響應(yīng)體組成。
響應(yīng)行也包含三部分,分別是服務(wù)端的 HTTP 版本號、響應(yīng)狀態(tài)碼和狀態(tài)說明。
這里狀態(tài)碼有一張表,對應(yīng)了各個狀態(tài)碼的意思
第二部分就是響應(yīng)頭,響應(yīng)頭與請求頭對應(yīng),是服務(wù)器對該響應(yīng)的一些附加說明,比如響應(yīng)內(nèi)容的格式是什么,響應(yīng)內(nèi)容的長度有多少、什么時間返回給客戶端的、甚至還有一些 Cookie 信息也會放在響應(yīng)頭里面。
第三部分是響應(yīng)體,它才是真正的響應(yīng)數(shù)據(jù),這些數(shù)據(jù)其實就是網(wǎng)頁的 HTML 源代碼。
爬蟲代碼怎么寫
爬蟲可以用很多語言比如 Python、C++等等,但是我覺得Python是最簡單的,
因為Python有現(xiàn)成可用的庫,已經(jīng)封裝到幾乎完美,
C++雖然也有現(xiàn)成的庫,但是它的爬蟲還是比較小眾,僅有的庫也不足以算上簡單,而且代碼在各個編譯器上,甚至同一個編譯器上不同版本的兼容性不強,所以不是特別好用。所以今天主要介紹python爬蟲。
安裝requests庫
cmd運行:pip install requests ,安裝 requests。
然后在 IDLE 或者編譯器(個人推薦 VS Code 或者 Pycharm )上輸入
import requests 運行,如果沒有報錯,證明安裝成功。
安裝大部分庫的方法都是:pip install xxx(庫的名字)
requests的方法
requests.request() | 構(gòu)造一個請求,支撐一下各方法的基本方法 |
requests.get() | 獲取HTML網(wǎng)頁的主要方法,對應(yīng)于HTTP的GET |
requests.head() |
獲取HTML網(wǎng)頁頭信息的方法,對應(yīng)于HTTP的HEAD |
requests.post() | 向HTML網(wǎng)頁提交POST請求的方法,對應(yīng)于HTTP的POST |
requests.put() | 向HTML網(wǎng)頁提交PUT請求的方法,對應(yīng)于HTTP的PUT |
requests.patch( ) | 向HTML網(wǎng)頁提交局部修改請求,對應(yīng)于HTTP的PATCT |
requests.delete() | 向HTML網(wǎng)頁提交刪除請求,對應(yīng)于HTTP的DELETE |
最常用的get方法
r = requests.get(url)
包括兩個重要的對象:
構(gòu)造一個向服務(wù)器請求資源的Request對象;返回一個包含服務(wù)器資源的Response對象
r.status_code | HTTP請求的返回狀態(tài),200表示連接成功,404表示失敗 |
r.text | HTTP響應(yīng)內(nèi)容的字符串形式,即,url對應(yīng)的頁面內(nèi)容 |
r.encoding | 從HTTP header中猜測的響應(yīng)內(nèi)容編碼方式(如果header中不存在charset,則認為編碼為ISO-8859-1) |
r.apparent_encoding | 從內(nèi)容中分析的響應(yīng)內(nèi)容編碼方式(備選編碼方式) |
r.content | HTTP響應(yīng)內(nèi)容的二進制形式 |
requests.ConnectionError | 網(wǎng)絡(luò)連接錯誤異常,如DNS查詢失敗、拒絕連接等 |
requests.HTTPError | HTTP錯誤異常 |
requests.URLRequired | URL缺失異常 |
requests.TooManyRedirects | 超過最大重定向次數(shù),產(chǎn)生重定向異常 |
requests.ConnectTimeout | 連接遠程服務(wù)器超時異常 |
requests.Timeout | 請求URL超時,產(chǎn)生超時異常 |
爬蟲小demo
requests是最基礎(chǔ)的爬蟲庫,但是我們可以做一個簡單的翻譯
我先把我做的一個爬蟲的小項目的項目結(jié)構(gòu)放上,完整源碼可以私聊我下載。
下面是翻譯部分的源碼
import requests def English_Chinese(): url = "https://fanyi.baidu.com/sug" s = input("請輸入要翻譯的詞(中/英):") dat = { "kw":s } resp = requests.post(url,data = dat)# 發(fā)送post請求 ch = resp.json() # 將服務(wù)器返回的內(nèi)容直接處理成json => dict resp.close() dic_lenth = len(ch['data']) for i in range(dic_lenth): print("詞:"+ch['data'][i]['k']+" "+"單詞意思:"+ch['data'][i]['v'])
代碼詳解:
導(dǎo)入requests模塊,設(shè)置 url為百度翻譯網(wǎng)頁的網(wǎng)址。
然后通過 post 方法發(fā)送請求,再把返回的結(jié)果打成一個 dic (字典),但是這個時候我們打印出來結(jié)果發(fā)現(xiàn)是這樣的。
這是一個字典里套列表套字典的樣子,大概就是這樣的
{ xx:xx , xx:[ {xx:xx} , {xx:xx} , {xx:xx} , {xx:xx} ] }
我標紅的地方是我們需要的信息。
假如說我標藍色的列表里面有 n 個字典,我們可以通過 len() 函數(shù)獲取 n 的數(shù)值,
并使用 for 循環(huán)遍歷,得到結(jié)果。
dic_lenth = len(ch['data'] for i in range(dic_lenth): print("詞:"+ch['data'][i]['k']+" "+"單詞意思:"+ch['data'][i]['v'])
最后
好了,今天的分享就到這里了,拜拜~
哎?忘了一件事,再給你們一個爬取天氣的代碼!
# -*- coding:utf-8 -*- import requests import bs4 def get_web(url): header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59"} res = requests.get(url, headers=header, timeout=5) # print(res.encoding) content = res.text.encode('ISO-8859-1') return content def parse_content(content): soup = bs4.BeautifulSoup(content, 'lxml') ''' 存放天氣情況 ''' list_weather = [] weather_list = soup.find_all('p', class_='wea') for i in weather_list: list_weather.append(i.text) ''' 存放日期 ''' list_day = [] i = 0 day_list = soup.find_all('h1') for each in day_list: if i <= 6: list_day.append(each.text.strip()) i += 1 # print(list_day) ''' 存放溫度:最高溫度和最低溫度 ''' tem_list = soup.find_all('p', class_='tem') i = 0 list_tem = [] for each in tem_list: if i == 0: list_tem.append(each.i.text) i += 1 elif i > 0: list_tem.append([each.span.text, each.i.text]) i += 1 # print(list_tem) ''' 存放風力 ''' list_wind = [] wind_list = soup.find_all('p', class_='win') for each in wind_list: list_wind.append(each.i.text.strip()) # print(list_wind) return list_day, list_weather, list_tem, list_wind def get_content(url): content = get_web(url) day, weather, tem, wind = parse_content(content) item = 0 for i in range(0, 7): if item == 0: print(day[i]+':t') print(weather[i]+'t') print("今日氣溫:"+tem[i]+'t') print("風力:"+wind[i]+'t') print('n') item += 1 elif item > 0: print(day[i]+':t') print(weather[i] + 't') print("最高氣溫:"+tem[i][0]+'t') print("最低氣溫:"+tem[i][1] + 't') print("風力:"+wind[i]+'t') print('n')
【