欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python爬蟲原理與基本請求庫urllib詳解

 更新時間:2023年07月14日 10:19:01   作者:打工人戶戶  
這篇文章主要介紹了Python爬蟲原理與基本請求庫urllib詳解,爬蟲就是通過模擬瀏覽器,按照一定的規(guī)則,自動、大批量的獲取網(wǎng)絡資源,包括文本、圖片、鏈接、音頻、視頻等等,需要的朋友可以參考下

一、網(wǎng)絡爬蟲是什么?

爬蟲的定義請求網(wǎng)站,并提取數(shù)據(jù)的自動化程序。

通過模擬瀏覽器,按照一定的規(guī)則,自動、大批量的獲取網(wǎng)絡資源,包括文本、圖片、鏈接、音頻、視頻等等。

二、爬蟲原理

(講的就是如何獲取網(wǎng)絡資源的問題—怎么爬?要有尊嚴的爬,坐著就把數(shù)據(jù)優(yōu)雅的爬下來)

1、發(fā)起請求:模擬瀏覽器向目標站點發(fā)送一個request,等待服務器響應;

2、獲取響應內(nèi)容:如果服務器能正常響應,會返回一個response,這便是所要獲取的頁面內(nèi)容

3、解析內(nèi)容:根據(jù)自己的需求,通過各種解析方法,將得到的內(nèi)容進行解析

4、保存數(shù)據(jù):存放于數(shù)據(jù)庫或者保存為特定格式的文件

所以接下來本次我們要學習的內(nèi)容就是以上這四個步驟了。

三、基本請求庫urllib

這個庫的作用呢,就是爬蟲原理中的第一、二步,向目標網(wǎng)站發(fā)送請求用的。

本節(jié)內(nèi)容:

  1. 用urllib抓取網(wǎng)頁的基本語法
  2. 抓取需要輸入關鍵詞的網(wǎng)頁
  3. 抓取需要登錄密碼的網(wǎng)頁
  4. 抓取反爬機制的網(wǎng)頁
  5. urllib異常處理

1、用urllib抓取網(wǎng)頁的【基本語法】

有兩種方法,一種是直接抓取,一種是直接將目標網(wǎng)址的網(wǎng)頁信息保存到本地。

#無論哪種方法,先導包
import urllib.request
  • 方法一:(常用) urllib.request.urlopen(url, data, timeout) 發(fā)送請求直接抓取
'''
urllib.request.urlopen(url, data, timeout) 發(fā)送request請求(3個參數(shù)不需都寫,但必須有url)
url:目標網(wǎng)址
data:訪問url時發(fā)送的數(shù)據(jù)包,默認為null
timeout:等待時長
'''
response = urllib.request.urlopen('http://www.baidu.com/')
# decode():解碼,將字節(jié)流格式數(shù)據(jù)以相應的形式轉化為字符串
print(response.read().decode('utf-8'))

通過urllib請求后得到的response打印如下:<http.client.HTTPResponse object at 0x000001DA07919608> 所以要先read()讀取出來,但是給我的頁面都是字節(jié)流數(shù)據(jù),所以我們要在該網(wǎng)頁源代碼中找到其chartset,比如百度首頁的編碼格式就是utf-8,所以發(fā)送請求后,要拿到我們可讀的網(wǎng)頁就需要先read()再decode()解碼。 具體如何找到目標網(wǎng)頁的編碼格式如下圖:

在這里插入圖片描述

  • 方法二urllib.request.urlretrieve(url,filename) 將目標網(wǎng)址網(wǎng)頁信息保存到本地
'''
urllib.request.urlretrieve(url,filename) 直接將目標網(wǎng)址的網(wǎng)頁信息保存到本地
filename:想保存到的路徑文件名
然后用urllib.request.urlcleanup()清除緩存
'''
filename = urllib.request.urlretrieve('http://www.baidu.com/',filename='baidu.html')
urllib.request.urlcleanup()

2. 抓取需要輸入【關鍵詞】的網(wǎng)頁

背景:我想爬取目標網(wǎng)頁上支持搜索關鍵詞的網(wǎng)頁所有相關信息,比如我想爬百度上所有python的信息,或者疫情的信息,或者其它的信息,如果每次都更換url那就太低效了。 分析網(wǎng)頁url:目標網(wǎng)頁是百度,//www.baidu.com/,輸入python之后url有變化,發(fā)現(xiàn)//www.baidu.com/s?wd=python這個網(wǎng)址也能搜索到python的信息,找到規(guī)律,//www.baidu.com/s?wd=后面的詞可以替換成任何詞,都支持搜索,那么我們可以把這個詞用input來輸入得到,然后對url做一個拼接。 注意:發(fā)現(xiàn)//www.baidu.com/s?wd=后面的詞不支持中文搜索,原因是網(wǎng)址中都是字節(jié)流的數(shù)據(jù),所以如果我們要輸入中文搜索的話,要將中文轉為字節(jié)流格式。

