爬蟲的基本原理和基本庫使用
爬蟲簡單來說就是擷取網頁并提取和儲存資訊的自動化程式。
擷取網頁
擷取網頁的源代碼:向網站的伺服器發送一個請求,傳回的響應體便是網頁源代碼。
提取資訊
分析網頁源代碼,從中提取我們想要的資料。最通用的方式便是采用正規表達式提取
儲存資料
将提取到的資料儲存到某處以便以後使用
自動化程式
利用爬蟲代替我們完成這份爬取工作的自動化程式
爬蟲過程中遇到的一些情況:比如403錯誤,打開網頁一看,可能會看到"您的ip通路頻率過高"這樣提示,是因為網站采用了一些反爬蟲的措施,這個時候我們可以使用代理,所謂的代理,就是代理伺服器,就是一個網絡資訊的中轉站,正常請求一個網站的時候,是發送給web伺服器,web伺服器吧響應傳回給我們,如果我們設定了代理伺服器,就相當于本機和伺服器之間搭了一座橋,本機向代理伺服器發送請求,再由代理伺服器發送給Web伺服器。再由代理伺服器把web伺服器傳回的響應轉發本機,這樣我們就實作了IP僞裝
網上免費代理比較多,但最好篩選一下可用代理,付費的品質會比免費代理好很多
然後我們正式來開始學習爬蟲的一些基本使用庫(python3環境),這裡我們用的是pycharm軟體
使用urllib
Urlopen
Urllib.request子產品提供了最基本的構造HTTP請求的方法,可以利用它模拟浏覽器一個請求發起的過程,這裡我們以python官網為例
import urllib.requestresponse=urllib.request.urlopen('https://www.python.org')print(response.read().decode('utf-8'))
這樣我們就完成了python官網的抓取
2.Type
然後我們可以用type()方法輸出響應的類型
import urllib.requestresponse=urllib.request.urlopen('https://www.python.org')print(type(response))
可以發現他是一個HTTPResponse類型對象,主要包含read(),readinto(),getheader(name),getheaders()等方法。
我們可以把它指派為response變量,然後就可以調用這些方法和屬性,得到傳回結果的一系列資訊了
例如:
import urllib.requestresponse=urllib.request.urlopen('https://www.python.org')print(response.status)
傳回200代表請求成功,在本篇文章末尾會有一張狀态碼表,可以進行對照
import urllib.requestresponse=urllib.request.urlopen('https://www.python.org')print(response.getheaders())
輸出響應的狀态碼和響應的頭資訊import urllib.requestresponse=urllib.request.urlopen('https://www.python.org')print(response.getheader('Server'))
傳遞了一個server值擷取了響應頭中的server值,傳回的意思是伺服器用nginx搭建的
如果想給連結傳一些參數:
DATA參數:如果添加該函數,需要使用byte()方法将參數轉化為位元組流編碼格式的内容,如果傳遞了這個函數,則它的請求方式就不是GET方式,而是POST方式,這裡我們請求站點是http://httpbin.org/post,他可以測試post
import parseimport urllib.requestdata=bytes(urllib.parse.urlencode({'word':'Hello'}),encoding='utf-8')#将字元轉化為字元串response=urllib.request.urlopen('http://httpbin.org/post',data=data)print(response.read())
可以看到我們傳遞的參數在form字段中
timeout參數:用于設定逾時時間(s),如果超出設定的時間沒有得到相應,就會抛出異常,不指定參數就會使用全局預設時間
import urllib.requestresponse=urllib.request.urlopen('http://httpbin.org/get',timeout=1)print(response.read())
因為我們設定的時間1秒,超過1秒後伺服器沒響應,是以抛出異常
是以我們可以設定這個逾時時間來控制一個網頁長時間沒有響應後,就跳過它的抓取
import socketimport urllib.requestimport urllib.errortry: 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')
設定時間為0.1s,因為太短了得不到伺服器響應,是以列印timeout
Request
我們知道利用urlopen()方法可以實作最基本的請求發起,但這幾個簡單參數不足以建構個完整的請求,如果請求中需要加入Headers等資訊,可以利用Request來建構
from urllib import request,parseurl='http://httpbin.org/post'headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)','Host':'httpbin.org'}dict={ 'name' :'Germey'}data=bytes(parse.urlencode(dict),encoding='utf-8')req=request.Request(url=url,headers=headers,method='POST')response=request.urlopen(req)print(response.read().decode('utf-8'))
構造了四個函數,url即請求URL,headers中置頂了User=Agent和HOST,參數data用urlencode()和bytes()方法轉成了位元組流,另指定了POST
我們成功設定了data,headers和method
最後喜歡我文章的朋友請加圈子關注我們,加我們的qq群:251573549
每天都會更新資訊安全福利給大家哦,小編也會在群裡一一為大家解決問題