Python入妖3-----Urllib庫的基本使用

什麼是Urllib

Urllib是python內置的HTTP請求庫
包括如下模塊
urllib.request 請求模塊
urllib.error 異常處理模塊
urllib.parse url解析模塊
urllib.robotparser robots.txt解析模塊php

urlopen

關於urllib.request.urlopen參數的介紹:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)html

url參數的使用

先寫一個簡單的例子:python

import urllib.request  
''''' 
Urllib 模塊提供了讀取web頁面數據的接口,咱們能夠像讀取本地文件同樣讀取www和ftp上的數據 
urlopen 方法用來打開一個url 
read方法 用於讀取Url上的數據 
'''

response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))

urlopen通常經常使用的有三個參數,它的參數以下:
urllib.requeset.urlopen(url,data,timeout)
response.read()能夠獲取到網頁的內容,若是沒有read(),將返回一個object對象web

data參數的使用

上述的例子是經過請求百度的get請求得到百度,下面使用urllib的post請求
這裏經過http://httpbin.org/post網站演示(該網站能夠做爲練習使用urllib的一個站點使用,能夠
模擬各類請求操做)。ajax

import urllib.parse
import urllib.request

data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
print(data)
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())

這裏就用到urllib.parse,經過bytes(urllib.parse.urlencode())能夠將post數據進行轉換放到urllib.request.urlopen的data參數中。這樣就完成了一次post請求。
因此若是咱們添加data參數的時候就是以post請求方式請求,若是沒有data參數就是get請求方式瀏覽器

timeout參數的使用

在某些網絡狀況很差或者服務器端異常的狀況會出現請求慢的狀況,或者請求異常,因此這個時候咱們須要給
請求設置一個超時時間,而不是讓程序一直在等待結果。例子以下:服務器

import urllib.request

response = urllib.request.urlopen('http://httpbin.org/get', timeout=1)
print(response.read())

運行以後咱們看到能夠正常的返回結果,接着咱們將timeout時間設置爲0.1
運行程序會提示以下錯誤cookie

 

因此咱們須要對異常進行抓取,代碼更改成網絡

import socket
import urllib.request
import urllib.error

try:
    response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason, socket.timeout):
        print('TIME OUT')   #給個異常處理

響應

響應類型、狀態碼、響應頭負載均衡

import urllib.request

response = urllib.request.urlopen('https://www.python.org')
print(type(response))

能夠看到結果爲:<class 'http.client.httpresponse'="">
咱們能夠經過response.status、response.getheaders().response.getheader("server"),獲取狀態碼以及頭部信息
response.read()得到的是響應體的內容

import urllib.request

response = urllib.request.urlopen('https://www.python.org')
print(type(response)) 
print(response.status)  # 狀態碼 200
print(response.getheaders())  # 頭部信息
print(response.getheader("server"))     # 過濾頭部信息server

固然上述的urlopen只能用於一些簡單的請求,由於它沒法添加一些header信息,若是後面寫爬蟲咱們能夠知道,不少狀況下咱們是須要添加頭部信息去訪問目標站的,這個時候就用到了urllib.request

Request

設置Headers

有不少網站爲了防止程序爬蟲爬網站形成網站癱瘓,會須要攜帶一些headers頭部信息才能訪問,最長見的有user-agent參數

寫一個簡單的例子:

import urllib.request

request = urllib.request.Request('https://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

給請求添加頭部信息,從而定製本身請求網站是時的頭部信息

from urllib import request, parse

url = 'http://httpbin.org/post'
headers = {
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    'Host': 'httpbin.org'
}
dict = {
    'name': 'zhaofan'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

 添加請求頭的第二種方式

from urllib import request, parse

url = 'http://httpbin.org/post'
dict = {
    'name': 'Germey'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, method='POST')
req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

這種添加方式有個好處是本身能夠定義一個請求頭字典,而後循環進行添加

高級用法各類handler       代理,ProxyHandler

經過rulllib.request.ProxyHandler()能夠設置代理,網站它會檢測某一段時間某個IP 的訪問次數,若是訪問次數過多,它會禁止你的訪問,因此這個時候須要經過設置代理來爬取數據

import urllib.request

proxy_handler = urllib.request.ProxyHandler({
    'http': 'http://127.0.0.1:9743',
    'https': 'https://127.0.0.1:9743'
})
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('http://httpbin.org/get')
print(response.read())

cookie,HTTPCookiProcessor

cookie中保存中咱們常見的登陸信息,有時候爬取網站須要攜帶cookie信息訪問,這裏用到了http.cookijar,用於獲取cookie以及存儲cookie

import http.cookiejar,urllib.request
cookie
= http.cookiejar.CookieJar() handler = urllib.request.HTTPCookieProcessor opener = urllib.request.build_opener(handler) response = opener.open('http://www.baidu.com') for item in cookie: print(item.name+"="+item.value)

同時cookie能夠寫入到文件中保存,有兩種方式

http.cookiejar.MozillaCookieJar()

http.cookiejar.LWPCookieJar()

固然你本身用哪一種方式均可以

具體代碼例子以下:
http.cookiejar.MozillaCookieJar()方式

保存

import http.cookiejar, urllib.request
filename
= "cookie.txt" cookie = http.cookiejar.MozillaCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) response = opener.open('http://www.baidu.com') cookie.save(ignore_discard=True, ignore_expires=True)

一樣的若是想要經過獲取文件中的cookie獲取的話能夠經過load方式,固然用哪一種方式寫入的,就用哪一種方式讀取。

獲取

import http.cookiejar, urllib.request

cookie = http.cookiejar.MozillaCookieJar()    # 哪一種寫入的用哪一種方式讀取
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

異常處理

在不少時候咱們經過程序訪問頁面的時候,有的頁面可能會出現錯誤,相似404,500等錯誤
這個時候就須要咱們捕捉異常,下面先寫一個簡單的例子

from urllib import request,error

try:
    response = request.urlopen("http://pythonsite.com/1111.html")
except error.URLError as e:
    print(e.reason)

 

上述代碼訪問的是一個不存在的頁面,經過捕捉異常,咱們能夠打印異常錯誤

這裏咱們須要知道的是在urllb異常這裏有兩個個異常錯誤:
URLError,HTTPError

HTTPError是URLError的子類

URLError裏只有一個屬性:reason,即抓異常的時候只能打印錯誤信息,相似上面的例子

HTTPError裏有三個屬性:code,reason,headers,即抓異常的時候能夠得到code,reson,headers三個信息,例子如

from urllib import request,error
try:
    response = request.urlopen("http://pythonsite.com/1111.html")
except error.HTTPError as e:
    print(e.reason)
    print(e.code)
    print(e.headers)
except error.URLError as e:
    print(e.reason)

else:
    print("reqeust successfully")

 

同時,e.reason其實也能夠在作深刻的判斷,例子以下:

import socket

from urllib import error,request

try:
    response = request.urlopen("http://www.pythonsite.com/",timeout=0.001)
except error.URLError as e:
    print(type(e.reason))
    if isinstance(e.reason,socket.timeout):
        print("time out")

 

URL解析

urlparse

The URL parsing functions focus on splitting a URL string into its components, or on combining URL components into a URL string.

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

功能一:

from urllib.parse import urlparse

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

結果爲:

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

這裏就是能夠對你傳入的url地址進行拆分
同時咱們是能夠指定協議類型:
result = urlparse("www.baidu.com/index.html;user?id=5#comment",scheme="https")
這樣拆分的時候協議類型部分就會是你指定的部分,固然若是你的url裏面已經帶了協議,你再經過scheme指定的協議就不會生效

urlunpars

其實功能和urlparse的功能相反,它是用於拼接,例子以下:

from urllib.parse import urlunparse

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

結果爲:

http://www.baidu.com/index.html;user?a=123#commit

urljoin

這個的功能實際上是作拼接的,例子以下:

from urllib.parse import urljoin

print(urljoin('http://www.baidu.com', 'FAQ.html'))
print(urljoin('http://www.baidu.com', 'https://pythonsite.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://pythonsite.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://pythonsite.com/FAQ.html?question=2'))
print(urljoin('http://www.baidu.com?wd=abc', 'https://pythonsite.com/index.php'))
print(urljoin('http://www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu.com#comment', '?category=2'))

結果爲:

從拼接的結果咱們能夠看出,拼接的時候後面的優先級高於前面的url

urlencode
這個方法能夠將字典轉換爲url參數,例子以下

from urllib.parse import urlencode

params = {
    "name":"zhaofan",
    "age":23,
}
base_url = "http://www.baidu.com?"

url = base_url+urlencode(params)
print(url)

 結果爲:

 

 項目實例

1、urllib庫

  概念:urllib是Python自帶的一個用於爬蟲的庫,其主要做用就是能夠經過代碼模擬瀏覽器發送請求。其常被用到的子模塊在Python3中的爲urllib.request和urllib.parse,在Python2中是urllib和urllib2。

     使用流程:

  • 指定url
  • 基於urllib的request子模塊發起請求
  • 獲取響應中的數據值
  • 持久化存儲

2、由易到難的爬蟲程序

一、第一個簡單的爬蟲程序:爬取搜狗首頁的頁面數據

import urllib.request
import urllib.parse

#1.指定url
url = 'https://www.sogou.com/'
#2.發起請求:使用urlopen函數發起請求,該函數返回一個響應對象
response = urllib.request.urlopen(url=url)
#3.獲取響應對象中的頁面數據:read函數能夠獲取響應對象中byte類型的數據值
page_text = response.read()
#4.持久化存儲:將爬取的頁面數據寫入文件進行保存
with open('./sogou.html','w',encoding='utf-8') as fp:
    fp.write(page_text.decode())#使用decode將page_text轉成字符串類型
View Code

 

補充書名:

urlopen函數原型:
    urllib.request.urlopen(url, data=None, timeout=<object object at 0x10af327d0>, *, cafile=None, capath=None, cadefault=False, context=None)

在上述案例中咱們只使用了該函數中的第一個參數url。在平常開發中,咱們能用的只有url和data這兩個參數。

url參數:指定向哪一個url發起請求
data參數:能夠將post請求中攜帶的參數封裝成字典的形式傳遞給該參數(暫時不須要理解,後期會講)

urlopen函數返回的響應對象,相關函數調用介紹:
response.headers():獲取響應頭信息
response.getcode():獲取響應狀態碼
response.geturl():獲取請求的url
response.read():獲取響應中的數據值(字節類型)
View Code

 

二、二進制數據的爬蟲:爬取網絡上的某張圖片數據,且存儲到磁盤

import urllib.request
import urllib.parse

#1.指定url
url = 'https://pic.qiushibaike.com/system/pictures/12112/121121212/medium/ZOAND29U4NKNEWEF.jpg'
#2.發起請求:使用urlopen函數發起請求,該函數返回一個響應對象
response = urllib.request.urlopen(url=url)
#3.獲取響應對象中的圖片二進制類型的數據
img_data = response.read()
#4.持久化存儲:將爬取的圖片寫入本地進行保存
with open('./tupian.png','wb') as fp:
    fp.write(img_data)
方法1

 

import urllib.request
import urllib.parse

url = 'https://pic.qiushibaike.com/system/pictures/12112/121121212/medium/ZOAND29U4NKNEWEF.jpg'
# 函數原型:urllib.request.urlretrieve(url, filename=None)
# 做用:對url發起請求,且將響應中的數據值寫入磁盤進行存儲
urllib.request.urlretrieve(url=url,filename='./img.png')
方法2

 

三、url的特性:

url必須爲ASCII編碼的數據值。因此咱們在爬蟲代碼中編寫url時,若是url中存在非ASCII編碼的數據值,則必須對其進行ASCII編碼後,該url方可被使用。

案例:爬取使用搜狗根據指定詞條搜索到的頁面數據(例如爬取詞條爲‘周杰倫’的頁面數據)

import urllib.request
import urllib.parse
url = 'https://www.sogou.com/web?query=周杰倫'
response = urllib.request.urlopen(url=url)
data = response.read()
with open('./周杰倫.html','wb') as fp:
    fp.write(data)
print('寫入文件完畢')

#【注意】上述代碼中url存在非ascii編碼的數據,則該url無效。若是對其發起請求,則會報以下錯誤:
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-17: ordinal not in range
query=周杰倫,直接漢字報錯

 

import urllib.request
import urllib.parse
url = 'https://www.sogou.com/web?query=%s'
#對url中的非ascii進行編碼.quote函數能夠對非ascii的數據值進行ascii的編碼
word = urllib.parse.quote('周杰倫')
#將編碼後的數據值拼接回url中
url = format(url%word)
response = urllib.request.urlopen(url=url)
data = response.read()
with open('./周杰倫.html','wb') as fp:
    fp.write(data)
print('寫入文件完畢')
方法 1:使用quote函數

 

import urllib.request
import urllib.parse
url = 'https://www.sogou.com/web?'
#將get請求中url攜帶的參數封裝至字典中
param = {
    'query':'周杰倫'
}
#對url中的非ascii進行編碼
param = urllib.parse.urlencode(param)
#將編碼後的數據值拼接回url中
url += param 
response = urllib.request.urlopen(url=url)
data = response.read()
with open('./周杰倫1.html','wb') as fp:
    fp.write(data)
print('寫入文件完畢')
方法2: 使用urlencode函數

 

四、經過自定義請求對象,用於假裝爬蟲程序請求的身份。

  以前在講解http經常使用請求頭信息時,咱們講解過User-Agent參數,簡稱爲UA,該參數的做用是用於代表本次請求載體的身份標識。若是咱們經過瀏覽器發起的請求,則該請求的載體爲當前瀏覽器,則UA參數的值代表的是當前瀏覽器的身份標識表示的一串數據。若是咱們使用爬蟲程序發起的一個請求,則該請求的載體爲爬蟲程序,那麼該請求的UA爲爬蟲程序的身份標識表示的一串數據。有些網站會經過辨別請求的UA來判別該請求的載體是否爲爬蟲程序,若是爲爬蟲程序,則不會給該請求返回響應,那麼咱們的爬蟲程序則也沒法經過請求爬取到該網站中的數據值,這也是反爬蟲的一種初級技術手段。那麼爲了防止該問題的出現,則咱們能夠給爬蟲程序的UA進行假裝,假裝成某款瀏覽器的身份標識。

  上述案例中,咱們是經過 request模塊中的 urlopen發起的請求,該請求對象爲 urllib中內置的默認請求對象,咱們沒法對其進行UA進行更改操做。urllib還爲咱們提供了一種自定義請求對象的方式,咱們能夠經過自定義請求對象的方式,給該請求對象中的UA進行假裝(更改)操做。

import urllib.request
import urllib.parse
url = 'https://www.sogou.com/web?'
#將get請求中url攜帶的參數封裝至字典中
param = {
    'query':'周杰倫'
}
#對url中的非ascii進行編碼
param = urllib.parse.urlencode(param)
#將編碼後的數據值拼接回url中
url += param 

#封裝自定義的請求頭信息的字典:
#將瀏覽器的UA數據獲取,封裝到一個字典中。該UA值能夠經過抓包工具或者瀏覽器自帶的開發者工具中獲取某請求,從中獲取UA的值
#注意:在headers字典中能夠封裝任意的請求頭信息
headers={
    'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
    }
#自定義請求對象,能夠在該請求對象中添加自定義的請求頭信息
request = urllib.request.Request(url=url,headers=headers)
#使用自定義請求對象發起請求
response = urllib.request.urlopen(request)
data = response.read()
with open('./周杰倫.html','wb') as fp:
    fp.write(data)
View Code

 

五、攜帶參數的post請求:

案例:百度翻譯發起post請求

import urllib.request
import urllib.parse
#經過抓包工具抓取post請求的url
post_url='https://fanyi.baidu.com/sug'
#封裝post請求參數
data={
    "kw":"dog"
}
data=urllib.parse.urlencode(data)
#自定義請求頭信息字典
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
}