# 定義關鍵詞
keyword = input('輸入你想查詢的關鍵詞:')
# 處理中文,進行編碼,轉成字節(jié)流格式
keyword = urllib.request.quote(keyword)
# url重構
url = 'http://www.baidu.com/s?wd='+keyword
response = urllib.request.urlopen(url).read()
# 保存到本地
f = open('baidu_search.html','wb') #wb存儲字節(jié)流數(shù)據(jù),所以上述response不需要用decode解碼
f.write(response)
f.close()

3. 抓取需要【登錄密碼】的網(wǎng)頁

背景:需要爬取用戶登錄之后頁面的數(shù)據(jù), 這里有一個url供大家練習://www.iqianyue.com/mypost/ 該網(wǎng)頁輸入任何用戶名和密碼都能成功登錄,下圖為登錄后的頁面,也就是我們這次通過寫程序要爬取的結果頁面。

在這里插入圖片描述

還記得urllib的基本語法嗎?里面有3個參數(shù),第二個是data,也就是我們傳入的值,這里可以把用戶名和密碼跟著頁面請求一起發(fā)送過去,但是要怎么做呢?首先要找到網(wǎng)頁代碼里是怎么設置用戶名和密碼的命名的(也就是字典里的key值)。

在這里插入圖片描述

3.1 基礎操作

import urllib.request
import urllib.parse #上傳用戶名和密碼,需要先用parse模塊進行編碼處理
url = 'https://www.iqianyue.com/mypost/'
# urlencode():將上傳的數(shù)據(jù)進行編碼處理
# encode():將字符串轉化為相應編碼的字節(jié)流數(shù)據(jù)
postdata = urllib.parse.urlencode({
    'name':'vicky',
    'pass':'12345'
}).encode('utf-8')
response = urllib.request.urlopen(url,data=postdata).read()
# 保存網(wǎng)頁
f = open('post.html','wb')
f.write(response)
f.close()

運行成功后將post.html文件打開,鼠標點進去后右上角會顯示各種瀏覽器,選擇各自使用的瀏覽器打開頁面,就會發(fā)現(xiàn),出現(xiàn)的頁面就是登錄成功后的頁面,跟上圖一致。

3.2 設置cookie

背景:通過上述常規(guī)方法,可以模擬登錄頁面抓取該目標頁面的資源,但也存在一種情況,這一步執(zhí)行成功后,后續(xù)如果想抓取該網(wǎng)站的其它網(wǎng)頁,用程序登錄進去之后依然是無登錄狀態(tài),瀏覽器并沒有留下cookie。

【舉個栗子】:

import urllib.request
import urllib.parse
# 主頁面:'http://blog.chinaunix.net/'
# 登錄頁面:'http://account.chinaunix.net/login?url=http%3a%2f%2fblog.chinaunix.net'
# 登錄跳轉頁面:'http://account.chinaunix.net/login/sso?url=http%3A%2F%2Fblog.chinaunix.net'
url = 'http://account.chinaunix.net/login/sso?url=http%3A%2F%2Fblog.chinaunix.net'
postdata = urllib.parse.urlencode({
    'username':'***',
    'password':'******'
}).encode('utf-8')
response = urllib.request.urlopen(url,postdata).read()
f = open('chinaunix.html','wb')
f.write(response)
f.close()

拿這個網(wǎng)站舉例,我選的url是登錄跳轉時的頁面,順利跳轉后就進入到首頁,如果我后續(xù)再寫一個請求,直接訪問該首頁,登錄進去發(fā)現(xiàn)還是無登錄狀態(tài)。 那么那么那么那么那么…

解決方案;

1、導入cookie處理模塊 http.cookiejar

2、使用http.cookiejar.CookieJar()創(chuàng)建cookiejar對象

3、使用HTTPCookieProcessor創(chuàng)建cookie處理器,并以此為參數(shù)構建opener對象

4、加載為全局默認的opener

這樣寫,就把cookie貫穿整個網(wǎng)站的始終了,訪問哪個頁面都是登錄狀態(tài)。

import urllib.request
import urllib.parse
import http.cookiejar
url = 'http://account.chinaunix.net/login/sso?url=http%3A%2F%2Fblog.chinaunix.net'
postdata = urllib.parse.urlencode({
    'username':'***',
    'password':'***'
}).encode('utf-8')
response = urllib.request.urlopen(url,postdata).read()
# 創(chuàng)建cookiejar對象
cjar = http.cookiejar.CookieJar()
# 創(chuàng)建cookie處理器,并以此為參數(shù)構建opener對象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
# 加載為全局默認的opener
urllib.request.install_opener(opener)
f = open('chinaunix_2.html','wb')
f.write(response)
f.close()

4. 抓取【反爬機制】的網(wǎng)頁

背景:因為有些網(wǎng)站也有一些反爬機制,所以你用上述語法進行常規(guī)的發(fā)送請求之后不一定能得到響應,,下面就講述遇到反爬的網(wǎng)站我們應該怎么做。

對于反爬網(wǎng)頁的對策有2點: headers:設置頭部信息,將爬蟲偽裝成瀏覽器 proxy:設置代理,使用代理服務器并經(jīng)常切換代理服務器

4.1 設置headers

— headers信息也在網(wǎng)頁源代碼中,找到User-Agent(headers里一般設置這個就行了),構建字典,把:后面的系統(tǒng)瀏覽器版本等信息全部復制粘貼進來,模擬瀏覽器登錄。

— 發(fā)送請求前,要先構建一個Request請求對象,設置headers,再把請求對象傳到urlopen中

import urllib.request
url = 'http://t.dianping.com/hangzhou'
# 構建headers
h = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
# 構建Request請求對象
request = urllib.request.Request(url=url, headers=h)
response = urllib.request.urlopen(request).read()
# 保存文件
f = open('headers.html','wb')
f.write(response)
f.close()

4.2 設置proxy

也就是代理IP,在一定時間內(nèi)頻繁爬取某個網(wǎng)頁可能會被封,所以可以使用一些代理IP來爬取資源。

import urllib.request
def use_Proxy(proxy_addr,url):
    # ProxyHandler()設置對應的代理服務器信息
    proxy = urllib.request.ProxyHandler({'http':proxy_addr})
    # build_opener()創(chuàng)建一個自定義的opener對象
    opener = urllib.request.build_opener(proxy)
    # 將opener加載為全局使用的opener
    urllib.request.install_opener(opener)
    response = urllib.request.urlopen(url).read().decode('utf-8')
    return response
proxy_addr = '183.146.213.157:80'  # IP地址:端口號  自行百度“代理IP”
url = 'http://www.taobao.com'
print(len(use_Proxy(proxy_addr,url)))  #隨便打印一個長度,看看這個代理IP能否使用

5. urllib異常處理

建立異常處理機制,反饋出錯原因。

import urllib.request
import urllib.error
try:
    response = urllib.request.urlopen('http://www.ijinqian.com')
except urllib.error.URLError as e:
    print('發(fā)生異常--->'+str(e))

到此這篇關于Python爬蟲原理與基本請求庫urllib詳解的文章就介紹到這了,更多相關Python爬蟲urllib庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python使用tensorflow保存、加載和使用模型的方法

    python使用tensorflow保存、加載和使用模型的方法

    本篇文章主要介紹了python使用tensorflow保存、加載和使用模型的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • python3使用matplotlib繪制散點圖

    python3使用matplotlib繪制散點圖

    這篇文章主要為大家詳細介紹了python3使用matplotlib繪制散點圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Python實現(xiàn)的數(shù)據(jù)結構與算法之快速排序詳解

    Python實現(xiàn)的數(shù)據(jù)結構與算法之快速排序詳解

    這篇文章主要介紹了Python實現(xiàn)的數(shù)據(jù)結構與算法之快速排序,詳細分析了快速排序的原理與Python實現(xiàn)技巧,需要的朋友可以參考下
    2015-04-04
  • Python解決爬蟲程序卡死問題

    Python解決爬蟲程序卡死問題

    這篇文章主要介紹了Python解決爬蟲程序卡死問題,文章圍繞主題展開詳細內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • python3爬蟲中異步協(xié)程的用法

    python3爬蟲中異步協(xié)程的用法

    在本篇文章里小編給大家整理的是關于python3爬蟲中異步協(xié)程的用法,需要的朋友們可以學習參考下。
    2020-07-07
  • opencv 獲取rtsp流媒體視頻的實現(xiàn)方法

    opencv 獲取rtsp流媒體視頻的實現(xiàn)方法

    這篇文章主要介紹了opencv 獲取rtsp流媒體視頻的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • python?pandas數(shù)據(jù)處理教程之合并與拼接

    python?pandas數(shù)據(jù)處理教程之合并與拼接

    在實際處理數(shù)據(jù)業(yè)務需求中,我們經(jīng)常會遇到這樣的需求,將多個表連接起來再進行數(shù)據(jù)的處理和分析,類似SQL中的連接查詢功能,下面這篇文章主要給大家介紹了關于python?pandas數(shù)據(jù)處理教程之合并與拼接的相關資料,需要的朋友可以參考下
    2022-02-02
  • 最新評論