http中的一些基本名詞
requestheader — 請求頭裏面
response — 返回數據
Accept — 文本格式
Accept-Encoding— 編碼格式
Connection— 長鏈接 短連接
Cookie— 驗證用的
Host— 域名
Referer— 標誌從哪個頁面跳轉過來的
User-Agent— 瀏覽器和用戶的信息
爬蟲的基本原理
- 確認你抓取目標的url是哪一個(找)
- 使用python代碼發送請求獲取數據(java、Go)
- 解析獲取到的數據(精確數據)–找到新的目標(url)回到第一步(自動化)
- 數據持久化
- request(第三方)
- 數據解析:xpath bs4
- 數據存儲
爬取百度源碼
import urllib.request
def load_data():
url = "http://www.baidu.com/"
#get的請求
#http請求
#response:http相應的對象
response = urllib.request.urlopen(url)
print(response) #<http.client.HTTPResponse object at 0x000002046E55AF08>
#讀取內容 bytes類型
data = response.read()
print(data)#打印出了整個網頁的源碼(無格式)
#將文件獲取的內容轉換成字符串
str_data = data.decode("utf-8")
print(str_data) #打印出了整個網頁的源碼(有格式)
#將數據寫入文件
with open("baidu.html","w",encoding="utf-8")as f:
f.write(str_data)
#將字符串類型轉換成bytes
# str_name = "baidu"
# bytes_name =str_name.encode("utf-8")
# print(bytes_name)
#python爬取的類型:str bytes
#如果爬取回來的是bytes類型:但是你寫入的時候需要字符串 decode("utf-8")
#如果爬取過來的是str類型:但你要寫入的是bytes類型 encode(""utf-8")
load_data()
爬取包含漢字的網頁
import urllib.request
import urllib.parse
import string
def get_method_params():
url = "http://www.baidu.com/s?wd="
#拼接字符串(漢字)
#python可以接受的數據
#https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3
name = "美女"
final_url = url+name
print(final_url)
#代碼發送了請求
#網址裏面包含了漢字;ascii是沒有漢字的;url轉譯
#將包含漢字的網址進行轉譯
encode_new_url = urllib.parse.quote(final_url,safe=string.printable)
print(encode_new_url)
# 使用代碼發送網絡請求
response = urllib.request.urlopen(encode_new_url)
print(response)
#讀取內容
data = response.read().decode()
print(data)
#保存到本地
with open("02-encode.html","w",encoding="utf-8")as f:
f.write(data)
#UnicodeEncodeError: 'ascii' codec can't encode
# characters in position 10-11: ordinal not in range(128)
#python:是解釋性語言;解析器只支持 ascii 0 - 127
#不支持中文
get_method_params()
爬取字典參數的網頁
import urllib.request
import urllib.parse
import string
def get_params():
url = "http://www.baidu.com/s?"
params = {
"wd":"中文",
"key":"zhang",
"value":"san"
}
#將字典中的冒號變爲等號
str_params = urllib.parse.urlencode(params)
print(str_params)
#wd=%E5%A4%A7%E6%95%B0%E6%8D%AE&key=zhang&value=san
final_url = url+str_params
#將帶有中文的url 轉譯成計算機可以識別的url
end_url = urllib.parse.quote(final_url,safe=string.printable)
response = urllib.request.urlopen(end_url)
data = response.read().decode("utf-8")
print(data)
# 將數據寫入文件
with open('zhangsan.html', 'w', encoding='utf-8')as f:
f.write(data)
get_params()
知識點總結
python爬取的類型:str和bytes
如果爬取回來的是bytes類型:但是你寫入的時候需要字符串 decode(“utf-8”)
#將bytes類型轉換成字符串
byte_name = b"baidu"
print(byte_name)#b'baidu'
bytes_name =byte_name.decode("utf-8")
print(bytes_name)#baidu
如果爬取過來的是str類型:但你要寫入的是bytes類型 encode("“utf-8”)
#將字符串類型轉換成bytes
str_name = "baidu"
bytes_name =str_name.encode("utf-8")
print(bytes_name)
將數據寫入文件
with open("baidu.html","w",encoding="utf-8")as f:
#baidu.html是要寫入的文件名,自動創建
f.write(data)
將包含漢字的網址進行轉譯
#網站拼接(以下兩個包必須有)
import urllib.parse
#import urllib 這樣寫也不可以
import string
url = "http://www.baidu.com/s?wd="
name = "美女"
final_url = url+name
print(final_url)#http://www.baidu.com/s?wd=美女
#網址裏面包含了漢字;ascii是沒有漢字的;url轉譯
#python:是解釋性語言;解析器只支持 ascii 0 - 127
#不支持中文
#將包含漢字的網址進行轉譯
encode_new_url = urllib.parse.quote(final_url,safe=string.printable)
print(encode_new_url) # http://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3
將冒號變爲等號
import urllib.request
import urllib.parse
import string
url = "http://www.baidu.com/s?"
params = {
"wd":"中文",
"key":"zhang",
"value":"san"
}
# 將字典中的冒號變爲等號
str_params = urllib.parse.urlencode(params)
print(str_params) #wd=%E5%A4%A7%E6%95%B0%E6%8D%AE&key=zhang&value=san
final_url = url+str_params
#將帶有中文的url 轉譯成計算機可以識別的url
end_url = urllib.parse.quote(final_url,safe=string.printable)
print(end_url)