Я пытаюсь определить количество лайков для наборов данных, доступных на этом веб-сайте.
Мне не удалось найти способ надежного определения и устранения взаимосвязи междузаголовок набора данных и тому подобное целое число:
, как это встроено в HTML, как показано ниже:
Ранее я использовал скребок для получения информации об URL ресурса.В этом случае мне удалось запечатлеть последнего потомка a
родителя h3
с родителем, имеющим класс .dataset-item
.
. Я хотел бы адаптировать свой существующий код, чтобы собрать количество лайков для каждогоресурс в каталоге, а не URL-адреса.Ниже приведен код скребка URL, который я использовал:
from bs4 import BeautifulSoup as bs
import requests
import csv
from urllib.parse import urlparse
json_api_links = []
data_sets = []
def get_links(s, url, css_selector):
r = s.get(url)
soup = bs(r.content, 'lxml')
base = '{uri.scheme}://{uri.netloc}'.format(uri=urlparse(url))
links = [base + item['href'] if item['href'][0] == '/' else item['href'] for item in soup.select(css_selector)]
return links
results = []
#debug = []
with requests.Session() as s:
for page in range(1,2): #set number of pages
links = get_links(s, 'https://data.nsw.gov.au/data/dataset?page={}'.format(page), '.dataset-item h3 a:last-child')
for link in links:
data = get_links(s, link, '[href*="/api/3/action/package_show?id="]')
json_api_links.append(data)
#debug.append((link, data))
resources = list(set([item.replace('opendata','') for sublist in json_api_links for item in sublist])) #can just leave as set
for link in resources:
try:
r = s.get(link).json() #entire package info
data_sets.append(r)
title = r['result']['title'] #certain items
if 'resources' in r['result']:
urls = ' , '.join([item['url'] for item in r['result']['resources']])
else:
urls = 'N/A'
except:
title = 'N/A'
urls = 'N/A'
results.append((title, urls))
with open('data.csv','w', newline='') as f:
w = csv.writer(f)
w.writerow(['Title','Resource Url'])
for row in results:
w.writerow(row)
Мой желаемый результат будет выглядеть так: