import pandas as pd, numpy as np, time, os,datetime as dt
import json, base64, requests
import concurrent.futures as threads
from bs4 import BeautifulSoup
pd.set_option('display.float','{:,.0f}'.format)
def get_data(lst_date):
lst_table=['ctl22_GridView_TauRoi','ctl22_GridView_TauDiChuyen','ctl22_GridView_TauDen'] ### ID của 3 bảng
lst_index=[13,14,14] #### Số cột của 3 bảng
User_Agent=r'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
Content_Type,Host=r'application/x-www-form-urlencoded',r'cangvuhanghaitphcm.gov.vn'
lst=['__EVENTTARGET','__EVENTARGUMENT','__VIEWSTATE','__VIEWSTATEGENERATOR','__EVENTVALIDATION','ctl43$txtSearch','ctl22$txtDate','ctl22$txtDate$dateInput','ctl22_txtDate_dateInput_ClientState','ctl22_txtDate_calendar_SD','ctl22_txtDate_calendar_AD','ctl22_txtDate_ClientState','ctl22$btnSearch']
url=r'http://cangvuhanghaitphcm.gov.vn/index.aspx?page=shipschedule&cat=2033'
session=requests.session() #### tạo session lưu cookie cho các lần request sau
req=session.get(url)
soup=BeautifulSoup(req.text,'html.parser')
lst2=[]
for type in lst:
try:
type=soup.find('input',{'id':type.replace('$','_')}).get('value') #### get các tham số của lst
except:
type=''
lst2.append(type)
date_current,date_current_2,date_current_3,date_min,date_max=lst_date[0],lst_date[1],lst_date[2],'1980-01-01','2099-12-31'
lst2[6]=date_current
lst2[7]=date_current_2
lst2[8]='{'+f'"enabled":true,"emptyMessage":"","validationText":"{date_current}-00-00-00","valueAsString":"{date_current}-00-00-00","minDateStr":"{date_min}-00-00-00","maxDateStr":"{date_max}-00-00-00","lastSetTextBoxValue":"{date_current_2}"'+'}'
lst2[9],lst2[11]=f'[[{date_current_3}]]',''
# param=''.join([lst[i]+':'+lst2[i] for i in range(len(lst))])#### chuyển tham số sang type string
dic={} #### chuyển tham số sang type dic (sẽ tự encode khi đưa request lên server)
for i,key in enumerate(lst):
dic[key]=lst2[i]
req=session.post(url,data=dic, headers={'User-Agent':User_Agent,'Content-Type':Content_Type,'Host':Host}) #### gửi request với tham số thay đổi theo ngày với session ban đầu
req.close()
soup=BeautifulSoup(req.text,'html.parser')
lst_df=[pd.DataFrame(),pd.DataFrame(),pd.DataFrame()]
for i,type in enumerate(lst_table):
table=soup.find('table',{'id':type})
if table:
b=table.findAll('td')
lst_01=[]
for c in b:
lst_01.append(c.text)
df=pd.DataFrame(np.array(lst_01).reshape(-1,lst_index[i]),columns=[header.text for header in table.findAll('th')]) #### chuyển dữ liệu thành list và convert thành table
df['Date'],df['Type']=date_current,type.split('_')[2]
lst_df[i]=lst_df[i].append(df)
return lst_df
t=time.perf_counter()
lst_df=[]
f_date,t_date='2021-06-28','2021-07-03'
date_range=pd.date_range(f_date,t_date,freq='D')
date_range01=[dt.date.strftime(_date,'%Y-%m-%d') for _date in date_range] #### format date dạng 1
date_range02=[dt.date.strftime(_date,'%d/%m/%Y') for _date in date_range] #### format date dạng 2
date_range03=[dt.date.strftime(_date,'%Y,%m,%d') for _date in date_range] #### format date dạng 3
lst_range=list(zip(*[date_range01,date_range02,date_range03])) #### Transpose mảng 2 chiều
with threads.ThreadPoolExecutor() as executor: #### sử dụng đa luồng
results=[]
for _date in lst_range: #### Tạo các luồng request
results.append(executor.submit(get_data,_date))
time.sleep(0.02) #### Đặt thời gian chờ cho các luồng
for result in threads.as_completed(results):
lst_df.append(result.result()) #### Combine kết quả các luồng khi hoàn thành
lst_df=list(zip(*lst_df)) #### Transpose mảng 2 chiều
lst_df=[pd.concat(lst) for lst in lst_df] #### chuyển kết quả thành DataFrame (bảng)
writer = pd.ExcelWriter('Data_web.xlsx') #### Lưu kết quả vào excel
for i,df in enumerate(lst_df):
df.to_excel(writer, 'Data_'+'%02i'%(i+1),index=0)
writer.save(),writer.close()
# os.system('Data_web.xlsx') #### Xuất excel
os.startfile('Data_web.xlsx') #### Xuất excel
time.perf_counter()-t