Python爬蟲之requests庫(kù)網(wǎng)絡(luò)爬取簡(jiǎn)單實(shí)戰(zhàn)

  • 實(shí)例1:直接爬取網(wǎng)頁(yè)
  • 實(shí)例2 : 構(gòu)造headers,突破訪問限制,模擬瀏覽器爬取網(wǎng)頁(yè)
  • 實(shí)例3 : 分析請(qǐng)求參數(shù),構(gòu)造請(qǐng)求參數(shù)爬取所需網(wǎng)頁(yè)
  • 實(shí)例4: 爬取圖片
  • 實(shí)例5: 分析請(qǐng)求參數(shù),構(gòu)造請(qǐng)求參數(shù)爬取所需信息

實(shí)例1:京東商品頁(yè)面的爬取

image.png

現(xiàn)在我們利用requests庫(kù)爬取這個(gè)頁(yè)面的商品信息

首先引入requests庫(kù)

 import requests

然后爬取頁(yè)面

r =requests.get("https://item.jd.com/4645290.html")

然后我們測(cè)試狀態(tài)碼,編碼和內(nèi)容

r.status_code
r.encoding
r.text[:1000]
image.png

到此,說明我們已經(jīng)成功利用requests庫(kù)獲取到了商品頁(yè)面的信息。

完整的爬取代碼

import requests
url = "https://item.jd.com/4645290.html"
try:
    r = requests.get(url)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[:1000])
except:
    print("爬取失敗")

實(shí)例2 : 亞馬遜商品頁(yè)面爬取

我們選取如下界面進(jìn)行爬取

image.png

首先,我們按照之前的步驟進(jìn)行爬取
引入requests庫(kù),然后get,判斷status_code

r = requests.get("https://www.amazon.cn/dp/B0011F7WU4/ref=s9_acss_bw_cg_JAVA_1a1_w?m=A1AJ19PSB66TGU&pf_rd_m=A1U5RCOVU0NYF2&pf_rd_s=merchandised-search-6&pf_rd_r=D9MK8AMFACZGHMFJGRXP&pf_rd_t=101&pf_rd_p=f411a6d2-b2c5-4105-abd9-69dbe8c05f1c&pf_rd_i=1899860071")
r.status_code

顯示503,說明服務(wù)器錯(cuò)誤,
503 (服務(wù)不可用) 服務(wù)器目前無(wú)法使用(由于超載或停機(jī)維護(hù))。 通常,這只是暫時(shí)狀態(tài)。

我們查看編碼發(fā)現(xiàn)

r.encoding
'ISO-8859-1'

我們需要轉(zhuǎn)換編碼

r.encoding = r.apparent_encoding

然后顯示爬取內(nèi)容,發(fā)現(xiàn)

image.png

發(fā)現(xiàn)出現(xiàn)了錯(cuò)誤。

網(wǎng)頁(yè)告訴我們出現(xiàn)了錯(cuò)誤,但只要我們正確獲取到了網(wǎng)頁(yè)的內(nèi)容,就說明網(wǎng)路方面肯定是沒有錯(cuò)誤的。這說明亞馬遜對(duì)爬蟲有限制,一般對(duì)爬蟲限制的話,就是robots協(xié)議,其中還可以對(duì)訪問對(duì)象進(jìn)行限制,限制只能通過相應(yīng)的瀏覽器訪問,而限制爬蟲的訪問。

我們通過request.header查看我們發(fā)給亞馬遜的請(qǐng)求頭部到底是什么內(nèi)容

image.png

我們看到信息中的user-agent的信息是python。這說明我們的程序誠(chéng)實(shí)的告訴亞馬遜,這個(gè)程序是python的requests庫(kù)發(fā)起的請(qǐng)求。
亞馬遜的服務(wù)器看到這是個(gè)爬蟲請(qǐng)求,所以就返回錯(cuò)誤的信息。

那么我們?nèi)绾尾拍茉L問呢?
我們都知道requests庫(kù)可以更改請(qǐng)求的頭部信息,我們可以模擬一個(gè)瀏覽器的請(qǐng)求

我們構(gòu)造一個(gè)鍵值對(duì)

kv = {'user-agent':'Mozilla/5.0'}
url = "https://www.amazon.cn/dp/B0011F7WU4/ref=s9_acss_bw_cg_JAVA_1a1_w?m=A1AJ19PSB66TGU&pf_rd_m=A1U5RCOVU0NYF2&pf_rd_s=merchandised-search-6&pf_rd_r=D9MK8AMFACZGHMFJGRXP&pf_rd_t=101&pf_rd_p=f411a6d2-b2c5-4105-abd9-69dbe8c05f1c&pf_rd_i=1899860071"
r = requests.get(url, headers = kv)

我們查看狀態(tài)碼,發(fā)現(xiàn)為200,說明這一次成功獲取到了頁(yè)面的內(nèi)容

image.png

完整的爬取代碼

import requests
url = "https://www.amazon.cn/dp/B0011F7WU4/ref=s9_acss_bw_cg_JAVA_1a1_w?m=A1AJ19PSB66TGU&pf_rd_m=A1U5RCOVU0NYF2&pf_rd_s=merchandised-search-6&pf_rd_r=D9MK8AMFACZGHMFJGRXP&pf_rd_t=101&pf_rd_p=f411a6d2-b2c5-4105-abd9-69dbe8c05f1c&pf_rd_i=1899860071"
try:
    kv = {'user-agent':'Mozilla/5.0'}
    r = requests.get(url, headers = kv)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[1000:2000])
except:
    print("爬取失敗")

實(shí)例3: 百度/360搜索關(guān)鍵詞提交爬蟲

搜索關(guān)鍵詞提交的接口:

https://www.baidu.com/s?ie=UTF-8&wd=keyword

通過requests的params參數(shù),構(gòu)造查詢參數(shù)

完整的代碼

import requests

keyword = "劉德華"
url = "http://www.baidu.com/s?ie=UTF-8"

try:
    kv = {"wd":keyword}
    r = requests.get(url, params = kv)
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text))
    print(r.text)
except:
    print("爬取失敗")

實(shí)例4 網(wǎng)絡(luò)圖片的爬取和存儲(chǔ)

網(wǎng)絡(luò)中圖片連接的格式

http://www.example.com/picture.jpg

假設(shè)我們現(xiàn)在要爬取

http://www.nationalgeographic.com.cn/

圖片連接:

http://image.nationalgeographic.com.cn/2015/0121/20150121033625957.jpg

完整的爬取代碼:

import requests
import os

url = "http://image.nationalgeographic.com.cn/2015/0121/20150121033625957.jpg"
root = "D://pics//"
path = root + url.split('/')[-1]

try:
    if not os.path.exists(root):
        os.mkdir(root)
    if not os.path.exists(path):
        r = requests.get(url)
        with open(path,'wb') as f:
            f.write(r.content)
            f.close()
            print("文件保存成功")
    else :
        print("文件已存在")
except:
    print("爬取失敗")

實(shí)例5 IP地址歸屬地查詢

此網(wǎng)站可以查詢IP地址歸屬地
http://m.ip138.com/ip.asp

我們分析它請(qǐng)求的過程,發(fā)現(xiàn)它的請(qǐng)求接口就是在地址后附加參數(shù),類似于百度搜索

http://m.ip138.com/ip.asp?ip=125.220.159.160

所以我們可以構(gòu)造查詢參數(shù),發(fā)送給服務(wù)器,然后獲取返回的結(jié)果

完整代碼

import requests
url = "http://m.ip138.com/ip.asp?"
ip = "125.220.159.160"
kv = {"ip":ip}

try:
    r = requests.get(url, params = kv)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text)
except:
    print("爬取失敗")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容