溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python爬蟲代碼怎么寫

發(fā)布時間:2023-01-31 09:22:42 來源:億速云 閱讀:207 作者:iii 欄目:編程語言

這篇“Python爬蟲代碼怎么寫”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python爬蟲代碼怎么寫”文章吧。

爬蟲是什么

爬蟲簡單的來說就是用程序獲取網絡上數據這個過程的一種名稱。

爬蟲的原理

如果要獲取網絡上數據,我們要給爬蟲一個網址(程序中通常叫URL),爬蟲發(fā)送一個HTTP請求給目標網頁的服務器,服務器返回數據給客戶端(也就是我們的爬蟲),爬蟲再進行數據解析、保存等一系列操作。

流程

爬蟲可以節(jié)省我們的時間,比如我要獲取豆瓣電影 Top250 榜單,如果不用爬蟲,我們要先在瀏覽器上輸入豆瓣電影的 URL ,客戶端(瀏覽器)通過解析查到豆瓣電影網頁的服務器的 IP 地址,然后與它建立連接,瀏覽器再創(chuàng)造一個 HTTP 請求發(fā)送給豆瓣電影的服務器,服務器收到請求之后,把 Top250 榜單從數據庫中提出,封裝成一個 HTTP 響應,然后將響應結果返回給瀏覽器,瀏覽器顯示響應內容,我們看到數據。我們的爬蟲也是根據這個流程,只不過改成了代碼形式。

Python爬蟲代碼怎么寫

HTTP請求

HTTP 請求由請求行、請求頭、空行、請求體組成。

Python爬蟲代碼怎么寫

請求行由三部分組成:

1.請求方法,常見的請求方法有 GET、POST、PUT、DELETE、HEAD
        2.客戶端要獲取的資源路徑
        3.是客戶端使用的 HTTP 協議版本號
請求頭是客戶端向服務器發(fā)送請求的補充說明,比如說明訪問者身份,這個下面會講到。

請求體是客戶端向服務器提交的數據,比如用戶登錄時需要提高的賬號密碼信息。請求頭與請求體之間用空行隔開。請求體并不是所有的請求都有的,比如一般的GET都不會帶有請求體。

上圖就是瀏覽器登錄豆瓣時向服務器發(fā)送的HTTP POST 請求,請求體中指定了用戶名和密碼。

HTTP 響應

HTTP 響應格式與請求的格式很相似,也是由響應行、響應頭、空行、響應體組成。

Python爬蟲代碼怎么寫

響應行也包含三部分,分別是服務端的 HTTP 版本號、響應狀態(tài)碼和狀態(tài)說明。

這里狀態(tài)碼有一張表,對應了各個狀態(tài)碼的意思

Python爬蟲代碼怎么寫

Python爬蟲代碼怎么寫 Python爬蟲代碼怎么寫

第二部分就是響應頭,響應頭與請求頭對應,是服務器對該響應的一些附加說明,比如響應內容的格式是什么,響應內容的長度有多少、什么時間返回給客戶端的、甚至還有一些 Cookie 信息也會放在響應頭里面。

第三部分是響應體,它才是真正的響應數據,這些數據其實就是網頁的 HTML 源代碼。

爬蟲代碼怎么寫

爬蟲可以用很多語言比如 Python、C++等等,但是我覺得Python是最簡單的,

因為Python有現成可用的庫,已經封裝到幾乎完美,

C++雖然也有現成的庫,但是它的爬蟲還是比較小眾,僅有的庫也不足以算上簡單,而且代碼在各個編譯器上,甚至同一個編譯器上不同版本的兼容性不強,所以不是特別好用。所以今天主要介紹python爬蟲。

安裝requests庫

cmd運行:pip install requests ,安裝 requests。

然后在 IDLE 或者編譯器(個人推薦 VS Code 或者 Pycharm )上輸入

import requests 運行,如果沒有報錯,證明安裝成功。

安裝大部分庫的方法都是:pip install xxx(庫的名字)

requests的方法

requests.request()構造一個請求,支撐一下各方法的基本方法
requests.get()獲取HTML網頁的主要方法,對應于HTTP的GET

requests.head()

獲取HTML網頁頭信息的方法,對應于HTTP的HEAD

requests.post()向HTML網頁提交POST請求的方法,對應于HTTP的POST
requests.put()向HTML網頁提交PUT請求的方法,對應于HTTP的PUT
requests.patch( )向HTML網頁提交局部修改請求,對應于HTTP的PATCT
requests.delete()向HTML網頁提交刪除請求,對應于HTTP的DELETE

最常用的get方法

r = requests.get(url)

包括兩個重要的對象:

構造一個向服務器請求資源的Request對象;返回一個包含服務器資源的Response對象

r.status_codeHTTP請求的返回狀態(tài),200表示連接成功,404表示失敗
r.textHTTP響應內容的字符串形式,即,url對應的頁面內容
r.encoding從HTTP header中猜測的響應內容編碼方式(如果header中不存在charset,則認為編碼為ISO-8859-1)
r.apparent_encoding從內容中分析的響應內容編碼方式(備選編碼方式)
r.contentHTTP響應內容的二進制形式
requests.ConnectionError網絡連接錯誤異常,如DNS查詢失敗、拒絕連接等
requests.HTTPErrorHTTP錯誤異常
requests.URLRequiredURL缺失異常
requests.TooManyRedirects超過最大重定向次數,產生重定向異常
requests.ConnectTimeout連接遠程服務器超時異常
requests.Timeout請求URL超時,產生超時異常

爬蟲小demo

requests是最基礎的爬蟲庫,但是我們可以做一個簡單的翻譯

我先把我做的一個爬蟲的小項目的項目結構放上,完整源碼可以私聊我下載。

Python爬蟲代碼怎么寫

下面是翻譯部分的源碼

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() # 將服務器返回的內容直接處理成json => dict
resp.close()
dic_lenth = len(ch['data'])
for i in range(dic_lenth):
print("詞:"+ch['data'][i]['k']+" "+"單詞意思:"+ch['data'][i]['v'])

代碼詳解:

導入requests模塊,設置 url為百度翻譯網頁的網址。

Python爬蟲代碼怎么寫

然后通過 post 方法發(fā)送請求,再把返回的結果打成一個 dic (字典),但是這個時候我們打印出來結果發(fā)現是這樣的。

Python爬蟲代碼怎么寫

這是一個字典里套列表套字典的樣子,大概就是這樣的

{ xx:xx , xx:[ {xx:xx} , {xx:xx} , {xx:xx} , {xx:xx} ] }

我標紅的地方是我們需要的信息。

假如說我標藍色的列表里面有 n 個字典,我們可以通過 len() 函數獲取 n 的數值,

并使用 for 循環(huán)遍歷,得到結果。

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('h2')
   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')

以上就是關于“Python爬蟲代碼怎么寫”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI