Код Python заменяет столбцы CSV при использовании 3 раза подряд (3 дня подряд) - PullRequest
0 голосов
/ 23 апреля 2019

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

Цель:

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

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

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

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) + '&f%5B0%5D=sm_facet_procurement_data%3Adata_data_tender_notice&f%5B1%5D=dds_facet_date_published%3Adds_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 Ответ

0 голосов
/ 24 апреля 2019

, если вы хотите, чтобы он записывался как файл 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) + '&f%5B0%5D=sm_facet_procurement_data%3Adata_data_tender_notice&f%5B1%5D=dds_facet_date_published%3Adds_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)
...