使用代碼模擬用戶,批量發送網絡請求,批量獲取數據。html
通用爬蟲是搜索引擎(Baidu、Google、Yahoo等)「抓取系統」的重要組成部分。python
主要目的是將互聯網上的網頁下載到本地,造成一個互聯網內容的鏡像備份。安全
簡單來說就是儘量的把互聯網上的全部的網頁下載下來,放到本地服務器裏造成備分,服務器
在對這些網頁作相關處理(提取關鍵字、去掉廣告),最後提供一個用戶檢索接口。網絡
聚焦爬蟲是根據指定的需求抓取網絡上指定的數據。ide
例如:獲取豆瓣上電影的名稱和影評,而不是獲取整張頁面中全部的數據值。網站
增量式是用來檢測網站數據更新的狀況,且能夠將網站更新的數據進行爬取。搜索引擎
robots協議也叫robots.txt(統一小寫)是一種存放於網站根目錄下的ASCII編碼的文本文件,它一般告訴網絡搜索引擎的漫遊器(又稱網絡蜘蛛),此網站中的哪些內容是不該被搜索引擎的漫遊器獲取的,哪些是能夠被漫遊器獲取的。
由於一些系統中的URL是大小寫敏感的,因此robots.txt的文件名應統一爲小寫。robots.txt應放置於網站的根目錄下。
若是想單獨定義搜索引擎的漫遊器訪問子目錄時的行爲,那麼能夠將自定的設置合併到根目錄下的robots.txt,或者使用robots元數據(Metadata,又稱元數據)。
robots協議並非一個規範,而只是約定俗成的,因此並不能保證網站的隱私。
簡單來講,robots決定是否容許爬蟲(通用爬蟲)抓取某些內容。編碼
注:聚焦爬蟲不遵照robots。url
eg:
大多數狀況下的需求,咱們都會指定去使用聚焦爬蟲,也就是爬取頁面中指定部分的數據值,而不是整個頁面的數據。
import urllib.request def load_data(): url = "http://www.baidu.com/" #GET請求 #http請求 #response:http響應對象 response = urllib.request.urlopen(url) print(response) load_data()
import urllib.request def load_data(): url = "http://www.baidu.com/" #GET請求 #http請求 #response:http響應對象 response = urllib.request.urlopen(url) print(response) #讀取內容 byte類型 data = response.read() print(data) load_data()
import urllib.request def load_data(): url = "http://www.baidu.com/" #GET請求 #http請求 #response:http響應對象 response = urllib.request.urlopen(url) #print(response) #讀取內容 byte類型 data = response.read() #print(data) #將文件獲取的內容轉換爲字符串 str_data = data.decode("UTF-8") print(str_data) load_data()
import urllib.request def load_data(): url = "http://www.baidu.com/" #GET請求 #http請求 #response:http響應對象 response = urllib.request.urlopen(url) #print(response) #讀取內容 byte類型 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) load_data()
注:
出於安全性,https請求的話將沒法打開,而http則能夠打開。
str_name = "baidu" bytes_name = str_name.encode("utf-8") print(str_name)
注:
python爬取的類型:str,bytes
若是爬取返回的是bytes類型:但寫入的時候須要字符串 => decode(「utf-8」);
若是爬取返回的是str類型:但寫入的時候須要bytes類型 => encode(「utf-8」).
import urllib.request def load_data(): url = "http://www.baidu.com/" #GET請求 #http請求 #response:http響應對象 response = urllib.request.urlopen(url) #print(response) #讀取內容 byte類型 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(str_name) load_data()
import urllib.request import urllib.parse import string def get_method_params(): url = "http://www.baidu.com/?wd=" #拼接字符串(漢字) name = "爬蟲" final_url = url + name #print(final_url) #代碼發送了請求 #網址裏面包含了漢字;ascii是沒有漢字的;URL轉義 #使用代碼發送網絡請求 #將包含漢字的網址進行轉義 encode_new_url = urllib.parse.quote(final_url, safe=string.printable) #response = urllib.request.urlopen(final_url) print(encode_new_url) #UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-16: ordinal not in range(128)
#針對報錯結合上一條註釋的解釋: #python是解釋性語言;解釋器只支持 ascii 0 - 127,即不支持中文!!! get_method_params()
import urllib.request import urllib.parse import string def get_method_params(): url = "http://www.baidu.com/?wd=" #拼接字符串(漢字) name = "爬蟲" final_url = url + name #print(final_url) #代碼發送了請求 #網址裏面包含了漢字;ascii是沒有漢字的;URL轉義 #將包含漢字的網址進行轉義 encode_new_url = urllib.parse.quote(final_url, safe=string.printable) response = urllib.request.urlopen(encode_new_url) print(response) #UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-16: ordinal not in range(128)
#針對報錯結合上一條註釋的解釋: #python是解釋性語言;解釋器只支持 ascii 0 - 127,即不支持中文!!! get_method_params()
import urllib.request import urllib.parse import string def get_method_params(): url = "http://www.baidu.com/?wd=" #拼接字符串(漢字) name = "爬蟲" final_url = url + name #print(final_url) #代碼發送了請求 #網址裏面包含了漢字;ascii是沒有漢字的;URL轉義 #將包含漢字的網址進行轉義 encode_new_url = urllib.parse.quote(final_url, safe=string.printable) response = urllib.request.urlopen(encode_new_url) print(response) #讀取內容 data = response.read().decode() print(data) #UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-16: ordinal not in range(128)
#針對報錯結合上一條註釋的解釋: #python是解釋性語言;解釋器只支持 ascii 0 - 127,即不支持中文!!! get_method_params()
import urllib.request import urllib.parse import string def get_method_params(): url = "http://www.baidu.com/?wd=" #拼接字符串(漢字) name = "爬蟲" final_url = url + name #print(final_url) #代碼發送了請求 #網址裏面包含了漢字;ascii是沒有漢字的;URL轉義 #將包含漢字的網址進行轉義 encode_new_url = urllib.parse.quote(final_url, safe=string.printable) response = urllib.request.urlopen(encode_new_url) print(response) #讀取內容 data = response.read().decode() print(data) #保存到本地 with open("encode_test.html", "w", encoding="utf-8")as f: f.write(data) #UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-16: ordinal not in range(128)
#針對報錯結合上一條註釋的解釋: #python是解釋性語言;解釋器只支持 ascii 0 - 127,即不支持中文!!! get_method_params()