Use pasted Booking.com search URL to pin scrape destination
The location_search_url column existed but was dead — the scraper always rebuilt the URL from the free-text location name. Now the Location Configuration form takes a "Booking.com search URL" field: paste the address-bar URL from a real search and the scraper lifts ss/dest_id/ dest_type from it (the most reliable destination pin). Falls back to dest_id, then plain name. Server also extracts dest_id from the URL for the column and derives a display name from ss when none is typed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
9e5728efb1
commit
579a189cb8
5 changed files with 97 additions and 24 deletions
|
|
@ -319,7 +319,8 @@ const StatusPanel: React.FC<{ status: ScraperStatus | undefined, isLoading: bool
|
|||
const SettingsTab: React.FC = () => {
|
||||
const queryClient = useQueryClient()
|
||||
const [locationName, setLocationName] = useState('')
|
||||
const [pages, setPages] = useState(2)
|
||||
const [searchUrl, setSearchUrl] = useState('')
|
||||
const [pages, setPages] = useState(1)
|
||||
const [adults, setAdults] = useState(2)
|
||||
const [scrapeFrom, setScrapeFrom] = useState(() => fmtDate(new Date()))
|
||||
const [scrapeTo, setScrapeTo] = useState(() => {
|
||||
|
|
@ -359,6 +360,7 @@ const SettingsTab: React.FC = () => {
|
|||
mutationFn: async () => {
|
||||
return (await api.post('/competitors/config/location', {
|
||||
location_name: locationName,
|
||||
location_search_url: searchUrl || undefined,
|
||||
pages_to_scrape: pages,
|
||||
adults: adults,
|
||||
})).data
|
||||
|
|
@ -366,6 +368,7 @@ const SettingsTab: React.FC = () => {
|
|||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['scraper-status'] })
|
||||
setLocationName('')
|
||||
setSearchUrl('')
|
||||
},
|
||||
})
|
||||
|
||||
|
|
@ -416,6 +419,23 @@ const SettingsTab: React.FC = () => {
|
|||
style={inputStyle}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div style={{ marginTop: '12px' }}>
|
||||
<label style={inputLabelStyle}>Booking.com search URL (recommended)</label>
|
||||
<input
|
||||
type="text"
|
||||
value={searchUrl}
|
||||
onChange={e => setSearchUrl(e.target.value)}
|
||||
placeholder="https://www.booking.com/searchresults.html?ss=…&dest_id=…"
|
||||
style={inputStyle}
|
||||
/>
|
||||
<p style={{ fontSize: '12px', color: 'var(--text-mid)', margin: '6px 0 0' }}>
|
||||
Search your area on booking.com and paste the address-bar URL here. It pins the
|
||||
exact destination (a plain name can resolve to the wrong place). Dates and paging
|
||||
are set automatically — only the destination is read from the URL.
|
||||
</p>
|
||||
</div>
|
||||
<div style={{ ...styles.formRow, marginTop: '12px' }}>
|
||||
<div style={styles.formGroupSmall}>
|
||||
<label style={inputLabelStyle}>Pages</label>
|
||||
<input
|
||||
|
|
@ -441,10 +461,10 @@ const SettingsTab: React.FC = () => {
|
|||
</div>
|
||||
<button
|
||||
onClick={() => setLocationMutation.mutate()}
|
||||
disabled={!locationName || setLocationMutation.isPending}
|
||||
disabled={(!locationName && !searchUrl) || setLocationMutation.isPending}
|
||||
style={mergeStyles(
|
||||
buttonStyle('primary'),
|
||||
{ marginTop: '16px', opacity: !locationName ? 0.5 : 1 }
|
||||
{ marginTop: '16px', opacity: (!locationName && !searchUrl) ? 0.5 : 1 }
|
||||
)}
|
||||
>
|
||||
{setLocationMutation.isPending ? 'Saving...' : 'Set Location'}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue