網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動的抓取全球資訊網資訊的程式或者指令碼。
網路爬蟲必備知識點
1. Python基礎知識
2. Python中urllib和urllib2庫的用法
3. Python正規表示式的使用
4. python Beautiful Soup的用法
5. Python爬蟲框架Scrapy
網站瀏覽網頁的過程
網頁實質是由 HTML 程式碼構成的,爬蟲爬來的便是這些內容,通過分析和過濾這些 HTML 程式碼,實現對圖片、文字等資源的獲取
URL
資源定位符,也就是我們說的網址,統一資源定位符是對可以從網際網路上得到的資源的位置和訪問方法的一種簡潔的表示,是網際網路上標準資源的地址。網際網路上的每個檔案都有一個唯一的URL,它包含的資訊指出檔案的位置以及瀏覽器應該怎麼處理它
URL的格式由三部分組成:
①第一部分是協議(或稱為服務方式)。
②第二部分是存有該資源的主機IP地址(有時也包括埠號)。
③第三部分是主機資源的具體地址,如目錄和檔名等。
爬蟲爬取資料時必須要有一個目標的URL才可以獲取資料,因此,它是爬蟲獲取資料的基本依據.
urllib,Urllib2庫的基本使用
在python中,抓取網頁的庫是urllib2
# 例子,爬取百度主頁的html程式碼
import urllib2 response = urllib2.urlopen('http://www.baidu.com/') html = response.read() print (html)
# urlopen的用法
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,cafile=None, capath=None, cadefault=False, context=None):
第一個引數為url,第二個為要傳送的資料,第三個是超時時間。其餘的一般不用
# 構造一個Request類,作為引數傳入urlopen中,使Request類中就包含url,data,timeout等內容
import urllib2 request = urllib2.Request('http://www.baidu.com/') response = urllib2.urlopen(request) print (response.read())
POST和GET資料傳送解析
資料傳送分為POST和GET兩種方式。
區別是GET方式是直接以連結形式訪問,連結中包含了所有的引數,當然如果包含了密碼的話是一種不安全的選擇,不過你可以直觀地看到自己提交了什麼內容。POST則不會在網址上顯示所有的引數
1. post 方式
# 例子,實現了POST方式的傳送
import urllib import urllib2 values = {"username":"1337047412@qq.com","password":"123456"} data = urllib.urlencode(values) url = "http://mail.163.com/" request = urllib2.Request(url,data) response = urllib2.urlopen(request) print (response.read())
2. get 方式
GET方式可以直接把引數寫到網址上面,直接構建一個帶引數的URL
# 例子
import urllib import urllib2 values = {} values["username"] = "1337047412@qq.com" values["password"] = "123456" data = urllib.urlencode(values) url = "http://mail.163.com/" geturl = url + "?" + data print (geturl) # http://mail.163.com/?username=1337047412%40qq.com&password=123456 request = urllib2.Request(geturl) response = urllib2.urlopen(request) print (response.read())
設定headers屬性,完全模擬瀏覽器工作
# 構建headers屬性
headers = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', 'Referer':'http://mail.163.com/' }
Proxy(代理)的設定
urllib2 預設會使用環境變數 http_proxy 來設定 HTTP Proxy
# 例子
import urllib2 enable_proxy = True proxy_handler = urllib2.ProxyHandler({"http":"http://some-proxy.com:8080"}) null_proxy_handler = urllib2.ProxyHandler({}) if enable_proxy: opener = urllib2.build_opener(proxy_handler) else: opener = urllib2.build_opener(null_proxy_handler) urllib2.install_opener(opener)
timeout 設定
# imeout的設定,可以設定等待多久超時,為了解決一些網站實在響應過慢而造成的影響
import urllib2 response = urllib2.urlopen("http://www.baidu.com",timeout=10)
HTTP 的 PUT 和 DELETE 方法
# http協議有六種請求方法,get,head,put,delete,post,options
PUT和POST極為相似,都是向伺服器傳送資料,但它們之間有一個重要區別,PUT通常指定了資源的存放位置,而POST則沒有,POST的資料存放位置由伺服器自己決定
DELETE:刪除某一個資源
# 例子
import urllib2 request = urllib2.Request(url,data=data) request.get_method = lambda:"PUT" # or "DELETE" response = urllib2.urlopen(request)