python爬蟲基礎-urllib, urllib2

最簡單的爬蟲
import urllib
import urllib.request
# 爬蟲時候,url最後加上反斜槓
url = 'http://www.baidu.com/'
response = urllib.request.urlopen(url = url)
# 打印response中的數據
content = response.read().decode('utf-8')
print(content)
通過cookie獲取需要登錄的網頁數據

chrome瀏覽器導出cookies的方法
F12打開開發者工具,找到console頁面,輸入document.cookie既可以查看。複製出來即可。

import urllib
import urllib.request

url = 'https://www.douban.com/people/179269614/'

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36',
    'Cookie':'bid=5-DeBkrEntA; __yadk_uid=yTgX50BX14IpZZRIcyEEDS3Uxqch7gMe'
}

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

print(response.read().decode('utf-8'))
post 請求
from django.test import TestCase

# Create your tests here
import urllib
import urllib.request
import urllib.parse
import json

url = 'http://fanyi.baidu.com/sug'

key = input('請輸入翻譯的漢字:')
# k = urllib.parse.quote(key)

params = {'kw':key}
print(params)

# 將params轉化爲url格式
params = urllib.parse.urlencode(params).encode('utf-8')
print(params)  # 'kw=%E8%8A%B1'

response = urllib.request.urlopen(url= url,data=params)

content = response.read().decode('utf-8')

content_ = json.loads(content)

print(content,content_)

urllib and urllib2 區別 (https://blog.csdn.net/jenrey/article/details/81102521)

urllib和urllib2模塊都做與請求URL相關的操作,但他們提供不同的功能。
urllib2.urlopen accepts an instance of the Request class or a url, (whereas urllib.urlopen only accepts a url 中文意思就是:urllib2.urlopen可以接受一個Request對象或者url,(在接受Request對象時候,並以此可以來設置一個URL 的headers),urllib.urlopen只接收一個url
urllib 有urlencode, urllib2沒有,這也是爲什麼總是urllib,urllib2常會一起使用的原因

urllib2

I. urllib2模塊定義的函數和類用來獲取URL(主要是HTTP的),他提供一些複雜的接口用於處理: 基本認證,重定向,Cookies等。 II. 常用方法和類 II.1 urllib2.urlopen(url[, data][, timeout]) #傳url時候,用法同urllib裏的urlopen II.1.1 它打開URL網址,url參數可以是一個字符串url或者是一個Request對象。可選的參數timeout,阻塞操作以秒爲單位,如嘗試連接(如果沒 有指定,將使用設置的全局默認timeout值)。實際上這僅適用於HTTP,HTTPS和FTP連接。

url = ‘http://m.sohu.com/?v=3&_once_=000025_v2tov3&_smuid=ICvXXapq5EfTpQTVq6Tpz‘
resp = urllib2.urlopen(url)
page = resp.read()

II.1.2 urlopen方法也可通過建立了一個Request對象來明確指明想要獲取的url。調用urlopen函數對請求的url返回一個response對 象。這個response類似於一個file對象,所以用.read()函數可以操作這個response對象

   url = ‘http://m.sohu.com/?v=3&_once_=000025_v2tov3&_smuid=ICvXXapq5EfTpQTVq6Tpz‘
   req = urllib2.Request(url)
   resp = urllib2.urlopen(req)

II.2 class urllib2.Request(url[, data][, headers][, originreqhost][, unverifiable])
II.2.1 Request類是一個抽象的URL請求。
5個參數的說明如下:
II.2.1.1 URL——是一個字符串,其中包含一個有效的URL。
II.2.1.2 data——是一個字符串,指定額外的數據發送到服務器,如果沒有data需要發送可以爲“None”。目前使用data的HTTP請求是唯一的。當請求 含有data參數時,HTTP的請求爲POST,而不是GET。數據應該是緩存在一個標準的application/x-www-form- urlencoded格式中。urllib.urlencode()函數用映射或2元組,返回一個這種格式的字符串。通俗的說就是如果想向一個URL發送 數據(通常這些數據是代表一些CGI腳本或者其他的web應用)。例如在網上填的form(表單)時,瀏覽器會POST表單的內容,這些數據需要被以標準 的格式編碼(encode),然後作爲一個數據參數傳送給Request對象。Encoding是在urlib模塊中完成的,而不是在urlib2中完成 的。下面是個例子:

import urllib
import urllib2
url = ‘http://www.someserver.com/cgi-bin/register.cgi‘values = {‘name‘ : ‘Michael Foord‘,       ‘location‘ : ‘Northampton‘,       ‘language‘ : ‘Python‘ }
data = urllib.urlencode(values)      
req = urllib2.Request(url, data)   #send post
response = urllib2.urlopen(req)
page = response.read()

總結

如果只是單純的下載或者顯示下載進度,不對下載後的內容做處理等,比如下載圖片,css,js文件等,可以用urlilb.urlretrieve()
如果是下載的請求需要填寫表單,輸入賬號,密碼等,建議用urllib2.urlopen(urllib2.Request())
在對字典數據編碼時候,用到的是urllib.urlencode()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章