Код Python меняет местами столбцы csv при использовании 3 раза подряд (3 дня подряд)

#python-3.x #pandas #web-scraping #beautifulsoup #python-os

#python-3.x #pandas #очистка веб-страниц #прекрасный суп #python-os

Вопрос:

Получил огромную помощь в определении кода для веб-очистки конкретного веб-сайта с тендерными возможностями (для проекта колледжа). Решил применить этот код для других данных, но столкнулся с проблемой. При третьем запуске (3-й день) сгенерированный csv-файл меняет местами столбцы по сравнению с их первоначальным порядком, помещает индексные номера (не смог выяснить, как это остановить) и не записывает новые данные на 4-й день.

Цель:

  • Данные веб-очистки, которые обновляются каждый день новыми записями (данные за прошлый день удаляются).

  • Генерация CSV-файла (предпочтительно EXCEL) для исторических записей с определенным порядком столбцов и типами информации внутри них (я знаю, как изменить порядок заголовков).

Пытался изменить код, чтобы он создал excel (ничего не происходит). И это все. Кроме того, я просто вручную копирую и вставляю новые данные (что неэффективно, и именно поэтому я пытался заставить код сделать это за меня. Не знаю, как исправить индексацию (мне не нужно, чтобы она появлялась после третьего запуска).

 import pandas as pd
from bs4 import BeautifulSoup
import requests
import os

filename = "BuyandSell_V3.csvs"

# Initialize an empty 'results' dataframe
results = pd.DataFrame()

# Iterarte through the pages
for page in range(0,20):
    url = 'https://buyandsell.gc.ca/procurement-data/search/site?page='   str(page)   'amp;f[0]=sm_facet_procurement_data:data_data_tender_noticeamp;f[1]=dds_facet_date_published:dds_facet_date_published_today'

    page_html = requests.get(url).text
    page_soup = BeautifulSoup(page_html, "html.parser")
    containers = page_soup.findAll("div",{"class":"rc"})

    # Get data from each container
    if containers != []:
        for each in containers:
            title = each.find('h2').text.strip()
            publication_date = each.find('dd', {'class':'data publication-date'}).text.strip()
            closing_date = each.find('dd', {'class':'data date-closing'}).text.strip()
            gsin = each.find('dd', {'class':'data gsin'}).text.strip()
            notice_type = each.find('dd', {'class':'data php'}).text.strip()
            procurement_entity = each.find('dd', {'data procurement-entity'}).text.strip()
        

            # Create 1 row dataframe
            temp_df = pd.DataFrame([[title, publication_date, closing_date, gsin, notice_type, procurement_entity]], columns = ['Title', 'Publication Date', 'Closing Date', 'GSIN', 'Notice Type', 'Procurement Entity'])

            # Append that row to a 'results' dataframe
            results = results.append(temp_df).reset_index(drop=True)
        print ('Aquired page '   str(page 1))

    else:
        print ('No more pages')
        break


# If already have a file saved
if os.path.isfile(filename):

    # Read in previously saved file
    df = pd.read_csv(filename)

    # Append the newest results
    df = df.append(results).reset_index()

    # Drop and duplicates (incase the newest results aren't really new)
    df = df.drop_duplicates()

    # Save the previous file, with appended results
    df.to_csv(filename, index=False)

else:

    # If a previous file not already saved, save a new one
    df = results.copy()
    df.to_csv(filename, index=False)

`````` 
Expected results - parsed data into csv format with headers defined. CSV being refreshed after each run ( new day - new data to parse). 

Preferred - data is written to excel ( tried to do it but nothing happens).
``````````
  

Ответ №1:

если вы хотите, чтобы он был записан в виде файла Excel вместо csv, измените на:

 filename = "BuyandSell_V3.xls"

df = pd.read_excel(filename)

df.to_excel(filename, index=False)
  

чтобы в ваших столбцах не было индекса, вам нужно удалить их при сбросе индекса (что вы сделали ранее с вашим results фреймом данных, но не позже:

 df = df.append(results).reset_index(drop=True)
  

Что касается других проблем, я не совсем уверен, что вы описываете или происходит, что он не работает на 4-й день и / или столбцы меняются местами.

 import requests
import pandas as pd
from bs4 import BeautifulSoup
import os

filename = "BuyandSell_V3.xls"

# Initialize an empty 'results' dataframe
results = pd.DataFrame()


# Iterarte through the pages
for page in range(0,20):
    url = 'https://buyandsell.gc.ca/procurement-data/search/site?page='   str(page)   'amp;f[0]=sm_facet_procurement_data:data_data_tender_noticeamp;f[1]=dds_facet_date_published:dds_facet_date_published_today'

    page_html = requests.get(url).text
    page_soup = BeautifulSoup(page_html, "html.parser")
    containers = page_soup.findAll("div",{"class":"rc"})

    # Get data from each container
    if containers != []:
        for each in containers:
            title = each.find('h2').text.strip()
            publication_date = each.find('dd', {'class':'data publication-date'}).text.strip()
            closing_date = each.find('dd', {'class':'data date-closing'}).text.strip()
            gsin = each.find('dd', {'class':'data gsin'}).text.strip()
            notice_type = each.find('dd', {'class':'data php'}).text.strip()
            procurement_entity = each.find('dd', {'data procurement-entity'}).text.strip()


            # Create 1 row dataframe
            temp_df = pd.DataFrame([[title, publication_date, closing_date, gsin, notice_type, procurement_entity]], columns = ['Title', 'Publication Date', 'Closing Date', 'GSIN', 'Notice Type', 'Procurement Entity'])

            # Append that row to a 'results' dataframe
            results = results.append(temp_df).reset_index(drop=True)
        print ('Aquired page '   str(page 1))

    else:
        print ('No more pages')
        break


# If already have a file saved
if os.path.isfile(filename):

    # Read in previously saved file
    df = pd.read_excel(filename)

    # Append the newest results
    df = df.append(results).reset_index(drop=True)

    # Drop and duplicates (incase the newest results aren't really new)
    df = df.drop_duplicates()

    # Save the previous file, with appended results
    df.to_excel(filename, index=False)

else:

    # If a previous file not already saved, save a new one
    df = results.copy()
    df.to_excel(filename, index=False)
  

Комментарии:

1. Привет @chitown88, итак, я использовал код 3 дня подряд, и на 3-й день столбцы перепутались. Я сам изменил порядок ( см. Ниже ) ~~~ temp_df = pd.DataFrame([[procurement_entity, заголовок, publication_date, closing_date, ссылка]], столбцы = [‘Объект закупки’, ‘Заголовок’, ‘Дата публикации’, ‘Дата закрытия’, ‘Ссылка’]) ~~~ Это отлично работает 2 дня подряд, но на 3-й день порядок выглядит следующим образом: дата закрытия, ссылка, Сущность, Дата публикации, заголовок, индекс, а затем столбец с именем Level_0 (понятия не имею, что это). Можете ли вы посоветовать, как я мог бы это исправить?

2. Это странно. Я должен буду попытаться понять, почему это так.

3. Итак, когда я применил ваше значение drop = True для добавления результатов, появляется еще один столбец с числами. Я не использовал это изменение в течение первых 2 дней. Это произошло в первый раз, когда вы помогли мне со скриптом, и сейчас. Единственными изменениями были ваше значение drop = True и я изменил последовательность столбцов.

4. О да. Если у вас нет drop= True, он добавит столбец