【问题标题】:Webscraping data from a json source into a csvWeb 将 json 源中的数据抓取到 csv 中
【发布时间】:2019-07-18 15:52:47
【问题描述】:

我正在尝试从带有 python 的网站、网上商店获取一些信息。

我试过这个:

my_url = requests.get(https://www.telekom.hu/shop/categoryresults/?N=10994&contractType=list_price&instock_products=1&Ns=sku.sortingPrice%7C0%7C%7Cproduct.displayName%7C0&No=0&Nrpp=9&paymentType=FULL)

data = my_url.json()

name = data['MainContent'][0]['contents'][0]['productList']['products'][0]['productModel']["displayName"]
price = data['MainContent'][0]['contents'][0]['productList']['products'][0]['priceInfo']['priceItemSale']["gross"]
url= data['MainContent'][0]['contents'][0]['productList']['products'][0]['productModel']["url"]

for mc in data['MainContent']:
    for co in mc:
        for prod in co['productList']['products']:
            name = prod['productModel']['displayName']
            price = prod['priceItemSale']['gross']
            url = prod['productModel']['url']

filename = "test.csv"
csv_writer = csv.writer(open(filename, 'w'))
headers = "Name, Price, Link\n"
f.write(headers)
f.close()

在这个网上商店有很多具有这些属性“productModel”的产品,但我怎样才能得到这些并写入 csv?我想在不同的单元格中对这个页面的名称、价格和网址进行网络抓取,但它不起作用。

* 编辑:

def proba():

    my_url = requests.get('https://www.telekom.hu/shop/categoryresults/?N=10994&contractType=list_price&instock_products=1&Ns=sku.sortingPrice%7C0%7C%7Cproduct.displayName%7C0&No=0&Nrpp=9&paymentType=FULL')
    data = my_url.json()
    results = []
    products = data['MainContent'][0]['contents'][0]['productList']['products']
    for product in products:
        name = product['productModel']['displayName']
        try:
            priceGross = product['priceInfo']['priceItemSale']['gross']
        except:
            priceGross = product['priceInfo']['priceItemToBase']['gross']
        url = product['productModel']['url']
        results.append([name, priceGross, url])
    df = pd.DataFrame(results, columns = ['Name', 'Price', 'Url'])    
# print(df)  ## print df
    df.to_csv(r'/usr/src/Python-2.7.13/test.csv', sep=',', encoding='utf-8-sig',index = False )

while True:
    mytime=datetime.now().strftime("%H:%M:%S")
    while mytime < "23:59:59":
    print mytime
    proba()
    mytime=datetime.now().strftime("%H:%M:%S")

【问题讨论】:

  • 你只需要在 csv 文件中写入名称、价格、网址我是对的吗?
  • 是的,这是我的目标,逐行(每行有 3 个包含这些信息的单元格)
  • 但是“priceItemSale”键在您的每个产品中都不可用
  • 也许 priceItemToBase?
  • 我已在答案框中添加代码检查一次

标签: python json python-2.7 web-scraping request


【解决方案1】:

并非所有项目都具有相同数量的密钥,因此您无法始终使用prod['priceItemSale']['gross'] 访问。当价值不存在时,您需要决定从哪里获得价值。示例如下:

import requests
import pandas as pd

my_url = requests.get('https://www.telekom.hu/shop/categoryresults/?N=10994&contractType=list_price&instock_products=1&Ns=sku.sortingPrice%7C0%7C%7Cproduct.displayName%7C0&No=0&Nrpp=9&paymentType=FULL')
data = my_url.json()
results = []
products = data['MainContent'][0]['contents'][0]['productList']['products']
for product in products:
    name = product['productModel']['displayName']
    try:
        priceGross = product['priceInfo']['priceItemSale']['gross']
    except:
        priceGross = product['priceInfo']['priceItemToBase']['gross']
    url = product['productModel']['url']
    results.append([name, priceGross, url])
df = pd.DataFrame(results, columns = ['Name', 'Price', 'Url'])    
# print(df)  ## print df
df.to_csv(r'C:\Users\User\Desktop\Data.csv', sep=',', encoding='utf-8-sig',index = False )

输出:

【讨论】:

  • 它只写入 csv 1(只有 1 个产品)。
  • 对我来说不是。我得到 9。
  • 我循环运行它,也许它正在覆盖,这就是为什么当我停止我的“脚本”并打开 csv 时我得到 1 行?
  • 我不明白。上面已经循环了从 url 检索到的所有产品。如果您正在循环其他 url,那么您需要在写入 csv 之前修改以合并所有数据帧。
  • 我用我的代码编辑了我的问题,上面有“无穷大”的圆环。如果我使用这个,我只会得到 1 行。
【解决方案2】:
import requests
my_url = requests.get("https://www.telekom.hu/shop/categoryresults/?N=10994&contractType=list_price&instock_products=1&Ns=sku.sortingPrice%7C0%7C%7Cproduct.displayName%7C0&No=0&Nrpp=9&paymentType=FULL")

data = my_url.json()
datas=data["MainContent"][0]["contents"]
finaldata=[]
for mc in datas:
  plist=mc["productList"]["products"]
  for p in plist:
    name =p['productModel']['displayName']
    try:
      price = p['priceInfo']['priceItemToBase']['gross']
    except:
      price=p['priceInfo']['priceItemSale']['gross']
    url = p['productModel']['url']
    finaldata.append([name,price,url])
files=open("data.csv",'w+')
columns = ['Name', 'Price', 'Url']
files.write(",".join(columns))
files.write("\n")
for f in finaldata:
 files.write('{},{},{}\n'.format(f[0],f[1],f[2]))

【讨论】:

  • 但是只有 9 个元素,你能说出有多少元素(产品)
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多