2015-11-27 6 views
2

Я написал небольшой скрипт, который принимает набор результатов ebay и сохраняет каждое из полей в другой переменной: ссылка, цена, ставки.Сохранение скребкового результирующего набора в файл csv

Как я могу взять переменные и сохранить каждый результат для каждого предмета аукциона в файл csv, где каждая строка представляет собой другой предмет аукциона?

Ex: ссылка, цена, ставка

Вот мой код до сих пор:

import requests, bs4 
import csv 
import requests 
import pandas as pd 
res = requests.get('http://www.ebay.com/sch/i.html?LH_Complete=1&LH_Sold=1&_from=R40&_sacat=0&_nkw=gerald%20ford%20autograph&rt=nc&LH_Auction=1&_trksid=p2045573.m1684') 
res.raise_for_status() 
soup=bs4.BeautifulSoup(res.text) 

# grabs the link, selling price, and # of bids from historical auctions 
links = soup.find_all(class_="vip") 
prices = soup.find_all("span", "bold bidsold") 
bids = soup.find_all("li", "lvformat") 
+0

Прежде всего, вам следует подумать о том, как извлечь нужные данные, например. 'bids' содержит больше, чем количество ставок. – albert

+0

@albert вы ссылаетесь на текст html вокруг заявки? –

+0

Да, и все другие элементы HTML вокруг данных, которые хранятся в 'link' и' prices'. – albert

ответ

2

Это должно сделать работу:

import csv 
import requests 
import bs4 

res = requests.get('http://www.ebay.com/sch/i.html?LH_Complete=1&LH_Sold=1&_from=R40&_sacat=0&_nkw=gerald%20ford%20autograph&rt=nc&LH_Auction=1&_trksid=p2045573.m1684') 
res.raise_for_status() 
soup = bs4.BeautifulSoup(res.text) 

# grab all the links and store its href destinations in a list 
links = [e['href'] for e in soup.find_all(class_="vip")] 

# grab all the bid spans and split its contents in order to get the number only 
bids = [e.span.contents[0].split(' ')[0] for e in soup.find_all("li", "lvformat")] 

# grab all the prices and store those in a list 
prices = [e.contents[0] for e in soup.find_all("span", "bold bidsold")] 

# zip each entry out of the lists we generated before in order to combine the entries 
# belonging to each other and write the zipped elements to a list 
l = [e for e in zip(links, prices, bids)] 

# write each entry of the rowlist `l` to the csv output file 
with open('ebay.csv', 'w') as csvfile: 
    w = csv.writer(csvfile) 
    for e in l: 
     w.writerow(e) 

В результате, вы Получаем csv-файл, который как разделитель , (запятая).

+0

Спасибо, Альберт за ваш пример –

+0

Если я решил вашу проблему, отметьте мой ответ, чтобы пометить свой вопрос как решенный. – albert

+0

Есть ли у вас какие-либо намеки относительно того, как я могу проанализировать существующие данные для заголовка листинга? –

0
import requests, bs4 
import numpy as np 
import requests 
import pandas as pd 

res = requests.get('http://www.ebay.com/sch/i.html? LH_Complete=1&LH_Sold=1&_from=R40&_sacat=0&_nkw=gerald%20ford%20autograph&r  t=nc&LH_Auction=1&_trksid=p2045573.m1684') 
res.raise_for_status() 
soup=bs4.BeautifulSoup(res.text, "lxml") 

# grabs the link, selling price, and # of bids from historical auctions 
df = pd.DataFrame() 


l = [] 
p = [] 
b = [] 


for links in soup.find_all(class_="vip"): 
    l.append(links) 

for bids in soup.find_all("li", "lvformat"): 
    b.append(bids) 

for prices in soup.find_all("span", "bold bidsold"): 
    p.append(prices) 

x = np.array((l,b,p)) 
z = x.transpose() 
df = pd.DataFrame(z) 
df.to_csv('/Users/toasteez/ebay.csv') 
+0

Что нужно для панд? Почему вы принимаете парсер 'lxml'? – albert

+0

Я просто предпочитаю использовать numpy и pandas. Панды в этом случае позволили мне просто написать dataframe в cvs. – toasteez

+0

Ты определенно прав. Я тоже предпочитаю это. :) Однако они обеспечивают как-то большие накладные расходы, которые в этом случае не нужны. – albert

Смежные вопросы