Как сделать цикл разбиения на страницы, который очищает определенное количество страниц (страницы меняются изо дня в день) - PullRequest
0 голосов
/ 28 марта 2019

Резюме

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

https://buyandsell.gc.ca/procurement-data/search/site?f%5B0%5D=sm_facet_procurement_data%3Adata_data_tender_notice&f%5B1%5D=dds_facet_date_published%3Adds_facet_date_published_today

Bacground

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

Уровень знаний Python: начинающий, изучите «трудный путь» через youtube и googling.Нашел пример, который работал для моего уровня понимания, но у него были проблемы с объединением различных решений людей.

Код на данный момент

импорт bs4 из urllib.request импорт urlopen как uReq из bs4 импорт BeautifulSoup в виде супа

проблема начинается здесь

for page in range (1,3):my_url = 'https://buyandsell.gc.ca/procurement-data/search/site?f%5B0%5D=sm_facet_procurement_data%3Adata_data_tender_notice&f%5B1%5D=dds_facet_date_published%3Adds_facet_date_published_today'

uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "html.parser")
containers = page_soup.findAll("div",{"class":"rc"})

эта часть не записывается в дополнение к существующим позициям

filename = "BuyandSell.csv"
f = open(filename, "w")
headers = "Title, Publication Date, Closing Date, GSIN, Notice Type, Procurement Entity\n"
f.write(headers)

for container in containers:
    Title = container.h2.text

    publication_container = container.findAll("dd",{"class":"data publication-date"})
    Publication_date = publication_container[0].text

    closing_container = container.findAll("dd",{"class":"data date-closing"})
    Closing_date = closing_container[0].text

    gsin_container = container.findAll("li",{"class":"first"})
    Gsin = gsin_container[0].text

    notice_container = container.findAll("dd",{"class":"data php"})
    Notice_type = notice_container[0].text

    entity_container = container.findAll("dd",{"class":"data procurement-entity"})
    Entity = entity_container[0].text

    print("Title: " + Title)
    print("Publication_date: " + Publication_date)
    print("Closing_date: " + Closing_date)
    print("Gsin: " + Gsin)
    print("Notice: " + Notice_type)
    print("Entity: " + Entity)

    f.write(Title + "," +Publication_date + "," +Closing_date + "," +Gsin + "," +Notice_type + "," +Entity +"\n")

f.close()

Пожалуйста, дайте мне знать, если вы хотитесмотри дальше.Отдых - это определение контейнеров данных, которые обнаруживаются в HTML-коде и печатаются в csv. Любая помощь / совет будут высоко оценены.Спасибо!

Фактические результаты:

Код генерирует файл CSV только для первой страницы.

Код не записывает поверх того, что уже было отсканировано (изо дня в день), по крайней мере

Ожидаемые результаты:

Код сканирует следующие страницы и распознает, когда их нетстраниц для просмотра.

CSV-файл будет генерировать 10 строк CSV на страницу.(И сколько бы ни было на последней странице, так как число не всегда 10).

Код будет писать поверх того, что уже было очищено (для более сложной аналитики с использованием инструментов Excel с историческими данными)

1 Ответ

0 голосов
/ 28 марта 2019

Кто-то может сказать, что использование панд - это излишне, но лично мне удобно его использовать, и мне нравится использовать его для создания таблиц и записи в файл.

возможно, есть и более надежный способ перехода от страницы к странице, но я просто хотел донести это до вас, и вы можете работать с ним.

На данный момент я просто жестко запрограммировал значение следующей страницы (и я просто произвольно выбрал не более 20 страниц). Поэтому он начинается со страницы 1, а затем перебирает 20 страниц (или останавливается, как только добирается до неверная страница).

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

filename = "BuyandSell.csv"

# 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)
...