Веб-очищающий питон не возвращает никакого контента - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь очистить от "https://data.lacity.org/A-Safe-City/Crime-Data-from-2010-to-Present/y8tr-7khq"."написанное мной, похоже, не работает (ничего не возвращает?)

import requests
from bs4 import BeautifulSoup
url = "https://data.lacity.org/A-Safe-City/Crime-Data-from-2010-to-Present/y8tr-7khq"
page = requests.get(url)
print(page.status_code)
soup=BeautifulSoup(page.content,'html.parser')


for col in soup.find_all("div", attrs={"class":"socrata-visualization-container loaded"})[0:1]:
   for tr in col.find_all("div",attrs={"class":"socrata-table frozen-columns"}):
      for data in tr.find_all("div",attrs={"class":"column-header-content"}):
        print(data.text)

мой код неверен?

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Это потому, что данные динамически заполняются ReactJs после загрузки страницы.

Если вы загружаете его с помощью запросов, вы не можете видеть данные.

Вам необходимо использовать selenium веб-драйвер, открыть страницу и обработать весь JavaScript.Тогда вы можете получить данные, которые вы ожидаете.

0 голосов
/ 25 ноября 2018

Страница загружается динамически, а набор данных разбивается на страницы, что будет означать использование браузера для извлечения, что является медленным.Существует API, который вы можете использовать.У него есть аргументы, которые позволят вам возвращать результаты в пакетах.

Прочитайте документацию API здесь .Это будет гораздо более эффективный и надежный способ получения данных.

Используйте limit для определения # записей, извлекаемых за раз;используйте параметр offset для запуска следующего пакета для новых записей.Пример вызова здесь.

Поскольку это запрос, вы можете настроить другие параметры так же, как запрос SQL, чтобы получить желаемый набор результатов.Это также означает, что вы, вероятно, можете написать очень быстрый начальный запрос, чтобы вернуть количество записей из базы данных, которое вы можете использовать для определения конечной точки для пакетных запросов.

Вы можете написать сценарий на основе классов, который использует многопроцессорность изахватывайте эти пакеты более эффективно.

import requests
import pandas as pd
from pandas.io.json import json_normalize

response  = requests.get('https://data.lacity.org/api/id/y8tr-7khq.json?$select=`dr_no`,`date_rptd`,`date_occ`,`time_occ`,`area_id`,`area_name`,`rpt_dist_no`,`crm_cd`,`crm_cd_desc`,`mocodes`,`vict_age`,`vict_sex`,`vict_descent`,`premis_cd`,`premis_desc`,`weapon_used_cd`,`weapon_desc`,`status`,`status_desc`,`crm_cd_1`,`crm_cd_2`,`crm_cd_3`,`crm_cd_4`,`location`,`cross_street`,`location_1`&$order=`date_occ`+DESC&$limit=100&$offset=0')
data = response.json()
data = json_normalize(data)
df = pd.DataFrame(data)
print(df)

Пример записи в ответе JSON:

enter image description here

0 голосов
/ 25 ноября 2018

Если вы посмотрите на источник страницы (ctrl + U), вы заметите, что такого элемента, как <div class = "socrata-table frozen-columns">, нет.Это потому, что контент, который вы хотите удалить, динамически добавляется на страницу.Проверьте этот вопрос: веб-очистка динамического содержимого с помощью python или веб-очистка веб-сайта с динамическим содержимым JavaScript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...