爬蟲:模擬客戶端(浏覽器)發送網絡請求,接收請求返回的響應,一種按照一定的規則,自動地抓取互聯網信息的程序.
爬蟲流程:
常見的抓取方式
上述內容其實都對應各自的URL,是基於HTTP或HTTPS協議的,只要是這種數據,爬蟲都可以抓取。
有些網頁的HTML文本僅為空殼。
這是一個非常常見的問題。現在網頁越來越多地采用Ajax、前端模塊化工具來構建,整個網頁可能都是由JavaScript渲染出來的,也就是說原始的HTML代碼就是一個空殼。此時這種情況不能簡單的使用HTML庫。
""" 爬蟲流程: 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編碼
requets庫:基於urllib模塊實現。向服務器發送請求庫。
urllib模塊:它是Python內置的HTTP請求庫,不需要額外安裝即可使用。它包含如下4個模塊。(與requests區分開)
使用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方式。
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')
其中浏覽器信息可以在網頁中查找:
注意測試代碼時關閉代理服務器