Python 爬蟲學習稿(一)

2021-07-09 09:24:13 字數 4694 閱讀 8287

本次學習的環境是基於python 3.3.5,實驗的工具是pycharm 5.0.1

基礎的知識我就不再介紹,比如http的基礎知識、爬蟲的相關背景

直接開始爬蟲的學習吧!

常見的urllib2庫在python3.x的版本中改名啦!叫urllib.request了!

urlopen()可以接收三個引數即urlopen(url, data, timeout)

url即你要請求的url位址,data是訪問這個url需要傳送的資料,timeout是超時時間

url是必填引數,其餘兩個是可選引數

urllib.request.urlopen(url)會返回乙個http.client.httpresponse物件

這個返回的物件可以使用read()方法,來返回資料

# encoding: utf-8

import urllib.request

response = urllib.request

.urlopen("")

print(response.read())

這樣乙個指令碼就可以讓我們得到所填入的www.baidu.com這個**的網頁原始碼,你可以開啟瀏覽器,然後按下f12來對照看是不是一樣

如果我們不呼叫read這個方法,會列印出什麼呢?會列印出下面這樣一行

這樣就直接把這個物件的描述列印出來了,而不是具體內容了

根據我們的習慣,我們應該當傳入乙個request的例項,我們可以改寫上面的**為

# encoding: utf-8

import urllib.request

request = urllib.request.request("")

response = urllib.request.urlopen(request)

print(response.read())

這樣也是完全相同的效果,我們必須注意的是庫是區分大小寫的,request寫成request是不能被識別的,會報錯

這樣我們就完成了構建乙個request,然後得到伺服器對請求的應答,這樣更符合直觀的邏輯

需要說明的是,urllib.request.request()是統一處理所有url頭的方法,你可以直接使用也是可以的

web傳遞表單資料的常見方式有post和get兩種方式,我們可以構造乙個表單作為data,然後編碼成標準形式,作為引數傳遞給request物件

值得注意的是,編碼所使用的庫為urllib的函式而不是像之前的程式可以只引用乙個urllib2庫就可以了,python 3.x的版本和和之前的2.x的版本差距還是真大

遇到這個錯誤typeerror: post data should be bytes or an iterable of bytes. it cannot be of type str時,是需要在url編碼後再使用utf-8進行編碼,否則會出現這個型別錯誤。修改方法是)urllib.parse.urlencode(values).encode(encoding='utf8')

還必須指出的是,在python 2.x中所使用的urllib.urlencode並不存在了,只能使用urllib.parse.urlencode進行替換

**如下

# encoding: utf-8

import urllib

import urllib.request

value =

data = urllib.parse.urlencode(value).encode(encoding='utf8')

url = ""

request = urllib.request.request(url , data)

response = urllib.request.urlopen(request)

print(response.read())

你需要替換成乙個你可以登入的url位址,就可以進行測試了,或者你可以在本地自己搭建乙個最簡單的cgi指令碼來進行測試

上面這個方法是使用post來進行傳遞表單資料時,下面介紹get如何進行表單資料的傳送

# encoding: utf-8

import urllib

import urllib.request

value =

data = urllib.parse.urlencode(value).encode(encoding='utf8')

url = ""

geturl = url + "?" + data

request = urllib.request.request(geturl)

response = urllib.request.urlopen(request)

print(response.read())

python3對文字和二進位制資料作了更為清晰的區分。文字總是unicode,由str型別表示,二進位制資料則由bytes型別表示,二者不能混用。

所以你如果這樣執行的話,必然遇到錯誤typeerror: can't convert 'bytes' object to str implicitly因為此時的data是byte型的,而url是str型的,兩者不能連線起來的,需要把byte型的data轉換成str型

# encoding: utf-8

import urllib

import urllib.request

value =

data = urllib.parse.urlencode(value).encode(encoding='utf8')

url = ""

geturl = url + "?" + data.decode()

request = urllib.request.request(geturl)

response = urllib.request.urlopen(request)

print(response.read())

使用.decode()進行解碼,就能將byte型的data轉換成str型,geturl就統一為str型就可以進行連線了。這樣就可以成功執行了,只不過同上乙個一樣,你需要找乙個能夠成功的 url位址

所以我們修改乙個user-agent作為範例

# encoding: utf-8

import urllib

import urllib.request

user_agent = 'mozilla/4.0 (compatible; msie

5.5; windows

nt)'

value =

data = urllib.parse.urlencode(value).encode(encoding='utf8')

headers =

url = ""

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

response = urllib.request.urlopen(request)

print(response.read())

還可以繼續修改referer,這樣可以反反盜鏈

# encoding: utf-8

import urllib

import urllib.request

user_agent = 'mozilla/4.0 (compatible; msie

5.5; windows

nt)'

value =

data = urllib.parse.urlencode(value).encode(encoding='utf8')

headers =

url = ""

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

response = urllib.request.urlopen(request)

print(response.read())

timeout的設定,如果有的**響應速度過慢,可以通過設定timeout來避免無限制等待響應,之前也說過,urlopen的第三個引數就是timeout,顯式設定即可

有時候不得不使用**伺服器來避免乙個ip訪問請求過多遭到禁止,那麼如何設定**就是一門學問,這裡簡明寫個小例子

# encoding: utf-8

import urllib.request

enable_proxy = true

proxy_handler = urllib.request.proxyhandler()

null_proxy_handler = urllib.request.proxyhandler({})

if enable_proxy:

opener = urllib.request.build_opener(proxy_handler)

else:

opener = urllib.request.build_opener(null_proxy_handler)

urllib.request.install_opener(opener)

Python爬蟲學習稿(三)

一 資料結構 我們必須知道,乙個網頁上存在許多鏈結,並且如果已經爬取過的頁面是不需要再重複進行爬取的,那麼爬蟲就需要判斷,這個頁面是否曾經被爬取過 頁面上的這些鏈結爬取的順序 解決問題一 python自從2.3後提供了一種名為集合 set 的資料結構,和數學上的集合一樣,支援交 並 差等運算,set...

python 爬蟲學習一

爬取目標 為aspx 使用到了 viewstate eventvalidation cookie來驗證。使用beautifulsoup來解析網頁內容。encoding utf 8 from bs4 import beautifulsoup import urllib import urllib2 d...

python爬蟲學習(一)

簡單例子 抓取網頁全部內容後,根據正規表示式,獲取符合條件的字串列表 from urllib import request 正規表示式 import re url 讀取並解碼,針對中文 編碼是encode response request.urlopen url read decode print ...