Как получить href и сопутствующую информацию с помощью scrapy?

Я новичок в scrapy, но некоторое время использую python. Я извлек урок из документации scrapy вместе с селекторами xpath. Теперь я хотел бы превратить знания, чтобы сделать небольшой проект. Я пытаюсь удалить job links and the associated info like job title, location, emails (if any), phone numbers (if any) с доски объявлений https://www.germanystartupjobs.com/ с помощью скрейпа.

У меня есть этот стартовый код,

import scrapy   

class GermanSpider(scrapy.Spider):

    # spider name 
    name = 'germany'

    # the first page of the website 
    start_urls= ['https://www.germanystartupjobs.com/']
    print start_urls

    def parse(self, response):
        pass 

    def parse_detail(self, response):
        pass 

и запустит паука scrapy runspider germany

Внутри функции parse я хотел бы получить hrefs и детали внутри функции parse_detail.

Когда я открыл упомянутую страницу с chrome инструментами разработчика и просмотрел перечисленные задания, я увидел, что все задания находятся внутри этого ul

<ul id="job-listing-view" class="job_listings job-listings-table-bordered">

а затем отдельные задания перечислены во множестве внутри divs

<div class="job-info-row-listing-class"> со связанной информацией, например, href находится внутри <a href="https://www.germanystartupjobs.com/job/foodpanda-berlin-germany-2-sem-manager-mf/">

Другое divs указывает должность, название компании, местонахождение и т. д. с divs, например

          <div>
            <h4 class="job-title-class">
              SEM Manager (m/f)            </h4>
          </div>

          <div class="job-company-name">
            <normal>foodpanda<normal>          </normal></normal></div>
          </div>

  <div class="location">
      <div class="job-location-class"><i class="glyphicon glyphicon-map-marker"></i>
        Berlin, Germany          </div>
    </div>

Первым шагом будет получение href с помощью функции parse, а затем соответствующей информации внутри parse_details с помощью response. Я обнаружил, что номера email и phone предоставляются только тогда, когда вы открываете ссылки из href, но заголовок и местоположение указываются внутри текущего divs той же страницы.

Как я уже упоминал, у меня хорошие навыки программирования на python, но я борюсь с использованием xpath даже после того, как у меня есть этот руководство. Как найти ссылки и сопутствующую информацию? Некоторый пример кода с небольшим объяснением очень поможет.

Я пытаюсь использовать код

    # firstly 
    for element in response.css("job-info-row-listing-class"):

        href = element.xpath('@href').extract()[0]
        print href
        yield scrapy.Request(href, callback=self.parse_detail)

    # secondly 
    values = response.xpath('//div[@class="job-info-row-listing-class"]//a/text()').extract()

    for v in values:
        print v


    # 
    values = response.xpath('//ul[@id="job-listing-view"]//div[@class="job-info-row-listing-class"]//a/text()').extract()

Кажется, они пока ничего не возвращают после запуска паука с помощью scrapy runspider germany


person Chak    schedule 15.12.2016    source источник


Ответы (1)


Вы, вероятно, не сможете так легко извлечь информацию с этого сайта, так как фактические списки вакансий загружаются в виде POST-запроса.

Откуда ты это знаешь?

  • Введите scrapy shell "https://www.germanystartupjobs.com/" в выбранном вами терминале. (Это открывает, как вы уже догадались, оболочку, которую настоятельно рекомендуется при первом запуске парсинга веб-сайта. Там вы можете попробовать функции, xpaths и т. д.)
  • В оболочке введите view(response). Откроется ответ, полученный в вашем браузере по умолчанию.
  • Когда страница завершит загрузку, вы увидите, что списков вакансий нет. Это потому, что они загружаются через POST-запрос.

Как узнать, что это за запрос? (Я работаю с Firebug для FireFox, не знаю, как это работает в Chrome)

  • Запустите firebug (например, щелкнув элемент правой кнопкой мыши и выбрав Inspect with Firebug. Это откроет Firebug, который по сути похож на инструменты разработчика в Chrome. Я предпочитаю его.
  • Здесь вы можете щелкнуть вкладку Network. Если там ничего нет, перезагрузите страницу.
  • Теперь вы должны увидеть запрос, с которым загружаются списки вакансий.

В этом случае запрос к https://www.germanystartupjobs.com/jm-ajax/get_listings/ возвращает JSON-объект (нажмите JSON) с HTML-кодом в качестве дополнения к нему.

Для вашего паука это означает, что вам нужно будет сообщить scrapy, чтобы получить этот запрос и обработать HTML-часть JSON-объекта, чтобы иметь возможность применить ваши xpaths.

Вы делаете это, импортируя json-модуль в верхней части вашего паука, а затем что-то вроде строк:

data = json.loads(response.body)
html = data['html']
selector = scrapy.Selector(text=data['html'], type="html")

Например, если вы хотите извлечь все URL-адреса с сайта и перейти по ним, вам нужно указать xpath, где находятся URL-адреса, и yield новый запрос к этому URL-адресу. Таким образом, вы, по сути, говорите scrapy: «Смотрите, вот URL-адрес, теперь идите и следуйте ему».

Примером для xpath будет:

url = selector.xpath('//a/@href').extract()

Итак, все, что в скобках, — это ваш xpath. Вам не нужно указывать весь путь от ul[@id="job-listing-view"]/ или около того, вам просто нужно убедиться, что это идентифицируемый путь. Вот, например, у нас есть только те URL-адреса в a-тегах, которые вы хотите, других a-тегов на сайте нет.

Это практически базовые вещи.

Я настоятельно рекомендую вам поэкспериментировать с оболочкой, пока вы не освоите xpaths. Возьмите сайт, который выглядит довольно просто, без каких-либо запросов, и посмотрите, сможете ли вы найти любой элемент, который вы хотите, с помощью xpaths.

person rongon    schedule 15.12.2016
comment
Спасибо за ваш ответ, и это действительно полезно. Я разместил еще один вопрос, связанный с scrapy, который может быть вам интересен http://stackoverflow.com/questions/41178659/how-to-get-the-job-description-using-scrapy - person Chak; 16.12.2016