#自定義請求對象,而後將封裝好的post請求參數賦值給Requst方法的data參數。
#data參數:用來存儲post請求的參數
request=urllib.request.Request(post_url,data=data.encode(),headers=headers)
#自定義的請求對象中的參數(data必須爲bytes類型)
response=urllib.request.urlopen(request)
response.read()
View Code

 

3、urllib模塊的高級操做

一、代理

  • 什麼是代理:代理就是第三方代替本體處理相關事務。例如:生活中的代理:代購,中介,微商......
  • 爬蟲中爲何須要使用代理?

  一些網站會有相應的反爬蟲措施,例如不少網站會檢測某一段時間某個IP的訪問次數,若是訪問頻率太快以致於看起來不像正常訪客,它可能就會會禁止這個IP的訪問。因此咱們須要設置一些代理IP,每隔一段時間換一個代理IP,就算IP被禁止,依然能夠換個IP繼續爬取。

代理的分類:

  正向代理:代理客戶端獲取數據。正向代理是爲了保護客戶端防止被追究責任。

  反向代理:代理服務器提供數據。反向代理是爲了保護服務器或負責負載均衡。

import urllib.request
import urllib.parse

#1.建立處理器對象,在其內部封裝代理ip和端口
handler=urllib.request.ProxyHandler(proxies={'http':'95.172.58.224:52608'})
#2.建立opener對象,而後使用該對象發起一個請求
opener=urllib.request.build_opener(handler)

