最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

二、爬蟲原理

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

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

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

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

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

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

三、基本請求庫urllib

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

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

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

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

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

#無論哪種方法,先導(dǎo)包
import urllib.request
  • 方法一:(常用) urllib.request.urlopen(url, data, timeout) 發(fā)送請求直接抓取
'''
urllib.request.urlopen(url, data, timeout) 發(fā)送request請求(3個參數(shù)不需都寫,但必須有url)
url:目標(biāo)網(wǎng)址
data:訪問url時發(fā)送的數(shù)據(jù)包,默認為null
timeout:等待時長
'''
response = urllib.request.urlopen('http://www.baidu.com/')
# decode():解碼,將字節(jié)流格式數(shù)據(jù)以相應(yīng)的形式轉(zhuǎn)化為字符串
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()解碼。 具體如何找到目標(biāo)網(wǎng)頁的編碼格式如下圖:

在這里插入圖片描述

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

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

背景:我想爬取目標(biāo)網(wǎng)頁上支持搜索關(guān)鍵詞的網(wǎng)頁所有相關(guān)信息,比如我想爬百度上所有python的信息,或者疫情的信息,或者其它的信息,如果每次都更換url那就太低效了。 分析網(wǎng)頁url:目標(biāo)網(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ù),所以如果我們要輸入中文搜索的話,要將中文轉(zhuǎn)為字節(jié)流格式。

# 定義關(guān)鍵詞
keyword = input('輸入你想查詢的關(guān)鍵詞:')
# 處理中文,進行編碼,轉(zhuǎn)成字節(jié)流格式
keyword = urllib.request.quote(keyword)
# url重構(gòu)
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供大家練習(xí)://www.iqianyue.com/mypost/ 該網(wǎng)頁輸入任何用戶名和密碼都能成功登錄,下圖為登錄后的頁面,也就是我們這次通過寫程序要爬取的結(jié)果頁面。

在這里插入圖片描述

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

在這里插入圖片描述

3.1 基礎(chǔ)操作

import urllib.request
import urllib.parse #上傳用戶名和密碼,需要先用parse模塊進行編碼處理
url = 'https://www.iqianyue.com/mypost/'
# urlencode():將上傳的數(shù)據(jù)進行編碼處理
# encode():將字符串轉(zhuǎn)化為相應(yīng)編碼的字節(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文件打開,鼠標(biāo)點進去后右上角會顯示各種瀏覽器,選擇各自使用的瀏覽器打開頁面,就會發(fā)現(xiàn),出現(xiàn)的頁面就是登錄成功后的頁面,跟上圖一致。

3.2 設(shè)置cookie

背景:通過上述常規(guī)方法,可以模擬登錄頁面抓取該目標(biāo)頁面的資源,但也存在一種情況,這一步執(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'
# 登錄跳轉(zhuǎn)頁面:'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是登錄跳轉(zhuǎn)時的頁面,順利跳轉(zhuǎn)后就進入到首頁,如果我后續(xù)再寫一個請求,直接訪問該首頁,登錄進去發(fā)現(xiàn)還是無登錄狀態(tài)。 那么那么那么那么那么…

解決方案;

1、導(dǎo)入cookie處理模塊 http.cookiejar

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

3、使用HTTPCookieProcessor創(chuàng)建cookie處理器,并以此為參數(shù)構(gòu)建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ù)構(gòu)建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ā)送請求之后不一定能得到響應(yīng),,下面就講述遇到反爬的網(wǎng)站我們應(yīng)該怎么做。

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

4.1 設(shè)置headers

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

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

import urllib.request
url = 'http://t.dianping.com/hangzhou'
# 構(gòu)建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'
}
# 構(gòu)建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 設(shè)置proxy

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

import urllib.request
def use_Proxy(proxy_addr,url):
    # ProxyHandler()設(shè)置對應(yīng)的代理服務(wù)器信息
    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))

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

相關(guān)文章

  • Django DRF路由與擴展功能的實現(xiàn)

    Django DRF路由與擴展功能的實現(xiàn)

    這篇文章主要介紹了Django DRF路由與擴展功能的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • python pycharm的安裝及其使用

    python pycharm的安裝及其使用

    這篇文章主要介紹了python pycharm的安裝及其使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Python實現(xiàn)將Markdown轉(zhuǎn)為Word、HTML、PDF、PNG和JPG

    Python實現(xiàn)將Markdown轉(zhuǎn)為Word、HTML、PDF、PNG和JPG

    Markdown(MD)是一種輕量級的標(biāo)記語言,廣泛應(yīng)用于文本格式化,本文將探討如何使用 Python 將 Markdown 轉(zhuǎn)換為 Word、HTML、PDF、PNG 和 JPG 圖片格式,希望對大家有所幫助
    2025-11-11
  • python中@staticmethod方法的使用

    python中@staticmethod方法的使用

    這篇文章主要介紹了python中@staticmethod方法的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 解決python

    解決python "No module named pip"的問題

    今天小編就為大家分享一篇解決python "No module named pip"的問題。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python實現(xiàn)生成帶logo背景圖的二維碼

    Python實現(xiàn)生成帶logo背景圖的二維碼

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)生成帶logo背景圖的二維碼(靜態(tài)和動態(tài)圖),文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-05-05
  • Python生成器與迭代器詳情

    Python生成器與迭代器詳情

    這篇文章主要介紹了Python生成器與迭代器,現(xiàn)在可以通過生成器來直接創(chuàng)建一個列表,是由于內(nèi)存的限制,表的容量肯定是有限的,果我們需要一個包含幾百個元素的列表,是每次訪問的時候只訪問其中的幾個,剩下的元素不使用就很浪費內(nèi)存空間,下面來了解具體內(nèi)容
    2021-11-11
  • python3 tcp的粘包現(xiàn)象和解決辦法解析

    python3 tcp的粘包現(xiàn)象和解決辦法解析

    這篇文章主要介紹了python3 tcp的粘包現(xiàn)象和解決辦法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • python 進程間數(shù)據(jù)共享multiProcess.Manger實現(xiàn)解析

    python 進程間數(shù)據(jù)共享multiProcess.Manger實現(xiàn)解析

    這篇文章主要介紹了python 進程間數(shù)據(jù)共享multiProcess.Manger實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • python定向爬蟲校園論壇帖子信息

    python定向爬蟲校園論壇帖子信息

    這篇文章主要為大家詳細介紹了Python定向爬蟲校園論壇帖子信息的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

闸北区| 双辽市| 疏附县| 邵东县| 土默特左旗| 吴江市| 奉化市| 衡水市| 宁城县| 临泉县| 当涂县| 涿州市| 濮阳市| 崇州市| 永善县| 芦山县| 夹江县| 和硕县| 普宁市| 阆中市| 大渡口区| 荃湾区| 金阳县| 贵州省| 东乌| 云和县| 青龙| 嘉善县| 象山县| 丰都县| 肃宁县| 开封县| 丰台区| 西乡县| 聊城市| 九台市| 庆云县| 郯城县| 永清县| 如皋市| 淄博市|