繁体   English   中英

Beautifulsoup - Python For 循环仅运行 8 次,然后在 visual studio 代码中以代码 0 退出

[英]Beautifulsoup - Python For loop only runs 8 times then exits with code 0 in visual studio code

我有一个 python 脚本,可以抓取拍卖网站的第一页。 它正在抓取的页面是 trademe.co.nz - 类似于 ebay/amazon 等。它的目的是抓取第一页上的所有列表 - 只有当它不在我的数据库中时。 它按预期工作,但有一个警告 - 它只抓取前 8 个列表(不管 trademe url)然后在 visual studio 代码中以代码 0 退出。 如果我尝试再次运行它,它会立即退出,因为它认为没有新的拍卖 ID。 如果添加了新列表并且我再次运行脚本 - 它会添加新列表。

from bs4 import BeautifulSoup
from time import sleep
import requests
import datetime
import sqlite3

# Standard for all scrapings
dateAdded = datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S")

def mechanicalKeyboards():

  url = "https://www.trademe.co.nz/a/marketplace/computers/peripherals/keyboards/mechanical/search?condition=used&sort_order=expirydesc"
  category = "Mechanical Keyboards"  
  dateAdded = datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S")
  trademeLogo = "https://www.trademe.co.nz/images/frend/trademe-logo-no-tagline.png"
  
  # getCode = requests.get(url).status_code
  # print(getCode)
  
  r = requests.get(url)
  soup = BeautifulSoup(r.text, "html.parser")
  
  listingContainer = soup.select(".tm-marketplace-search-card__wrapper")
  conn = sqlite3.connect('trademe.db')
  c = conn.cursor() 
  c.execute('''SELECT ID FROM trademe ORDER BY DateAdded DESC ''')
  allResult = str(c.fetchall())
    
  for listing in listingContainer:
    title = listing.select("#-title")
    location = listing.select("#-region")
    auctionID = listing['data-aria-id'].split("-").pop()
    fullListingURL = "https://www.trademe.co.nz/a/" + auctionID
    image = listing.select("picture img")
    
    try:
      buyNow = listing.select(".tm-marketplace-search-card__footer-pricing-row")[0].find(class_="tm-marketplace-search-card__price ng-star-inserted").text.strip()
    except:
      buyNow = "None"
    
    try:
      price = listing.select(".tm-marketplace-search-card__footer-pricing-row")[0].find(class_="tm-marketplace-search-card__price").text.strip()
    except:
      price = "None"

    for t, l, i in zip(title, location, image):
      if auctionID not in allResult:
        print("Adding new data - " + t.text)
        c.execute(''' INSERT INTO trademe VALUES(?,?,?,?)''', (auctionID, t.text, dateAdded, fullListingURL))
        conn.commit()
        sleep(5)

我想也许我受到了速率限制,但我得到了 200 状态代码并且更改 URL 再次适用于前 8 个列表。 我查看了元素,但在第 8 次上市后看不到任何变化。 我希望有人能提供帮助,非常感谢。

当使用requests.get(url)抓取具有延迟加载内容的网站时,它只返回 HTML 和前 8 个列表的图像,导致zip(title, location, image) function 仅产生 8 个项目,因为image变量listingContainer中第 8 个 listing 之后为空列表

要正确抓取此类网站,我建议使用 Playwright 或 Selenium 等工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM