廖雪峯爬蟲第一節

http中的一些基本名詞

requestheader — 請求頭裏面
response — 返回數據
Accept — 文本格式
Accept-Encoding— 編碼格式
Connection— 長鏈接 短連接
Cookie— 驗證用的
Host— 域名
Referer— 標誌從哪個頁面跳轉過來的
User-Agent— 瀏覽器和用戶的信息

爬蟲的基本原理

  1. 確認你抓取目標的url是哪一個(找)
  2. 使用python代碼發送請求獲取數據(java、Go)
  3. 解析獲取到的數據(精確數據)–找到新的目標(url)回到第一步(自動化)
  4. 數據持久化
  5. request(第三方)
  6. 數據解析:xpath bs4
  7. 數據存儲

爬取百度源碼

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章