程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python-爬蟲(基礎概念、常見請求模塊(urllib、requests))

編輯:Python

文章目錄

  • 1.基礎概念
  • 2.測試爬蟲流程
  • 3.爬蟲常見請求模塊(uellib、requests)
    • Ⅰurllib
    • Ⅱ requests

1.基礎概念

爬蟲:模擬客戶端(浏覽器)發送網絡請求,接收請求返回的響應,一種按照一定的規則,自動地抓取互聯網信息的程序.

爬蟲流程:

  1. 獲取url。
  2. 向url發送請求,並且獲取相應。
  3. 從相應中獲取url,並且持續獲取相應。
  4. 從響應中提取數據並保存。

常見的抓取方式

  1. 在網頁中我們能看到各種各樣的信息,最常見的便是常規網頁,它們對應著HTML.代碼,而最常抓取的便是HTML源代碼。
  2. 有些網頁返回的不是HTMIL代碼,而是一個JSON字符串(其中API接口大多采用這樣的形式),這種格式的數據方便傳輸和解析,它們同樣可以抓取,而且數據提取更加方便。
  3. 各種二進制數據,如圖片、視頻和音頻等。利用爬蟲,我們可以將這些二進制數據抓取下來,然後保存成對應的文件名。
  4. 還可以看到各種擴展名的文件,如CSS、JavaScript和配置文件等,這些其實也是最普通的文件,只要在浏覽器裡面可以訪問到,就可以將其抓取下來。

上述內容其實都對應各自的URL,是基於HTTP或HTTPS協議的,只要是這種數據,爬蟲都可以抓取。

有些網頁的HTML文本僅為空殼。
這是一個非常常見的問題。現在網頁越來越多地采用Ajax、前端模塊化工具來構建,整個網頁可能都是由JavaScript渲染出來的,也就是說原始的HTML代碼就是一個空殼。此時這種情況不能簡單的使用HTML庫。

2.測試爬蟲流程

""" 爬蟲流程: 1. 獲取url。 2. 向url發送請求,並且獲取相應。 3. 從相應中獲取url,並且持續獲取相應。 4. 從響應中提取數據並保存。 """
import requests
# 獲取url
url = 'https://www.baidu.com/'
# 向url發送HTTP請求
response = requests.get(url)
# 從響應中提取數據並保存。
print(response) # <Response [200]>
# print(response.text) 出現亂碼
print(response.content.decode()) # 解決亂碼,decode默認utf-8編碼

3.爬蟲常見請求模塊(uellib、requests)

requets庫:基於urllib模塊實現。向服務器發送請求庫。

Ⅰurllib

urllib模塊:它是Python內置的HTTP請求庫,不需要額外安裝即可使用。它包含如下4個模塊。(與requests區分開)

  1. request:它是最基本的HTTP請求模塊,可以用來模擬發送請求。需要給庫方法傳入URL以及額外的參數,就可以模擬實現這個過程了。
  2. error:異常處理模塊,如果出現請求錯誤,可以捕獲這些異常,然後進行重試或其他操作以保證程序不會意外終止。
  3. parse:一個工具模塊,提供了許多URL處理方法,比如拆分、解析、合並等。
  4. robotparser:主要是用來識別網站的 robots.txt文件,然後判斷哪些網站可以爬,哪些網站不可以爬,用得比較少。

使用urllib的 request模塊,可以方便地實現請求的發送並得到響應。下面是具體用法。

urlopen:
urllib.request模塊提供了最基本的構造HITP請求的方法,利用它可以模擬浏覽器的一個請求發起過程,同時它還帶有處理授權驗證(authentication)、重定向(redirection)、浏覽器Cookies 以及其他內容。

使用方法:

import urllib.request
url = 'https://www.baidu.com/'
response = urllib.request.urlopen(url)
print(response.read().decode('utf-8'))
print(type(response))


可以看出返回的是一個http客戶端相應類。

這個類有自己的方法,主要包含read、readinto、getheader、getheaders、fileno等方法,和msg、version、status、reason、debuglevel、closed等屬性。

如果需要向請求報文中添加信息,可以修改函數的data參數

注意:
data參數是可選的。如果要添加該參數,需要使用bytes方法將參數轉化為字節流編碼格式的內容,即 bytes類型。另外,如果傳遞了這個參數,則它的請求方式就不再是 GET方式,而是 POST方式。

Ⅱ requests

urllib這個庫已經很久了,requests庫封裝了urllib庫,使用更簡單。基本使用如下圖

import requests
import webbrowser # 自動打開網頁
key = input('輸入查詢內容')
print(key)
url = 'https://www.baidu.com/s?wd=' + key
# 系統信息,浏覽器信息
headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers)
html = response.content.decode('utf-8')
with open('baidu-copy.html', 'w', encoding='utf-8') as file:
file.write(html)
webbrowser.open('baidu-copy.html')

其中浏覽器信息可以在網頁中查找:

注意測試代碼時關閉代理服務器


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved