Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4963fa9bca | ||
|
|
5e249279c9 |
+100
@@ -0,0 +1,100 @@
|
|||||||
|
from fp2_14 import get_product_prices
|
||||||
|
import h5py
|
||||||
|
import pandas as pd
|
||||||
|
import datetime
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
import ntplib
|
||||||
|
import arrow
|
||||||
|
import concurrent.futures
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
# Define the subset of urls
|
||||||
|
url_list = [
|
||||||
|
'https://www.sayweee.com/en/product/Want-Want-Senbei-Rice-Crackers/17119',
|
||||||
|
'https://www.sayweee.com/en/product/Lays-Potato-Chips-Cucumber-Flavor/51261',
|
||||||
|
'https://www.sayweee.com/en/product/Glico-Pocky-Cookies-and-Cream-Family-Pack/79467',
|
||||||
|
'https://www.sayweee.com/en/product/Xiang-Na-Lan-Thai-Jasmine-Rice/19566?category=dried01',
|
||||||
|
'https://www.sayweee.com/en/product/Sekka-Premium-Japanese-Medium-Grain-Rice/81224',
|
||||||
|
'https://www.sayweee.com/en/product/Big-Green-Spring-Farm-Organic-Millet/90991?category=dried02',
|
||||||
|
'https://www.sayweee.com/en/product/Liuzhou-Guangxi-Specialty-LuoSiFen-Hot-Spicy-Noodles/95442?category=instant01',
|
||||||
|
'https://www.sayweee.com/en/product/House-Foods-Firm-Tofu-/85175?trace_id=c93f3d1a-80a4-4e1a-8d41-a402ae43186f',
|
||||||
|
'https://www.sayweee.com/en/product/Lactaid-Lactose-Free-2--Reduced-Fat-Milk/95353',
|
||||||
|
'https://www.sayweee.com/en/product/Washington-Fuji-Apples/94817?category=fruits03',
|
||||||
|
'https://www.sayweee.com/en/product/Formosa-Pork-Sung-/23528?trace_id=3c143dd4-4a35-4e8d-93ee-d91f209717e7'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# Define the function to run the scraper
|
||||||
|
def run_scraper(url):
|
||||||
|
project_id = "fp-20230425"
|
||||||
|
subscription_name = "fp-subscription-NFL-zipcodes"
|
||||||
|
df_new = get_product_prices(project_id, subscription_name, url)
|
||||||
|
|
||||||
|
# Add timestamp to the new dataframe "df_new"
|
||||||
|
'''
|
||||||
|
To deal with the issue of inconsistent time when running a script on different systems, we can use 'ntplib' that
|
||||||
|
provides time synchronization with a reliable time server.
|
||||||
|
Also, to ensure that the local time is interpreted in the system's local time zone, we use 'arrow' which offers a
|
||||||
|
sensible and human-friendly approach to format and convert the timestamps.
|
||||||
|
'''
|
||||||
|
# Fetch the time from an NTP server
|
||||||
|
ntp_client = ntplib.NTPClient()
|
||||||
|
response = ntp_client.request('pool.ntp.org')
|
||||||
|
ntp_time = datetime.fromtimestamp(response.tx_time)
|
||||||
|
timestamp = arrow.get(ntp_time).to('local')
|
||||||
|
df_new['Timestamp'] = timestamp
|
||||||
|
|
||||||
|
# Append 'df_new' to the existing df stored in the key
|
||||||
|
df_update = df_new.append(df_new, ignore_index=True)
|
||||||
|
|
||||||
|
return df_update
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
# When using sys to call the 'get_product_prices' function
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Check if the required command-line arguments are provided
|
||||||
|
if len(sys.argv) < 4:
|
||||||
|
print("Usage: python test_fp2_14.py project_id subscription_name url")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
project_id = sys.argv[1]
|
||||||
|
subscription_name = sys.argv[2]
|
||||||
|
url = sys.argv[3:]
|
||||||
|
|
||||||
|
get_product_prices(project_id, subscription_name, url)
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Determine the number of available CPUs
|
||||||
|
# cpu_count = multiprocessing.cpu_count()
|
||||||
|
|
||||||
|
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
|
||||||
|
future_to_url = {executor.submit(run_scraper, url): url for url in url_list}
|
||||||
|
results = []
|
||||||
|
for future in concurrent.futures.as_completed(future_to_url):
|
||||||
|
url = future_to_url[future]
|
||||||
|
try:
|
||||||
|
result = future.result()
|
||||||
|
print(f"Scraped data for URL: {url}")
|
||||||
|
results.append(result)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Failed to scrape data for URL: {url}\nError: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
# Now we have the new dataframe "df_update" recording the new price listed in weee's page
|
||||||
|
# Load such data in the existing HDF5 file
|
||||||
|
file_path = 'product1.h5'
|
||||||
|
with pd.HDFStore(file_path) as store:
|
||||||
|
for url, result in zip(url_list, results):
|
||||||
|
# Extract the product ID from the URL
|
||||||
|
product_id = url.split("/")[-1][:5]
|
||||||
|
|
||||||
|
# Save the dataframe to the HDF5 file with a unique key
|
||||||
|
key = f'df_{product_id}'
|
||||||
|
store[key] = result
|
||||||
|
result.to_hdf('product_data.h5', key=key, mode='a')
|
||||||
|
print("Data appended and saved successfully.")
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---- BEGIN SSH2 PUBLIC KEY ----
|
||||||
|
Comment: "rsa-key-20230531"
|
||||||
|
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEZW0iQpBPPRGM7QCdc3GqefkqUqq5i727
|
||||||
|
MEYvf7gy0h7Zvz72cvnDtnVF6MknCGVZ1S3uY+HeKUtujE3+z9tJ5zIxO+TxthJe
|
||||||
|
8gbH9MUkElKX8qJN/nF1H4dLiW+77ARsT70rDoHayWccGGnwC/Gs9xXVF+Ni0JD5
|
||||||
|
TKcGoye3Ps2Ni/KJAzkn78JyfrAb+Ail4DG4snCf1q/jXTuB39qYTTg94FJEqwe1
|
||||||
|
dhPIzRiOjFT3eSmHAXdSuAXFjpXAq+bV8R2uxKsgNfvxyV4vlKwFhYTq+kHwDWX7
|
||||||
|
RtLQUUs8mSTfbnL2LuE+T2d8sBtj9wi+gODFl5dDAVZkmuKrRgLF
|
||||||
|
---- END SSH2 PUBLIC KEY ----
|
||||||
Reference in New Issue
Block a user