urllib實現簡單的爬蟲

2021-09-18 04:08:46 字數 4315 閱讀 4967

url就是**的意思,而urllib是python自帶的用於操作**的標準庫,其中有request、parse、error、robotsparser四個模組,request用於開啟和讀取網頁,parse用於解析url,error用於處理異常(只有urlerror和httperror兩個函式),robotsparser用於讀取網頁的爬蟲協議(網頁用於規定哪些內容能爬,哪些不能)。

官方文件

要想爬取乙個**,第一步應該是訪問url,request模組提供了urlopen函式實現這個功能

urllib.request.urlopen(url, data=none, [timeout, ]*, cafile=none, capath=none, cadefault=false, context=none)

最值得關注的是前兩個引數:

data:傳送給服務端的引數,二進位制檔案,none表示不傳送引數

這兩個引數取決於傳送給服務端的是get請求還是post請求

這兩種請求的差別之一就是get請求把傳送給**的引數直接存在url裡,而post請求通過request body傳送引數,在這個函式裡可以將request body就是data引數

當你訪問網頁不傳遞引數時,只需將url設定成包含乙個**的字串

當你需要傳遞引數時,如果你想傳送get請求,就把url引數設定成乙個request物件,在request物件裡包含引數;如果你想傳送post請求,就把url設定成包含乙個**的字串,然後通過data物件傳送引數。

返回值:乙個httpresponse物件。

該物件儲存了服務端返回的資料,其中包括我們希望得到的回應的資訊

訪問有道翻譯示例

from urllib import request as rq

web_addr =

''with rq.urlopen(web_addr)

as response:

html = response.read(

)# 網頁的**

# print(html)

print

(html.decode(

"utf-8"

))

通過程式使用有道翻譯:
import urllib.request

import urllib.parse

import json

url = '' # 訪問的**

import urllib.request

import urllib.parse

import json

url =

''# 訪問的**

while

true

: content =

input

("請輸入需要翻譯的內容:\n"

) data =

data[

'i']

= content

data[

'from']=

'auto'

data[

'to']=

'auto'

data[

'smartresult']=

'dict'

data[

'doctype']=

'json'

data[

'version']=

'2.1'

data[

'keyfrom']=

'fanyi.web'

data[

'action']=

'fy_by_realtlme'

data[

'typoresult']=

'false'

data = urllib.parse.urlencode(data)

.encode(

'utf-8'

)# 把data轉換成二進位制

with urllib.request.urlopen(url, data)

as response:

html = response.read(

).decode(

"utf-8"

)# 返回的字串

print

(html)

target = json.loads(html)

# 將字串轉化為字典

print

("翻譯結果:"

, target[

'translateresult'][

0][0

]['tgt'],

'\n'

)

偽裝爬蟲

有些**不想讓爬蟲爬取自己的資料,就會做一些反爬蟲措施。

偽裝user agent

客戶端傳送請求時,傳送的httpheader裡存放了user agent,即使用者**,作為程式訪問網頁時,預設的引數會表明這是乙個python的程式而不是瀏覽器在訪問網頁,該**就會拒絕你的訪問。

但是urllib提供了方法修改user agent,這樣我們就可以將爬蟲偽裝成pc的瀏覽器或者移動端。

常見的user agent

2.firefox

mozilla/5.0 (windows nt 6.2; wow64; rv:21.0) gecko/20100101 firefox/21.0

mozilla/5.0 (android; mobile; rv:14.0) gecko/14.0 firefox/14.0

程式示例

from urllib import request

req = request.request(

'')req.add_header(

'user-agent',)

# 通過add_header方法將http頭設定成iphone 6

with request.urlopen(req)

as f:

print

('status:'

, f.status, f.reason)

for k, v in f.getheaders():

print

('%s: %s'

%(k, v)

)print

('data:'

, f.read(

).decode(

'utf-8'

))

該程式模擬成乙個iphone 6取訪問豆瓣首頁,得到的返回值是乙個適合iphone的網頁

使用**

如果訪問乙個網頁的頻率過高,網頁就有理由認為可能是乙個爬蟲在訪問。

我們可以通過**間接訪問想訪問的網頁,從而提高爬蟲的成功率。

request提供了多個函式實現這一功能:

urllib.request.proxyhandler(proxies=none)

urllib.request.build_opener([handler, …])

urllib.request.install_opener(opener)

程式示例
from urllib import request

import random

from urllib import parse

url = request.request(

'')url.add_header(

'user agent'

,'mozilla/5.0 (linux; android 4.0.4; galaxy nexus build/imm76b) '

)ip_list =

['150.109.55.190:83'

,'165.227.62.167:8080'

,'163.172.220.221:8888'

]# 從ip列表裡隨機選乙個ip,設定**的handler

proxy_support = request.proxyhandler(

)opener = request.build_opener(proxy_support)

# 建立乙個opener

request.install_opener(opener)

# 安裝opener

response = request.urlopen(url)

# 訪問網頁

print

(response.read(

).decode(

'utf-8'))

# 列印返回的html**

本文參考:

廖雪峰的python教程

小甲魚的爬蟲教程

基於urllib的簡單爬蟲

實戰隱藏 異常處理 scrapy 又稱為網頁蜘蛛,在網頁上獲取所需要的資訊。url lib urllib urllib 爬取網頁html 改為utf 8的編碼 print html 列印訊息體 print response.info 列印請求資訊 print response.getcode 列印請...

再學爬蟲 urllib

urllib是python內建的http請求庫,主要包括4個模組 request error parse robotparser。import urllib.request response urllib.request.urlopen print type response 結果,返回乙個http...

python爬蟲入門 用urllib實現百度翻譯

urllib.request.urlopen url,data none,timeout,cafile none,capath none,cadefault false,context none url不僅可以是乙個字串,例如 也可以是乙個request物件.urlopen 返回的物件,除了read...