python學習筆記分享(三十四)網絡爬蟲(1)

IT Xiao Ang Zai     2019年3月7號

版本:python3.7

編程軟件:Pycharm,Sublime Text 3

 

作者說明:之前向大家介紹過有關網絡爬蟲的東西,但知識比較分散,內容不算多,卻寫了很多文章。現在看來,有必要重新進行網絡爬蟲的總結了,我還會在之後配合python其他的有關知識以及js等網頁內容的講解,python大佬好多都是js大佬,兩者有很多相關的地方。本篇文章,是對之前文章的重新講解,希望大家有任何寶貴的意見,都可以提出來。

 

一:網頁簡單模塊urllib模塊爬取網頁源代碼

1.網絡爬蟲:簡單講,網絡爬蟲(又稱爲網頁蜘蛛),就是可以在互聯網上爬來爬去,捕獲我們所需要的資源,並存儲起來配合其他地方使用。

 

2.urllib模塊簡介

  (1)這個模塊是URl和lib兩個單詞共同構成的:URL就是網頁的地址,lib是library(庫)的縮寫。可以把這個模塊理解爲網頁地址庫。

  (2)URL的一般格式爲(帶方括號[]的爲可選項):protocol://hostname[port]/path/[;parameters][?query]#fragment。

  (3)URL的組成部分:

    a.協議部分(protocol):該URL的協議部分爲“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"後面的“//”爲分隔符。

    b.域名部分(hostname[port]):存放資源的服務器的域名系統(DNS)主機名(也可以使用IP地址作爲域名使用)。

    c.端口部分(post):跟在域名後面的是端口,域名和端口之間使用“:”作爲分隔符。端口不是一個URL必須的部分,如果省略端口部分,將採用默認端口80。

     d.虛擬目錄部分(path):從域名後的第一個“/”開始到最後一個“/”爲止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。

      e.文件名部分[;parameters?]:從域名後的最後一個“/”開始到“?”爲止,是文件名部分,如果沒有“?”,則是從域名後的最後一個“/”開始到“#”爲止,是文件部分,如果沒有“?”和“#”,那麼從域名後的最後一個“/”開始到結束,都是文件名部分。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名。

      f.錨部分(fragment):從“#”開始到最後,都是錨部分。錨部分也不是一個URL必須的部分。

      g.參數部分[query]:從“?”開始到“#”爲止之間的部分爲參數部分,又稱搜索部分、查詢部分,不包括?。參數可以允許有多個參數,參數與參數之間用“&”作爲分隔符。

  (4)python3版本把以前版本的urllib2模塊(對urllib的補充)等模塊合併成爲urllib,調用有時看到urllib2類似的代碼,可以用urllib模塊中的函數代替。

  (5)其實urllib裏面有很多模塊,相當於一個包。

  (6)我們代開python的參考文檔可以看到:

    

這裏可以看到,urllib是一個包,裏邊總共有四個模塊。一般第一個模塊是最複雜與最重要的,它包含了對服務器請求的發出,跳轉,代理和安全。

 

3.urllib模塊爬取網頁源碼

我們先來爬取一下網頁源碼,用urllib.request.urlopen()函數就可以訪問網頁了:


import urllib.request
response = urllib.request.urlopen("https://baike.baidu.com/item/%E4%B8%8A%E5%8F%A4%E5%8D%B7%E8%BD%B45%EF%BC%9A%E5%A4%A9%E9%99%85/353892?fromtitle=%E4%B8%8A%E5%8F%A4%E5%8D%B7%E8%BD%B45&fromid=290703&fr=aladdin")
html = response.read()
print(html)

效果如下:

我們發現它並不是HTML代碼,其實python爬取的內容是以utf-8編碼的bytes對象,上面有個b,表示這是一個bytes對象,要還原爲帶中文的html代碼,需要對其進行解碼,將它變成Unicode編碼:

html = html.decode("utf-8")
print(html)

效果如下:

 

4.實例講解

(1)下載一隻貓

