簡體   English   中英

無法使用請求模塊從靜態網頁中抓取信息

[英]Can't scrape information from a static webpage using requests module

我正在嘗試使用 requests 模塊從網頁中獲取product title及其description 標題和描述似乎是靜態的,因為它們都存在於頁面源代碼中。 但是,我未能通過以下嘗試抓住它們。 腳本此時拋出AttributeError

import requests
from bs4 import BeautifulSoup

link = 'https://www.nordstrom.com/s/anine-bing-womens-plaid-shirt/6638030'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
}

with requests.Session() as s:
    s.headers.update(headers)
    res = s.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    product_title = soup.select_one("h1[itemProp='name']").text
    product_desc = soup.select_one("#product-page-selling-statement").text
    print(product_title,product_desc)

如何使用請求模塊從上面的頁面中抓取標題和描述?

頁面是動態的。 從 api 源獲取數據:

import requests
import pandas as pd

api = 'https://www.nordstrom.com/api/ng-looks/styleId/6638030?customerId=f36cf526cfe94a72bfb710e5e155f9ba&limit=7'
jsonData = requests.get(api).json()

df = pd.json_normalize(jsonData['products'].values())

print(df.iloc[0])

輸出:

id                                                       6638030-400
name                                  ANINE BING Women's Plaid Shirt
styleId                                                      6638030
styleNumber                                                         
colorCode                                                        400
colorName                                                       BLUE
brandLabelName                                            ANINE BING
hasFlatShot                                                     True
imageUrl           https://n.nordstrommedia.com/id/sr3/6d000f40-8...
price                                                        $149.00
pathAlias          anine-bing-womens-plaid-shirt/6638030?origin=c...
originalPrice                                                $149.00
productTypeLvl1                                                   12
productTypeLvl2                                                  216
isUmap                                                         False
Name: 0, dtype: object

當測試像這樣的請求時,你應該輸出響應來看看你得到了什么。 最好使用 Postman 之類的東西(我認為 VSCode 現在有類似的功能)來設置 URL、標頭、方法和參數,並且還可以查看帶有標頭的完整響應。 當一切正常時,只需將其轉換為 python 代碼。 Postman 甚至有一些通用語言的“導出到代碼”功能。

無論如何...

我在 Postman 上嘗試了您的請求並得到了以下回復: 簡單的響應體

簡單的響應頭

從 python 和瀏覽器完成的請求是一回事。 如果標頭、URL 和參數相同,它們應該收到相同的響應。 所以下一步就是比較你的請求和瀏覽器完成的請求的區別: 瀏覽器請求

因此瀏覽器包含的一個或多個標頭從服務器獲得了良好的響應,但僅使用User-Agent是不夠的。

我會嘗試確定哪些標頭,但不幸的是,Nordstrom 檢測到一些“異常活動”並且似乎阻止了我的 IP :( 被封鎖 可能是由於發送了明顯的手工請求。 我認為這是我的 IP 被阻止了,因為我無法從任何瀏覽器訪問該站點,即使在清除我的緩存之后也是如此。

因此,請仔細檢查您在使用刮刀時是否沒有發生同樣的情況。

祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM