Невозможно извлечь широту/долготу с веб-сайта

Я новичок в потоке укладчиков, и это мой первый пост, поэтому я надеюсь, что смогу хорошо объясниться, и вы сможете мне помочь! Заранее спасибо за вашу помощь!! Я использую Scrapy для очистки популярного веб-сайта с реальными заявлениями из моей родной страны. У меня все хорошо со всеми характеристиками, которые я хочу, такими как цена, площадь, спальни и другие. Но я не смог получить широту/долготу свойства. На сайте, например, https://www.portalinmobiliario.com/MLC-564988630-estilo-mariposa-_JM#position=2&type=item&tracking_id=ed337e69-9999-4ede-b393-ef378e1a5675 можно найти расположение на карте Google, как показано на изображении, и внутри этого HTML-элемента можно получить широту/долготу (выделено синим цветом), но когда я пытаюсь добраться до этого элемента в своем коде, паук не распознает его.

Используя этот селектор css crs_location = response.css('div.map-container img:nth-child(1)').getall(), я могу получить первый img внутри div, получая следующий вывод https://http2.mlstatic.com/resources/frontend/web-vip/ui-dist/images/pin-real-estate-d1ebb73e65.svg, но когда я меняю nth-child на: crs_location = response.css('div.map-container img:nth-child(2)').getall() чтобы получить второй дочерний элемент (то, что я хочу), переменная crs_location пуста .

Я ценю это, если вы можете помочь выяснить, как получить широту / долготу этого. Спасибо!

HTML-элементы

Полный код: импортировать скрейп из селектора импорта скраппи запросы на импорт импортировать панд как pd импортировать numpy как np

# Import the CrawlerProcess
from scrapy.crawler import CrawlerProcess

# Create the Spider class
class Spider_Inmob(scrapy.Spider):
  name = 'spider_inmob'
  #download_delay = 3
  # start_requests method
  def start_requests( self ):
    headers= {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0'}
    i=1
    page=0
    for y in range(1):
      url = 'http://portalinmobiliario.com/venta/departamento/propiedades-usadas/providencia-metropolitana/_Desde_' + str(page)
      print("----------PRUEBA1--------------" + str(page))
      page = 51 + 50*i
      i+=1
      yield scrapy.Request(url = url, callback=self.parse, headers=headers)
      
  
  
  def parse(self, response):
    global aux3
    links_busqueda = response.css('ol.ui-search-layout > li.ui-search-layout__item a.ui-search-result__content.ui-search-link::attr(href)').getall()
    print(len(links_busqueda))
    for url in links_busqueda:
      aux3 = aux3+1
      print(aux3)
      yield response.follow(url=url, callback = self.parse_propiedad, meta = {'dont_redirect': True, 'handle_httpstatus_list':[302]})
    
  def parse_propiedad(self,response):
    global aux2
    aux2 = aux2+1
    global crs_Bedroom, crs_Currency, crs_Link, crs_Parking, crs_Price, crs_Restroom, crs_Storage, crs_Total_Surface, crs_Useful_Surface, crs_location
    #print ("Number iteration " + str(aux2))
    global Nombre_variables
    #print('-------------------------PRUEBAAAA------1---------------')
    aux=1
    crs_prueba = response.css('header.item-title > h1.item-title__primary::text').getall()
    #print(crs_prueba)
    #This for goes over each characteristic for property like, total surface, bedrooms, bathrooms, etc
    for i in range(20):
      variable = response.css('section.specs-container > ul.specs-list  li.specs-item:nth-child('+ str(i) +') > strong::text').getall()
      variable2 = response.css('section.specs-container > ul.specs-list  li.specs-item:nth-child('+ str(i) +') > span::text').getall()
      np_variable = np.array(variable)
      if not variable:
        a=0
      else:
        for var in Nombre_variables:
          if np_variable[0] == "Superficie total":
            crs_Total_Surface = variable2
          elif np_variable[0] == "Superficie útil":
            crs_Useful_Surface = variable2
          elif np_variable[0] == "Dormitorios":
            crs_Bedroom = variable2
          elif np_variable[0] == "Baños":
            crs_Restroom = variable2
          elif np_variable[0] == "Estacionamientos":
            crs_Parking = variable2
          elif np_variable[0] == "Bodegas":
            crs_Storage = variable2
   # print(crs_Storage)

    #print("----------------PRUEBA--------------2--------------------")

    crs_Link = response.url
    crs_location = response.css('div.map-container  img:nth-child(2)').getall()
    print("/n/n/n")
    print(crs_location)
    print("/n/n/n")
    # Ass we have two kind of currency, we transform everything to UF currency
    variable3 = response.css('fieldset.item-price  span.price-tag > span.price-tag-symbol::text').getall()
    np_variable3 = np.array(variable3)
  #  print(np_variable3[0])
    if np_variable3[0] != "UF":
      crs_Currency = "$"
      variable4 = response.css('fieldset.item-price  span.price-tag > span.price-tag-fraction::text').getall()
      variable4= str(variable4).strip("['']")
    #  print(variable4)
      variable4= str(variable4).replace(".","")
     # print(variable4)
     # print(type(variable4))
      np_variable4 = np.array(variable4)
      variable4 = float(variable4)
     # print(variable4)
      crs_Price = round(variable4/28500,0)
    else:
      crs_Currency = response.css('fieldset.item-price  span.price-tag > span.price-tag-symbol::text').getall()
      crs_Price = response.css('fieldset.item-price  span.price-tag > span.price-tag-fraction::text').getall()
     



    df2 = {'Link':[crs_Link],
          'Currency':[crs_Currency], 
          'Price':[crs_Price],
          'Total Surface':[crs_Total_Surface],
          'Useful Surface':[crs_Useful_Surface],
          'Location':[crs_location], 
          'Bedroom':[crs_Bedroom],
          'Restroom':[crs_Restroom],
          'Parking':[crs_Parking],
          'Storage':[crs_Storage]}
   # print(df2)
   # print('-------------------------PRUEBAAAA---------------')
    global df3
    df3 = df3.append(df2, ignore_index=True)
    
    #print(df3.head())



#Name of variables to take in consideration
Nombre_variables =["Superficie total", "Superficie útil", "Dormitorios", "Baños", "Estacionamientos", "Bodegas"]
Dict_Nombre_variables = {}

#initialize DataFrame
headers = ["Link","Currency", "Price", "Total Surface","Useful Surface", "Location", "Bedroom", "Restroom", "Parking", "Storage"]
df_data = pd.DataFrame(columns=headers)
headers = ["Link","Currency", "Price", "Total Surface","Useful Surface", "Location", "Bedroom", "Restroom", "Parking", "Storage"]
df3 = pd.DataFrame(columns=headers)
#Initialize global variables used in methods
aux2=0
crs_Link=0
crs_Currency=0
crs_Price=0
crs_Total_Surface=0
crs_Useful_Surface=0
crs_location=0
crs_Bedroom=0
crs_Restroom=0
crs_Parking=0
crs_Storage =0
aux3=0
# Run the Spider
process = CrawlerProcess({'USER_AGENT': 'hol'})
process.crawl(Spider_Inmob)
process.start()
path = "D:\\0. Documentos\\7. DataCamp\\1. WebScraping\\99. Ejemplos\\PortalInmob.csv"
df3.to_csv(path)
print(df3.head())
print(df3)
print(df3['Location'])

Пожалуйста, поделитесь кодом, который не работает, и что вы пытались сделать, чтобы решить вашу проблему.

PeterK 12.12.2020 19:43

Просто поделился. Я все еще работаю над этим, поэтому в некоторых частях может быть беспорядок, но моя проблема особенно связана со строкой crs_location. Спасибо за вашу помощь!

fadom 12.12.2020 20:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Довольно тривиально с запросами и регулярными выражениями, поскольку мы знаем, что это единственная широта/долгота на странице, и мы знаем формат URL. Мы можем захватить часть URL-адреса с широтой и долготой, используя регулярное выражение, и разделить его на части.

import requests
import re
url = 'https://www.portalinmobiliario.com/MLC-564988630-estilo-mariposa-_JM#position=2&type=item&tracking_id=ed337e69-9999-4ede-b393-ef378e1a5675'

r = requests.get(url).text

lat, lon = re.findall(r'center=(-?\d+\.\d+\%2C-?\d+\.\d+)',r)[0].split('%2C')

Другие вопросы по теме