url='http://www.baidu.com/s?ie=UTF-8&wd=ip'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}

request = urllib.request.Request(url, headers=headers)

#使用opener對象發起請求,該請求對應的ip即爲咱們設置的代理ip
response = opener.open(request)

with open('./daili.html','wb') as fp:
    fp.write(response.read())
View Code

 

二、cookie

引言:有些時候,咱們在使用爬蟲程序去爬取一些用戶相關信息的數據(爬取張三「人人網」我的主頁數據)時,若是使用以前requests模塊常規操做時,每每達不到咱們想要的目的,例如:

import urllib.request
import urllib.parse
#指定url
url = 'http://www.renren.com/289676607/profile'
#自定義請求頭信息
headers={
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
#自定義請求對象
request = urllib.request.Request(url=url,headers=headers)
#發起請求
response = urllib.request.urlopen(request)

with open('./renren.html','w') as fp:
    fp.write(response.read().decode())
View Code

 

【注意】上述代碼中,咱們爬取到的是登陸首頁面,而不是張三的我的主頁也面。why?首先咱們來回顧下cookie的相關概念及做用

cookie概念:當用戶經過瀏覽器首次訪問一個域名時,訪問的web服務器會給客戶端發送數據,以保持web服務器與客戶端之間的狀態保持,這些數據就是cookie。

cookie做用:咱們在瀏覽器中,常常涉及到數據的交換,好比你登陸郵箱,登陸一個頁面。咱們常常會在此時設置30天內記住我,或者自動登陸選項。那麼它們是怎麼記錄信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服務器設置的,保存在瀏覽器中,但HTTP協議是一種無狀態協議,在數據交換完畢後,服務器端和客戶端的連接就會關閉,每次交換數據都須要創建新的連接。就像咱們去超市買東西,沒有積分卡的狀況下,咱們買完東西以後,超市沒有咱們的任何消費信息,但咱們辦了積分卡以後,超市就有了咱們的消費信息。cookie就像是積分卡,能夠保存積分,商品就是咱們的信息,超市的系統就像服務器後臺,http協議就是交易的過程。 

通過cookie的相關介紹,其實你已經知道了爲何上述案例中爬取到的不是張三我的信息頁,而是登陸頁面。那應該如何抓取到張三的我的信息頁呢?

思路

  一、咱們須要使用爬蟲程序對人人網的登陸時的請求進行一次抓取,獲取請求中的cookie數據  

  二、在使用我的信息頁的url進行請求時,該請求須要攜帶 1 中的cookie,只有攜帶了cookie後,服務器纔可識別此次請求的用戶信息,方可響應回指定的用戶信息頁數據

cookiejar對象:
    - 做用:自動保存請求中的cookie數據信息
    - 注意:必須和handler和opener一塊兒使用
cookiejar使用流程:
    - 建立一個cookiejar對象
      import http.cookiejar
      cj = http.cookiejar.CookieJar()
    - 經過cookiejar建立一個handler
      handler = urllib.request.HTTPCookieProcessor(cj)
    - 根據handler建立一個opener
      opener = urllib.request.build_opener(handler)
    - 使用opener.open方法去發送請求,且將響應中的cookie存儲到openner對象中,後續的請求若是使用openner發起,則請求中就會攜帶了cookie
View Code

 

使用 cookiejar實現爬取人人網我的主頁頁面數據:

#使用cookiejar實現人人網的登錄
import urllib.request
import urllib.parse
import http.cookiejar
cj = http.cookiejar.CookieJar() #請求中的cookie會自動存儲到cj對象中
#建立處理器對象(攜帶cookiejar對象的)
handler=urllib.request.HTTPCookieProcessor(cj)
#建立opener對象 (攜帶cookiejar對象)
opener=urllib.request.build_opener(handler)

#要讓cookiejar獲取請求中的cookie數據值
url='http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201873958471'
#自定義一個請求對象,讓該對象做爲opener的open函數中的參數
data={
    "email":"www.zhangbowudi@qq.com",
    "icode":"",
    "origURL":"http://www.renren.com/home",
    "domain":"renren.com",
    "key_id":"1",
    "captcha_type":"web_login",
    "password":"40dc65b82edd06d064b54a0fc6d202d8a58c4cb3d2942062f0f7dd128511fb9b",
    "rkey":"41b44b0d062d3ca23119bc8b58983104",
  
 'f':"https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DpPKf2680yRLbbZMVdntJpyPGwrSk2BtpKlEaAuKFTsW%26wd%3D%26eqid%3Deee20f380002988c000000025b7cbb80"
}
data=urllib.parse.urlencode(data).encode()
request=urllib.request.Request(url,data=data)
opener.open(request)

#獲取當前用戶的二級子頁面
s_url='http://www.renren.com/289676607/profile'
#該次請求中就攜帶了cookie
resonse=opener.open(s_url)

with open('./renren.html','wb') as fp:
    fp.write(resonse.read())
View Code
相關文章
相關標籤/搜索