網站:http://placekitten.com/這個網站在後面附上寬度和高度,就可以得到一張對應的圖片:

import urllib.request
response = urllib.request.urlopen("http://placekitten.com/408/287")
cat = response.read()
with open('E:\\小貓.jpg',"wb") as f:
    f.write(cat)

我們可以發現這張圖片被下載下來了:

其實,urlopen()的參數既可以是一個字符串也可以是Request對象,先把傳入的字符串轉換爲Request對象,然後再傳給urlopen函數。因此代碼也可以這樣寫:

req= urllib.request.Request("http://placekitten.com/408/287")
response = urllib.request.urlopen(req)

然後,urlopen()實際上是返回的一個類文件對象,可以用read()讀取內容。

(2)文檔告訴我們以下三個函數可能以後會用到:

  geturl() -------返回請求的url。

  info()    -------返回一個httplib.HTTPMessage對象,包括遠程服務器返回的頭信息。

  getcode() -------返回HTTP狀態碼。

(3)我們用類似的功能爬取其他圖片

代碼如下:

import urllib.request
req= urllib.request.Request("http://img1.gtimg.com/comic/pics/hv1/229/116/2084/135541909.jpg")
response = urllib.request.urlopen(req)
xiao = response.read()
with open('E:\\小美女.jpg',"wb") as f:
    f.write(xiao)

效果如下:

 

 

二:編碼簡介

中文編碼問題一直是程序員頭疼的問題,現在我們簡介一下字符編碼。

要徹底解決字符編碼的問題就不能不去了解到底什麼是字符編碼。計算機從本質上來說只認識二進制中的0和。

1.ASCII

現在我們如何讓英文,數字和符號被計算機認識。我們以英文爲例,英文中有英文字母(大小寫)、標點符號、特殊符號。如果我們將這些字母與符號給予固定的編號,然後將這些編號轉變爲二進制,那麼計算機明顯就能夠正確讀取這些符號,同時通過這些編號,計算機也能夠將二進制轉化爲編號對應的字符再顯示給人類去閱讀。由此產生了我們最熟知的ASCII碼。ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符。這樣在大部分情況下,英文與二進制的轉換就變得容易多了。

2.GB2312

然而,雖然計算機是美國人發明的,但是全世界的人都在使用計算機。現在出現了另一個問題:如何讓中文被計算機理解?ASCII 碼顯然沒辦法解決這個問題,爲了解決這個問題,中國國家標準總局1980年發佈《信息交換用漢字編碼字符集》提出了GB2312編碼,用於解決漢字處理的問題。1995年又頒佈了《漢字編碼擴展規範》(GBK)。GBK與GB 2312—1980國家標準所對應的內碼標準兼容,同時在字彙一級支持ISO/IEC10646—1和GB 13000—1的全部中、日、韓(CJK)漢字,共計20902字。這樣我們就解決了計算機處理漢字的問題了。

3.Unicode

現在英文和中文問題被解決了,但新的問題又出現了。全球有那麼多的國家不僅有英文、中文還有阿拉伯語、西班牙語、日語、韓語等等。難不成每種語言都做一種編碼?基於這種情況一種新的編碼誕生了:Unicode。Unicode又被稱爲統一碼、萬國碼;它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。Unicode支持歐洲、非洲、中東、亞洲(包括統一標準的東亞象形漢字和韓國表音文字)。這樣不管你使用的是英文或者中文,日語或者韓語,在Unicode編碼中都有收錄,且對應唯一的二進制編碼。這樣大家都開心了,只要大家都用Unicode編碼,那就不存在這些轉碼的問題了,什麼樣的字符都能夠解析了。

4.UTF-8

但是,由於Unicode收錄了更多的字符,可想而知它的解析效率相比ASCII碼和GB2312的速度要大大降低,而且由於Unicode通過增加一個高字節對ISO Latin-1字符集進行擴展,當這些高字節位爲0時,低字節就是ISO Latin-1字符。對可以用ASCII表示的字符使用Unicode並不高效,因爲Unicode比ASCII佔用大一倍的空間,而對ASCII來說高字節的0對他毫無用處。爲了解決這個問題,就出現了一些中間格式的字符集,他們被稱爲通用轉換格式,即UTF(Unicode Transformation Format)。而我們最常用的UTF-8就是這些轉換格式中的一種。在這裏我們不去研究UTF-8到底是如何提高效率的,你只需要知道他們之間的關係即可。

5.decode()方法將其他編碼字符轉化爲Unicode編碼字符。 
encode()方法將Unicode編碼字符轉化爲其他編碼字符。

總結:

1.處理英文字符,產生了ASCII碼。 
2.處理中文字符,產生了GB2312。 
3.處理各國字符,產生了Unicode。 
4.提高Unicode存儲和傳輸性能,產生了UTF-8,它是Unicode的一種實現形式。

 

三:查看網頁的編碼方式

我們在爬取網頁時需要該網頁是由什麼編碼的,那麼怎麼查看網頁的編碼方式呢,下面有幾種方法。

(1)使用瀏覽器審查元素,找到head標籤->chareset,就知道網頁是採用何種方式編碼的。

(2)自動獲取網頁編碼,可以導入第三方庫chardet,用chardet.detect()方法就可以判斷網頁的編碼了。

 

四:urlopen簡介

urlopen有兩個重要參數

1.urlopen的參數url

  (1)url不僅可以是一個字符串,也可以是一個Request對象,這就需要我們先定義一個Request對象,然後將這個Request對象作爲urlopen的參數使用。不過大部分直接調用urlopen()函數。

(2)urlopen()返回的對象,可以使用read()進行讀取,同樣也有geturl()、info()、getcode()方法。

 

2.url的data參數

(1)我們可以使用data參數,向服務器發送數據。根據HTTP規範,GET用於信息獲取,POST是向服務器提交數據的一種請求。

可以理解爲:

    從客戶端向服務器提交數據使用POST;

    從服務器獲得數據到客戶端使用GET(GET也可以提交,暫不考慮)。

    如果沒有設置urlopen()函數的data參數,HTTP請求採用GET方式,也就是我們從服務器獲取信息,如果我們設置data參數,HTTP請求採用POST方式,也就是我們向服務器傳遞數據。

(2)urllib.parse.urlencode()函數

data參數有自己的格式,它是一個基於application/x-www.form-urlencoded的格式,具體格式我們不用瞭解, 我們可以使用urllib.parse.urlencode()函數將字符串自動轉換成上面所說的格式。

 

 

五:有道翻譯爬蟲實例

1.我們先打開有道翻譯頁面,按照下面步驟:

(1)右鍵打開審查元素->Network

我們可以看到Name下面出現的內容,我們點擊一個並記住它的Request URL:

我們把Request URL和Form Data的內容記錄下來,一會要用到。

注:需要刪除真實請求地址Request URL中的_o。

(2)輸入下面代碼

# -*- coding: UTF-8 -*-
from urllib import request
from urllib import parse
import json
 
if __name__ == "__main__":
    Request_URL = 'http://fanyi.youdao.com/translate?smar'
    #創建Form_Data字典,存儲上圖的Form Data
    Form_Data = {}
    Form_Data['i'] = '小朋友'
    Form_Data['from'] = 'AUTO'
    Form_Data['to'] = 'AUTO'
    Form_Data['smartresult'] = 'dict'
    Form_Data['client'] = 'fanyideskweb'
    Form_Data['salt'] = '1536154689630'
    Form_Data['sign'] = 'cee2be9a62335b781133afa5d2f62c91'
    Form_Data['doctype'] = 'json'
    Form_Data['version'] = '2.1'
    Form_Data['keyfrom'] = 'fanyi.web'
    Form_Data['action'] = 'FY_BY_CLICKBUTTION'
    
    #使用urlencode方法轉換標準格式
    data = parse.urlencode(Form_Data).encode('utf-8')
    #傳遞Request對象和轉換完格式的數據
    response = request.urlopen(Request_URL,data)
    #讀取信息並解碼
    html = response.read().decode('utf-8')
    #使用JSON
    translate_results = json.loads(html)
    #找到翻譯結果
    translate_results = translate_results['translateResult'][0][0]['tgt']
    #打印翻譯信息
    print("翻譯的結果是:%s" % translate_results)

結果如下:

注:JSON是一種數據交換格式,我們如果可以從爬取到的內容中找到JSON格式的數據,是我們想要的,我們將得到的JSON格式的結果進行解析,就可以得到我們想要的數據。

 

2.網頁審查元素的使用(一)

(1)我們先進入有道詞典的官網:

我們使用瀏覽器的"審查元素"功能或檢查(qq瀏覽器)功能,切換到Network窗口,此時下面什麼都還沒有:

此時我們嘗試一下,輸入西瓜,我們會發現會攔截到許多文件,這些就是瀏覽器和客戶端的通信內容:

在客戶端和服務器之間進行請求-響應時,有兩種最常用到的方法是GET和POST。GET是從指定的服務器請求數據,而POST是向指定的服務器提交要被處理的數據(有時也用GET提交數據給服務器)。

(2)我們現在重新輸入西瓜

單擊有translate的選項,會出現如圖所示的頁面:

我們先選擇Headers選項卡,我們進一步分析裏面的內容:

在General下面有五個部分,是關於客戶端發出的請求(也稱爲Request),下面是對一些關鍵名詞的解釋:

Request URL:請求的鏈接地址

Request Method:請求的方法,這裏是POST

Status Code:狀態碼,200表示響應正常

Remote Address:服務器ip地址和端口

Referrer Policy:referrer常被用於分析用戶來源等信息。但是也有成爲用戶的一個不安全因素,比如有些網站直接將 sessionid 或是 token 放在地址欄裏傳遞的,會原樣不動地當作 Referrer 報頭的內容傳遞給第三方網站。

所以就有了Referrer Policy ,用於過濾 Referrer 報頭內容,目前是一個候選標準,不過已經有部分瀏覽器支持該標準


(3)在General下面我們還可以發現其他信息:

我們詳細講解一下:
a.Request Headers是客戶端發送請求的Headers,這個常常被服務器用來判斷是否來自"非人類"訪問。就指的是我們用程序來訪問,那樣服務器的壓力就會增大,因此一般服務器不歡迎"非人類"訪問。

一般服務器是通過這個User-Agent來識別,普通瀏覽器會通過該內容向訪問網站提供你所使用的瀏覽器類型等信息。

User-Agent:

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400

而使用python訪問的話,User-Agent會被定義爲Python-urllib/3.4。但是python是智能的,我們可以自定義它來讓瀏覽器不能判斷出我們是非人類訪問。

b.有的朋友可能會發現,下面還有個Form Data,這個就是POST提交的內容,我們可以發現,裏面有我們剛纔向服務器提交的西瓜:

我們就有了一個疑問,如何用python提交POST表單呢?其實是urlopen()函數有一個data參數,如果該這個參數賦值,那麼HTTP的請求就是使用POST方式;如果data的值是NULL,也就是默認值,那麼HTTP的請求就是使用GET方式。

c.有了以上兩個知識,我們嘗試來寫代碼:

import urllib.request
import urllib.parse
 
url = "http://fanyi.youdao.com/translate_o?smar"
data = {}
data['i'] = "西瓜"
data['from'] = "AUTO"
data['to'] = "AUTO"
data['smartresult'] = "dict"
data['client'] = "fanyideskweb"
data['salt'] = "1536413873985"
data['sign'] = "1ecd1c28f34d5ec21ab7352d60572d01"
data['doctype'] = "json"
data['version'] = "2.1"
data['keyfrom'] = "fanyi.web"
data['action'] = "FY_BY_CLICKBUTTION"
data['typoResult'] = "false"
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
print(html)

