爬蟲基本原理及urllib庫的基本使用

Hohaod發表於2019-03-21

爬蟲基本原理及urllib庫的基本使用

爬蟲的基本原理

爬蟲定義:請求網站並提取資料的自動化程式

1.能按作者要求下載資料或內容

2.能自動在網路上流竄

爬蟲的分類

1.通用爬蟲 (不分類)
2.專用爬蟲(聚焦爬蟲)(主講)

基本流程

1.發起請求 HTTP Request 請求方式:GET POST

2.獲取相應內容 HTTP Response

3.解析內容

4.儲存資料

Request

請求方式:GET POST
請求URL:全球統一的資源定位符 一個網頁文件 一張圖片 一個視訊 都可用URL唯一來確定
請求頭:頭部資訊 such as:User-Agent Host Cookies
請求體:請求時額外攜帶的資料

Response

狀態碼:(Status):200(成功) 301(跳轉) 404(找不到頁面) 502(伺服器錯誤)
響應頭:內容型別 內容長度 伺服器資訊 設定Cookie......
響應體:最主要的部分 包含了請求資源的內容 such as: 網頁HTML 圖片二進位制資料......

能抓取怎樣的資料

1.網頁文字:HTML文件 Json格式文字
2.圖片:獲取到的是二進位制檔案 儲存為圖片格式
3.視訊:同為二進位制檔案 儲存為視訊格式即可
4.其他

解析方式

1.直接處理
2.Json解析(Json格式)
3.正規表示式
4.BeautifulSoup
5.XPath
6.PyQuery

Urllib庫

Urllib庫是Python自帶的一個HTTP請求庫,包含以下幾個模組:

urllib.request 請求模組

urllib.error   異常處理模組

urllib.parse  url解析模組

urllib.robotparser   robots.txt解析模組

#urllib.request
複製程式碼
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
#呼叫decode()方法通過utf-8方式轉換為我們能讀懂的網頁程式碼
#GET



import urllib.parse
import urllib.request
d = byte(urllib.parse.urlencode({'name':'kobe'}), encoding = 'utf-8')
response = urllib.response.urlopen('http://www.baidu.com',data = d)
print(response.read().decode('utf-8'))
#POST



import socket
import urllib.request

try:
    response = urllib.request.urlopen('http://www.baidu.com',timeout = o.o1)
except urllib.error.UELError as e:
    if isinstance(e.reason,socket.timeout)
            print('Time Out')
#設定請求的超時時間



import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
print(response.status)#獲取狀態碼
print(response.getHeaders())#獲取響應頭的資訊 #列印一個元祖列表
print(response.getHeader('Server'))#



import urllib.request
import urllib.parse

url = 'http://httpbin.org/post'
headers = {
    'User-Agent':'......'
    'Host':'......'
}
dict = {'name':'kobe'}

data = bytes(parse.uelopen(dict),encoding = post)
req = request.Request(url = url,data =data,headers = deaders,method = post) # Request函式
response = request.urlopen(req)
print(response.read().decode('utf-8'))

# 當我們想傳遞request headers的時候 urlopen()無法支援 故需要這個新的方法

# 用Request方法進行POST請求並加入了請求頭





#urllib.error
import urllib.request
import urllib.error

try:
    response = request.urlopen('http://www.baidu.com')
except error.HTTPError as e:
    print(e.reason,e.code,e.header,sep = '\n')
except error.URLError as e:
    print(e.reason)
else:
    print('Request Successfully!')

# 從程式碼中可以看出 HTTPError是URLError的子類





#urllib.parse
from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment',scheme='https')
print(result)

# 拆分

# ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

# 拆分成對應的元組

# scheme引數提供一個預設值 當URL沒有協議資訊時 返回預設值

from urllib.parse import urlunparse

data = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))

# http://www.baidu.com/index.html;user?a=6#comment

from urllib.parse import urljoin

print(urljoin('http://www.baidu.com','index.html'))
print(urljoin('http://www.baidu.com#comment','?username="zhangsan"'))
print(urljoin('http://www.baidu.com','www.sohu.com'))

# http://www.baidu.com/index.html

# http://www.baidu.com?username="zhangsan"

# http://www.baidu.com/www.sohu.com

# 如果第二個引數是第一個引數中沒有的url組成部分 那將進行新增 否則進行覆蓋



from urllib.parse import urlencode

params = {
'name':'zhangsan',
'age':22    
} 
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)

# 'http://www.baidu.com?name=zhangsan&age=22'
複製程式碼

複製程式碼

相關文章