Python: Bagaimana Anda mengikis data harian dari web dinamis menggunakan Python?

Aug 22 2020

Kode berikut berfungsi tetapi berhenti setelah 29 Februari. Situs web mengembalikan "Anda telah memasukkan tanggal yang tidak valid. Silakan masukkan kembali pencarian Anda", yang mengharuskan mengklik "OK". Bagaimana cara mengatasi ini?

country_search("United States")
time.sleep(2)
date_select = Select(driver.find_element_by_name("dr")) 
date_select.select_by_visible_text("Enter date range...") #All Dates
select_economic_news()
#btnModifySearch
for month in range(1,9):
for day in range(1,32):
    try:
    
        set_from_month(month)
        set_from_date(day)
        set_from_year("2020")
        set_to_month(month)
        set_to_date(day)
        set_to_year("2020")
                
        time.sleep(5)
        #select_economic_news()
        time.sleep(5)
        search_now()
        time.sleep(8)                
                
        export_csv()
        modify_search()
        
        time.sleep(5)        
        #country_remove()
    except ElementClickInterceptedException:
        break

keluar()

Jawaban

derringa Aug 22 2020 at 21:07

Jika Anda hanya dapat menggunakan metode yang ditampilkan di posting awal maka saya akan mencoba sesuatu seperti:

set_from_year('2020')
set_to_year('2020')
for month in range(1, 9):
    # 1 to 9 for Jan to Aug
    month_str = '0' + str(month)
    set_from_month(month_str)
    set_to_month(month_str)
    for day in range(1, 32):
        # Assuming an error is thrown for invalid days
        try:
            # Store data as needed
        except Exception as e:
            # print(e) to learn from error if needed
            pass

Ada lebih banyak hal yang masuk ke dalam masalah ini jika ternyata Anda menulis metode ini sendiri dan perlu mengulang melalui HTML dan menemukan pola untuk data harian.

ro_ot Aug 22 2020 at 21:22

Saya yakin Anda ingin mendapatkan jumlah hari secara dinamis dalam sebulan, sehingga Anda dapat mengulang angka tersebut untuk mendapatkan data setiap tanggal. Anda dapat melakukan ini sebagai berikut:

from datetime import datetime
currentDay = datetime.today()
# You can set the currentDay using this if you want the data till the current date or 
# whenever your scheduler runs the job.


# Now you need to get the number of days in each month from the chosen date, you can 
# have the corresponding function like getStartMonth() in your program which will 
# return the starting month.  
from calendar import monthrange
daysPerMonth = {}
year = currentDay.year #TODO : change this to getStartYear()
startMonth = 3 # TODO : Implement getStartMonth() in your code.
for month in range(startMonth, currentDay.month+1):
    # monthrange returns (weekday,number of days in that month)
    daysPerMonth[month] = monthrange(year, month)[1]

for month in daysPerMonth.items(): 
    print(month[0], '-',month[1])

Ini akan menghasilkan sesuatu seperti ini ( Jumlah hari dalam sebulan dari - Maret 2020 hingga Agustus 2020 ):

3 - 31
4 - 30
5 - 31
6 - 30
7 - 31
8 - 31

Dan kemudian Anda dapat menjalankan loop selama beberapa hari sambil merujuk rentang dari dict yang Anda peroleh. CATATAN: Dalam fungsi di mana Anda menjalankan perulangan untuk mendapatkan data untuk setiap tanggal, tambahkan satu kondisi if untuk memeriksa apakah itu hari terakhir dalam setahun dan memodifikasi tahun yang sesuai.

M.Liver Aug 23 2020 at 04:57

Mungkin Anda bisa menggunakan fungsi ini untuk menghitung hari dalam sebulan:

import datetime


def get_month_days_count(year: int, month: int) -> int:
    date = datetime.datetime(year, month, 1)
    while (date + datetime.timedelta(days=1)).month == month:
        date = date + datetime.timedelta(days=1)
    return date.day