2 回答

TA貢獻1780條經驗 獲得超4個贊
在 headers 變量中僅放置其中一種瀏覽器,以及當前的穩定版本號(例如 Chrome/53.0.2785.143)
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}
source= requests.get(Page_5, headers=headers, timeout=2)

TA貢獻2041條經驗 獲得超4個贊
主要問題在于 eBay 理解機器人/腳本發送請求。
但eBay如何理解它呢?這是因為默認的requests
用戶代理是python-requests
eBay 理解它并且似乎阻止使用此類用戶代理發出的請求。
通過添加自定義用戶代理,我們可以在某種程度上偽造真實的用戶請求。然而,它并不完全可靠,并且標頭可能需要旋轉或/并與代理一起使用,最好是住宅。
Whatismybrowser 上的用戶代理列表。
附帶說明一下,您可以使用SelectorGadget?Chrome 擴展通過單擊瀏覽器中所需的元素來輕松選擇 CSS 選擇器,如果頁面大量使用 JS,則這并不總是能完美工作(在本例中我們可以)。
下面的示例顯示了如何從所有頁面中提取列表。
from bs4 import BeautifulSoup
import requests, json, lxml
# https://requests.readthedocs.io/en/latest/user/quickstart/#custom-headers
headers = {
? ? "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36",
? ? }
? ??
params = {
? ? '_nkw': 'baseball trading cards', # search query
? ? 'LH_Sold': '1',? ? ? ? ? ? ? ? ? ?# shows sold items
? ? '_pgn': 1? ? ? ? ? ? ? ? ? ? ? ? ?# page number
? ? }
data = []
while True:
? ? page = requests.get('https://www.ebay.com/sch/i.html', params=params, headers=headers, timeout=30)
? ? soup = BeautifulSoup(page.text, 'lxml')
? ??
? ? print(f"Extracting page: {params['_pgn']}")
? ? print("-" * 10)
? ??
? ? for products in soup.select(".s-item__info"):
? ? ? ? title = products.select_one(".s-item__title span").text
? ? ? ? price = products.select_one(".s-item__price").text
? ? ? ? link = products.select_one(".s-item__link")["href"]
? ? ? ??
? ? ? ? data.append({
? ? ? ? ? "title" : title,
? ? ? ? ? "price" : price,
? ? ? ? ? "link" : link
? ? ? ? })
? ? if soup.select_one(".pagination__next"):
? ? ? ? params['_pgn'] += 1
? ? else:
? ? ? ? break
? ? print(json.dumps(data, indent=2, ensure_ascii=False))
輸出示例
Extracting page: 1
----------
[
? {
? ? "title": "Shop on eBay",
? ? "price": "$20.00",
? ? "link": "https://ebay.com/itm/123456?hash=item28caef0a3a:g:E3kAAOSwlGJiMikD&amdata=enc%3AAQAHAAAAsJoWXGf0hxNZspTmhb8%2FTJCCurAWCHuXJ2Xi3S9cwXL6BX04zSEiVaDMCvsUbApftgXEAHGJU1ZGugZO%2FnW1U7Gb6vgoL%2BmXlqCbLkwoZfF3AUAK8YvJ5B4%2BnhFA7ID4dxpYs4jjExEnN5SR2g1mQe7QtLkmGt%2FZ%2FbH2W62cXPuKbf550ExbnBPO2QJyZTXYCuw5KVkMdFMDuoB4p3FwJKcSPzez5kyQyVjyiIq6PB2q%7Ctkp%3ABlBMULq7kqyXYA"
? },
? {
? ? "title": "Ken Griffey Jr. Seattle Mariners 1989 Topps Traded RC Rookie Card #41T",
? ? "price": "$7.20",
? ? "link": "https://www.ebay.com/itm/385118055958?hash=item59aad32e16:g:EwgAAOSwhgljI0Vm&amdata=enc%3AAQAHAAAAoFRRlvb50yb%2FN4cmlg5OtVDKIH0DsaMJBL3Tp67SI1dCSP1WPdZW3f16bTf4HTSUhX0g3OMmZSitEY3F3SVGg0%2FhSBF3ykE9X88Lo2EHuS2b23tA1kGiG92F9xyr73RLorcidserdH8tvUXhxmT4pJDnCfMAdfqtRzSIxcB6h4aDC1J1XvJ5IyRfYtWBGUQ60ykrA7mNlhH53cwZe5MiRSw%3D%7Ctkp%3ABk9SR7rKxt7sYA"
? },
? {
? ? "title": "Ken Griffey Jr. 1989 Score Traded Rookie Card Gem 10 Auto Beckett 13604418",
? ? "price": "$349.00",
? ? "link": "https://www.ebay.com/itm/353982131344?hash=item526afaac90:g:9hQAAOSwvCpiQ5FY&amdata=enc%3AAQAHAAAAoOKm1SWvHtdNVIEqtE4m5%2B453xtvR75ZimUBLL16P0WwfJy%2BJJQ2Phd9crgAacTWlsqp9HB%2Ft0McttOjmCfyL0RDQB%2FYOWQK3hxj%2FoDRmybJRipjqb0JG2%2BCa1RhI04PN3R5wpH9vvYqefwY6JuAsPqDU0SmSk6h1h%2FQr7cfJqOmdCo0cqbwPcJ8OcvAyP07txigrDyO55XqFD7CHcSmUPA%3D%7Ctkp%3ABk9SR7rKxt7sYA"
? },
? {
? ? "title": "Mike Jorgensen NY Mets MLB OF-1B 1972 Topps Baseball Card #16 Single Original",
? ? "price": "$1.19",
? ? "link": "https://www.ebay.com/itm/374255790865?hash=item5723622b11:g:KiwAAOSwz4ljI0G4&amdata=enc%3AAQAHAAAAoPVkKyeDZ7wbRNBwQppCcjVmLlOlY3ylPVwQyG7dfOy1UtPYhK7tRXtvn5v3M5n%2F35MS1LXLvWAioKRrMGPEPCmDoMkhdynuH3csaincrM%2F6JNwwIUFa3F%2FcylfPqnrxjJXF7cZ3ga9aCihTM6sfVJc1kzNkaBw2C2ewMyQ3ARgYpuDcUa6CMo4zBKF%2FGTj5KlZieLYywQm4dnzLCrFbtEM%3D%7Ctkp%3ABk9SR7rKxt7sYA"
? },
? # ...
]
添加回答
舉報