簡體   English   中英

Python:使用 bs4、BeautifulSoup 抓取亞馬遜網頁

[英]Python: Scraping Amazon webpage with bs4, BeautifulSoup

我正在嘗試從亞馬遜網頁讀取特定信息(名稱、價格等...)。 為此,我正在使用大多數教程中建議的“BeautifulSoup”和“請求”。 我的代碼可以加載頁面並找到我正在尋找的項目,但無法實際獲得它。 我檢查了該項目明確存在的網頁。

這是我的代碼:

#import time
import requests
#import urllib.request
from bs4 import BeautifulSoup

URL = ('https://www.amazon.de/dp/B008JCUXNK/?coliid=I9G2T92PZXG06&colid=3ESRXLK53S0NY&psc=1&ref_=lv_ov_lig_dp_it')

# user agent = browser information (get via google search "my user agent")
headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'}

page = requests.get(URL, headers=headers)# webpage

soup = BeautifulSoup(page.content, 'html.parser')# webpage as html

title = soup.find(id="productTitle")


print(title)

title 始終為“NONE”,因此調用 get_Text 會導致錯誤。 誰能告訴我出了什么問題?

您的代碼 100% 正確,但我已經嘗試了您的代碼並檢查了page.content值。 它包含驗證碼。 看起來亞馬遜不希望你刮他們的網站。

你可以在這里閱讀你的案例: https : //www.reddit.com/r/learnpython/comments/bf21fn/how_to_prevent_captcha_while_scraping_amazon/

但我也建議閱讀亞馬遜的條款和條件https://www.amazon.com/gp/help/customer/display.html/ref=hp_551434_conditions以確定您是否可以合法地刮取它。

找到了通過驗證碼的方法。 請求需要包含更好的標頭。 例子:

import datetime    
import requests

KEY = "YOUR_KEY_HERE"
date = datetime.datetime.now().strftime("%Y%m%d")

BASE_REQUEST = ('https://www.amazon.de/Philips-Haartrockner-ThermoProtect-Technologie-HP8230/dp/B00BCQIIMS?pf_rd_r=T1T8Z7QTQTGYM8F7KRN5&pf_rd_p=c832d309-197e-4c59-8cad-735a8deab917&pd_rd_r=20c6ed33-d548-47d7-a262-c53afe32df96&pd_rd_w=63hR3&pd_rd_wg=TYwZH&ref_=pd_gw_crs_zg_bs_84230031')

headers = {
    'dnt': '1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-user': '?1',
    'sec-fetch-dest': 'document',
    'referer': 'https://www.amazon.com/',
    'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
}

payload = {
    "api-key": KEY,
    "begin_date": date,
    "end_date": date,
    "q": "Donald Trump"
}

r = requests.get(BASE_REQUEST, headers=headers)

print(r.status_code)

if r.status_code == 200:
    print('success')

有關狀態代碼的信息,只需 google html 狀態代碼。 希望這可以幫助任何有類似問題的人

干杯!

暫無
暫無

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

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