我們可以發現得到了如下的信息:

字符串在python內部的表示是Unicode編碼,因此,需要做一下編碼轉換,通常需要以Unicode作爲中間編碼,即先將返回的bytes對象的數據解碼(decode)成Unicode,再以Unicode編碼(encode)成另一種編碼。

其實返回的是一個JOSN格式的字符串(JSON是一種輕量級的數據交換格式,我們可以理解成用字符串把Pythpn的數據結構封裝起來),下面只需要解析這個JOSN格式的字符串即可。
下面我們來完善一下代碼:

import urllib.request
import urllib.parse
import json
 
findText = input("請輸入翻譯的內容:")
url = "http://fanyi.youdao.com/translate?smar"
data = {}
data['i'] = findText
data['from'] = "AUTO"
data['to'] = "AUTO"
data['smartresult'] = "dict"
data['client'] = "fanyideskweb"
data['salt'] = "1536413873985"
data['sign'] = "1ecd1c28f34d5ec21ab7352d60572d01"
data['doctype'] = "json"
data['version'] = "2.1"
data['keyfrom'] = "fanyi.web"
data['action'] = "FY_BY_CLICKBUTTION"
data['typoResult'] = "false"
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
result = json.loads(html)
print("%s翻譯爲英文爲:%s" % (findText,(result['translateResult'][0][0]['tgt'])))

效果如下:

當使用的次數多時,服務端會識別出該來源是非人類,會把你屏蔽,在大批量爬取時,不建議採取該方法。

 

 

六:反爬蟲處理

有些網站不喜歡被程序訪問,它們會檢查訪問的來源,如果識別出來訪問的來源不是正常的路徑,就會屏蔽你的訪問,但是我們可以改進我們的代碼,讓瀏覽器誤認爲我們是正常的訪問。

下面是一些方法:

1.修改User-Agent

我們查看User-Agent的文檔可以發現,裏面詳細講解了Request有一個headers參數,通過設置這個參數,我們可以誤讓瀏覽器認爲我們是正常的訪問。設置這個參數有兩種途徑:實例化Request對象的時候將headers參數傳入進去,或者通過add_header()方法向Request對象添加headers。
(1)第一種方法是實例化Request對象的時候將headers參數傳入進去,它要求headers必須是一個字典的形式

代碼如下:

import urllib.request
import urllib.parse
import json
 
findText = input("請輸入翻譯的內容:")
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
head = {}
head['Referer'] = 'http://fanyi.youdao.com'
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
                     'Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400'
data = {}
data['i'] = findText
data['from'] = "AUTO"
data['to'] = "AUTO"
data['smartresult'] = "dict"
data['client'] = "fanyideskweb"
data['salt'] = "1536413873985"
data['sign'] = "45d4bc7902bf704c8adc6d27f5081a55"
data['doctype'] = "json"
data['version'] = "2.1"
data['keyfrom'] = "fanyi.web"
data['action'] = "FY_BY_CLICKBUTTION"
data['typoResult'] = "false"
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url,data,head)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
result = json.loads(html)
print("%s翻譯爲英文爲:%s" % (findText,(result['translateResult'][0][0]['tgt'])))
print(req.headers)

(2)還有另外一種方法,就是在Request對象生成之後,用add_header()方法追加進去

代碼如下:

import urllib.request
import urllib.parse
import json
 
findText = input("請輸入翻譯的內容:")
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
data = {}
data['i'] = findText
data['from'] = "AUTO"
data['to'] = "AUTO"
data['smartresult'] = "dict"
data['client'] = "fanyideskweb"
data['salt'] = "1536413873985"
data['sign'] = "45d4bc7902bf704c8adc6d27f5081a55"
data['doctype'] = "json"
data['version'] = "2.1"
data['keyfrom'] = "fanyi.web"
data['action'] = "FY_BY_CLICKBUTTION"
data['typoResult'] = "false"
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url,data)
req.add_header('Referer','http://fanyi.youdao.com')
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                            'Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400')
response = urllib.request.urlopen(req)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
result = json.loads(html)
print("%s翻譯爲英文爲:%s" % (findText,(result['translateResult'][0][0]['tgt'])))
print(req.headers)

 

2.通過修改User-Agen實現隱藏,這是最簡單的一種可以"欺騙瀏覽器"的方法。但是瀏覽器還是會識別出我們的程序,它用一個記錄每個IP的訪問頻率的方法,在單位時間內,如果訪問頻率超過了一個閾值,便認爲我們可能是用爬蟲來進行的,這時它會要求用戶填寫一個驗證碼,我們的爬蟲程序當然不能夠寫驗證碼,於是就被屏蔽了。

我們針對這種情況,有兩種容易實現的方法。

(1)延遲提交數據

我們可以延遲提交數據,用time模塊來實現:

import urllib.request
import urllib.parse
import json
import time
 
while True:
    findText = input("請輸入yes/no:")
    if findText == 'no':
        break
    else:
        findText = input("請輸入要翻譯的內容:")
        url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
        data = {}
        data['i'] = findText
        data['from'] = "AUTO"
        data['to'] = "AUTO"
        data['smartresult'] = "dict"
        data['client'] = "fanyideskweb"
        data['salt'] = "1536413873985"
        data['sign'] = "45d4bc7902bf704c8adc6d27f5081a55"
        data['doctype'] = "json"
        data['version'] = "2.1"
        data['keyfrom'] = "fanyi.web"
        data['action'] = "FY_BY_CLICKBUTTION"
        data['typoResult'] = "false"
        data = urllib.parse.urlencode(data).encode('utf-8')
        req = urllib.request.Request(url,data)
        req.add_header('Referer','http://fanyi.youdao.com')
        req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                'Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400')
        response = urllib.request.urlopen(req)
        response = urllib.request.urlopen(req)
        html = response.read().decode('utf-8')
        result = json.loads(html)
        print("%s翻譯爲英文爲:%s" % (findText,(result['translateResult'][0][0]['tgt'])))
        time.sleep(10)

但是這樣做會使程序的工作效率大大降低。

(2)使用代理

我們可以把需要訪問的網址告訴代理,讓代理替你訪問,然後再轉給你。服務器看到的是代理的IP地址,不是你的IP地址,這樣,就會讓服務器不能識別出是否是人類訪問。

我們可以把需要訪問的網址告訴代理,讓代理替你訪問,然後再轉給你。服務器看到的是代理的IP地址,不是你的IP地址,這樣,就會讓服務器不能識別出是否是人類訪問。

使用代理的步驟如下:

(1)proxy_support = urllib.request.ProxyHandler({})

它的參數是一個字典,字典的鍵是代理的類型,例如http,ftp或https,字典的值就是代理的IP地址和對應的端口號。

(2)opener = urllib.request.build_opener(proxy_support)

我們可以把這個opener看作是一個私人定製,當使用urlopen()函數打開一個網頁的時候,就是使用默認的opener在工作。

而這個opener是可以定製的,我們可以給它定製特殊的headers,或者給它定製指定的代理IP,用build_opener()函數創建我們的私人定製。

(3)urllib.request.install_opener(opener)

我們可以用這個方法把我們定製好的opener安裝到系統中。之後,我們只需要用普通的urlopen()函數,就可以使用我們定製好的opener進行工作,如果你不想替換我們默認的opener,你可以在每次有特殊需要的時候,用opener.open()方法打開網頁。

我們搜索"代理IP"可以獲得一個免費的代理IP地址(這裏我們使用211.138.121.38:80),通過訪問http://www.whatismyip.com.tw可以查看當前的IP。

代碼如下:

import urllib.request
 
url = "http://www.whatismyip.com.tw/"
proxy_support = urllib.request.ProxyHandler({'http':'211.138.121.38:80'})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)

 

在之後的文章中會詳細講解有關爬蟲的正則表達式的內容,歡迎大家評論與交流。

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