《爬蟲學習》(二)(urllib庫使用)


urllib庫是Python中一個最基本的網絡請求庫。可以模擬瀏覽器的行為,向指定的服務器發送一個請求,並可以保存服務器返回的數據。

1.urlopen函數:

Python3urllib庫中,所有和網絡請求相關的方法,都被集到urllib.request模塊下面了,以先來看下urlopen函數基本的使用:

from urllib import request resp = request.urlopen('http://www.baidu.com') print(resp.read()) 

實際上,使用瀏覽器訪問百度,右鍵查看源代碼。你會發現,跟我們剛才打印出來的數據是一模一樣的。也就是說,上面的三行代碼就已經幫我們把百度的首頁的全部代碼爬下來了。一個基本的url請求對應的python代碼真的非常簡單。
以下對urlopen函數的進行詳細講解:

    1. url:請求的url。
    2. data:請求的data,如果設置了這個值,那么將變成post請求。
    3. 返回值:返回值是一個http.client.HTTPResponse對象,這個對象是一個類文件句柄對象。有read(size)readlinereadlines以及getcode等方法。

2.urlretrieve函數:

這個函數可以方便的將網頁上的一個文件保存到本地。以下代碼可以非常方便的將百度的首頁下載到本地:

from urllib import request

request.urlretrieve('http://www.baidu.com/','baidu.html')

 

3.編碼解碼urlencode函數/parse_qs函數:

urlencode函數

用瀏覽器發送請求的時候,如果url中包含了中文或者其他特殊字符,那么瀏覽器會自動的給我們進行編碼。而如果使用代碼發送請求,那么就必須手動的進行編碼,這時候就應該使用urlencode函數來實現。urlencode可以把字典數據轉換為URL編碼的數據。示例代碼如下:

from urllib import parse data = {'name':'爬蟲基礎','greet':'hello world','age':100} qs = parse.urlencode(data) print(qs)

parse_qs函數:

可以將經過編碼后的url參數進行解碼。示例代碼如下:

from urllib import parse qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100" print(parse.parse_qs(qs))


4.urlpares函數/urlsplit函數:

有時候拿到一個url,想要對這個url中的各個組成部分進行分割,那么這時候就可以使用urlparse或者是urlsplit來進行分割。示例代碼如下:

from urllib import request,parse url = 'http://www.baidu.com/s?username=zhiliao' result = parse.urlsplit(url) # result = parse.urlparse(url) print('scheme:',result.scheme) print('netloc:',result.netloc) print('path:',result.path) print('query:',result.query) 

urlparseurlsplit基本上是一模一樣的。唯一不一樣的地方是,urlparse里面多了一個params屬性,而urlsplit沒有這個params屬性。比如有一個url為:url = 'http://www.baidu.com/s;hello?wd=python&username=abc#1'
那么urlparse可以獲取到hello,而urlsplit不可以獲取到。url中的params也用得比較少。

5.request.Request函數:

如果想要在請求的時候增加一些請求頭,那么就必須使用request.Request類來實現。比如要增加一個User-Agent,示例代碼如下:

from urllib import request headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36' } req = request.Request("http://www.baidu.com/",headers=headers) resp = request.urlopen(req) print(resp.read())

6.代理器設置(ProxyHandler):

很多網站會檢測某一段時間某個IP的訪問次數(通過流量統計,系統日志等),如果訪問次數多的不像正常人,它會禁止這個IP的訪問。
所以我們可以設置一些代理服務器,每隔一段時間換一個代理,就算IP被禁止,依然可以換個IP繼續爬取。
urllib中通過ProxyHandler來設置使用代理服務器,下面代碼說明如何使用自定義opener來使用代理:

from urllib import request # 這個是沒有使用代理的 # resp = request.urlopen('http://httpbin.org/get') # print(resp.read().decode("utf-8")) # 這個是使用了代理的 handler = request.ProxyHandler({"http":"218.66.161.88:31769"}) opener = request.build_opener(handler) req = request.Request("http://httpbin.org/ip") resp = opener.open(req) print(resp.read())



代碼:
from urllib import request
from urllib import parse
#resp = request.urlopen('https://www.sohu.com')打開

#print(resp.readlines())

#resp = request.urlretrieve('http://www.jd.com', 'jd.html')下載

# 編碼
# infomation = {'name':'張三', 'age':18, 'code':'niu'}
# result = parse.urlencode(infomation)
# print(result)

# url = "http://www.sogou.com"
# par = {'query':'武佩齊'}
# qs = parse.urlencode(par)
# url = url + "/web?" +qs
# request.urlretrieve(url, '1.html')

# 解碼
# infomation = {'name':'張三', 'age':18, 'code':'niu'}
# qs = parse.urlencode(infomation)
# res = parse.parse_qs(qs)
# print(res)

#解析
# url = 'http://www.baidu.com/s?wd=python&username=jd#1'
#
# result = parse.urlparse(url)
# print(result.netloc)
# result = parse.urlsplit(url)
# print(result)

# 實戰
# url = 'https://search.bilibili.com/all?keyword=opencv&from_source=nav_search_new'
# head = {
#     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400',
#     'Referer': 'https://www.bilibili.com/'
#
# }
# data = {
#     'first':'true',
#     'pn':1,
#     'kd':'opencv'
# }
#
# req = request.Request(url, headers=head,data=parse.urlencode(data).encode('utf-8'), method='GET')
# resp = request.urlopen(req)
# print(resp.read().decode('utf-8'))

# 代理服務器
# 沒有使用代理
# url = 'http://www.httpbin.org/ip'
# resp = request.urlopen(url)
# print(resp.read())
# 使用代理
# url = 'http://www.httpbin.org/ip'
# # 1.使用request.ProxyHandler創建hander
# hander = request.ProxyHandler({"http":"125.123.137.33:9999"})
# # 2.使用request.build_opener創建opener,通過hander
# opener = request.build_opener(hander)
# # 3.使用opener進行open連接
# resp = opener.open(url)
# print(resp.read())

 

補充:Cookie:

  在網站中,http請求是無狀態的。也就是說即使第一次和服務器連接后並且登錄成功后,第二次請求服務器依然不能知道當前請求是哪個用戶。cookie的出現就是為了解決這個問題,第一次登錄后服務器返回一些數據(cookie)給瀏覽器,然后瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB。因此使用cookie只能存儲一些小量的數據。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM