如果不是http 200状态,如何比较变量



我目前已经编写了一个webscratch,在这里我比较两个值,看看与新请求相比,上一个请求的值是否增加了。

import json
import re
import time
from dataclasses import dataclass
from typing import Optional, List
import requests
from bs4 import BeautifulSoup

@dataclass
class Product:
name: Optional[str]
price: Optional[str]
image: Optional[str]
sizes: List[str]
@staticmethod
def get_sizes(doc: BeautifulSoup) -> List[str]:
pat = re.compile(
r'^<script>var JetshopData='
r'({.*})'
r';</script>$',
)
for script in doc.find_all('script'):
match = pat.match(str(script))
if match is not None:
break
else:
return []
data = json.loads(match[1])
return [
variation
for get_value in data['ProductInfo']['Attributes']['Variations']
if get_value.get('IsBuyable')
for variation in get_value['Variation']
]
@classmethod
def from_page(cls, url: str) -> Optional['Product']:
with requests.get(url) as response:
response.raise_for_status()
doc = BeautifulSoup(response.text, 'html.parser')
name = doc.select_one('h1.product-page-header')
price = doc.select_one('span.price')
image = doc.select_one('meta[property="og:image"]')
return cls(
name=name and name.text.strip(),
price=price and price.text.strip(),
image=image and image['content'],
sizes=cls.get_sizes(doc),
)

def main():
product = Product.from_page("https://shelta.se/sneakers/nike-air-zoom-type-whiteblack-cj2033-103")
previous_request = product.sizes
while True:
product = Product.from_page("https://shelta.se/sneakers/nike-air-zoom-type-whiteblack-cj2033-103")
if set(product.sizes) - set(previous_request):
print("new changes on the webpage")
previous_request = product.sizes
else:
print("No changes made")
time.sleep(500)

if __name__ == '__main__':
main()

我面临的问题是,在这种情况下,产品可能会被拆除。例如,如果我现在找到了尺寸['US 9,5/EUR 43', 'US 10,5/EUR 44,5'],并且网页被管理员取下,返回404。几个小时后,他们重新添加回网页,并再次添加值['US 9,5/EUR 43', 'US 10,5/EUR 44,5']——这不会打印出我们之前在有效请求中已经拥有的值。

我想知道,如果网页从404返回到200(即使它们添加了相同的值?(,打印值的最佳方式是什么

在这种情况下使用response.raise_for_status()是不正确的。如果网站返回404500或类似的结果,退出你的程序,这只会引发一个异常。将response.raise_for_status()换成:

if response.status_code is not 200:
return cls(None,None,None,None)

编辑因为我误解了这个问题:

如果出现错误,现在将返回空产品。现在唯一需要检查的是尺寸是否发生了变化。

def main():
url = "https://shelta.se/sneakers/nike-air-zoom-type-whiteblack-cj2033-103"
previous_product = Product.from_page(url) 
while True:
product = Product.from_page(url)

if not product.sizes == previous_product.sizes:
print("new changes on the webpage")
else:
print("No changes made")

previous_product = product
time.sleep(500)

previous_product已移出。在这种情况下,这并不重要,但它提高了可读性。

set(...) - set(...)的使用已被删除,因为它在从网站上删除某些内容时不会捕获,只有在添加了某些内容时才会捕获。如果某个东西先被删除,然后再重新添加,它也会被你的程序捕获。

最新更新