亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我只能抓取 eBay 上前 4 頁的結果?

為什么我只能抓取 eBay 上前 4 頁的結果?

慕工程0101907 2023-08-22 17:09:22
我有一個簡單的腳本來分析 eBay 上的銷售數據(棒球交易卡)。前 4 頁似乎工作正常,但在第 5 頁,它根本不再加載所需的 html 內容,我無法弄清楚為什么會發生這種情況:#Import statementsimport requestsimport timefrom bs4 import BeautifulSoup as soupfrom tqdm import tqdm#FOR DEBUGPage_1="https://www.ebay.com/sch/213/i.html?_from=R40&LH_Sold=1&_sop=16&_pgn=1"#Request URL working examplesource=requests.get(Page_1)time.sleep(5)eBay_full = soup(source.text, "lxml")Complete_container=eBay_full.find("ul",{"class":"b-list__items_nofooter"})Single_item=Complete_container.find_all("div",{"class":"s-item__wrapper clearfix"})items=[]#For all items on page perform desired operationfor i in tqdm(Single_item):    items.append(i.find("a", {"class": "s-item__link"})["href"].split('?')[0].split('/')[-1])    #Works fine for Links_to_check[0] upto Links_to_check[3]但是,當我嘗試抓取第五頁或更多頁面時,會發生以下情況:Page_5="https://www.ebay.com/sch/213/i.html?_from=R40&LH_Sold=1&_sop=16&_pgn=5"source=requests.get(Page_5)time.sleep(5)eBay_full = soup(source.text, "lxml")Complete_container=eBay_full.find("ul",{"class":"b-list__items_nofooter"})Single_item=Complete_container.find_all("div",{"class":"s-item__wrapper clearfix"})items=[]#For all items on page perform desired operationfor i in tqdm(Single_item):    items.append(i.find("a", {"class": "s-item__link"})["href"].split('?')[0].split('/')[-1])----> 5 Single_item=Complete_container.find_all("div",{"class":"s-item__wrapper clearfix"})      6 items=[]      7 #For all items on page perform desired operationAttributeError: 'NoneType' object has no attribute 'find_all'這似乎是后面頁面的 eBay_full 湯中缺少 ul 類 b-list__items_nofooter 的邏輯結果。但問題是為什么這些信息丟失了?滾動瀏覽湯,所有感興趣的項目似乎都不存在。正如預期的那樣,該信息出現在網頁本身上。誰能指導我?
查看完整描述

2 回答

?
Helenr

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)


查看完整回答
反對 回復 2023-08-22
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

主要問題在于 eBay 理解機器人/腳本發送請求。

但eBay如何理解它呢?這是因為默認的requests用戶代理是python-requestseBay 理解它并且似乎阻止使用此類用戶代理發出的請求。

通過添加自定義用戶代理,我們可以在某種程度上偽造真實的用戶請求。然而,它并不完全可靠,并且標頭可能需要旋轉或/并與代理一起使用,最好是住宅。

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"

? },

? # ...

]


查看完整回答
反對 回復 2023-08-22
  • 2 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號