Python: Làm cách nào để thu thập dữ liệu hàng ngày từ web động bằng Python?

Aug 22 2020

Mã sau hoạt động nhưng dừng sau ngày 29 tháng 2. Trang web trả về "bạn đã nhập ngày không hợp lệ. Vui lòng nhập lại tìm kiếm của bạn", bạn cần nhấp vào "OK". Làm cách nào để giải quyết vấn đề này?

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

đăng xuất()

Trả lời

derringa Aug 22 2020 at 21:07

Nếu bạn chỉ có thể sử dụng các phương pháp được nêu trong bài đăng đầu tiên thì tôi sẽ thử một cái gì đó như:

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

Còn rất nhiều điều khác liên quan đến vấn đề này nếu hóa ra bạn đang tự viết các phương pháp này và cần lặp qua HTML và tìm một mẫu cho dữ liệu hàng ngày.

ro_ot Aug 22 2020 at 21:22

Tôi tin rằng bạn muốn lấy động số ngày trong một tháng, để bạn có thể lặp lại số đó để lấy dữ liệu cho mỗi ngày. Bạn có thể làm điều này như sau:

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])

Điều này sẽ xuất ra một thứ như thế này ( Số ngày trong tháng từ - tháng 3 năm 2020 đến tháng 8 năm 2020 ):

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

Và sau đó, bạn có thể chạy một vòng lặp trong số ngày trong khi tham chiếu phạm vi từ mệnh lệnh mà bạn đã thu được. LƯU Ý: Trong chức năng bạn đang chạy vòng lặp để lấy dữ liệu cho mỗi ngày, hãy thêm điều kiện if để kiểm tra xem đó có phải là ngày cuối cùng của năm hay không và sửa đổi năm cho phù hợp.

M.Liver Aug 23 2020 at 04:57

Có thể Bạn có thể sử dụng hàm này để tính số ngày trong tháng:

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