Web Scraping дает неправильный / пустой вывод - PullRequest
0 голосов
/ 05 апреля 2020
import requests
from bs4 import BeautifulSoup

pracuj_base_url = 'https://www.pracuj.pl/praca?pn=2'

page = requests.get(pracuj_base_url)
soup = BeautifulSoup(page.content, 'lxml')

job_elems = soup.find_all('li', class_='results__list-container-item')

for job_elem in job_elems:
  title_elem = job_elem.find('a', class_='offer-details__title-link')
  print(title_elem.text)

Почему этот код дает мне только 10 результатов, остальное "Нет". Я проверил веб-сайт, и каждый

с этим классом _ = 'results__list-container-item' имеет точно такую ​​же структуру. Любые идеи. В качестве окончательного результата я хочу:
  • Название должности
  • Ссылка на эту работу
  • Название компании
  • Расположение (ie: Катовице)
  • Тип соглашения (место: ниже местоположения ie: "Umowa o prace")
  • Срок действия соглашения (справа от типа соглашения, ie: " Пельны этат ")
  • Для кого это предложение (справа от периода, ie:" Specjalista ")
  • Дата публикации

Вкл. с другой стороны:

print(len(job_elems))

возвращает правильное значение: 50 заданий, перечисленных на этой странице.

Как я пытаюсь:

print(job_elems[34])

Результат:

1 Ответ

0 голосов
/ 05 апреля 2020

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

enter image description here

Но все 50 результатов находятся в теге javascript как json объект

import re , json , requests

pracuj_base_url = 'https://www.pracuj.pl/praca?pn=2'

page = requests.get(pracuj_base_url)
match = re.search(r'INITIAL_STATE__\s*= (.*?)};',page.text)
data = match.group(1) + '}'
jobs = json.loads(data)['offers']

for index , job in enumerate(jobs,1):
        print(f'{index } / {len(jobs)}')
        print(job)

Выводом будет словарь:

50 / 50
{'commonOfferId': '23400166', 'jobTitle': 'Inżynier Procesów Logistycznych', 'employer': 'XPO Supply Chain Poland Sp. z o.o. ', 'companyProfileUrl': 'https://pracodawcy.pracuj.pl/company/20012541/profile', 'companyId': 20012541, 'logo': 'https://i.gpcdn.pl/oferty-loga-firm/wyniki-wyszukiwania/16595.png', 'lastPublicated': '2020-04-04T17:00:00', 'expirationDate': '2020-05-14T00:00:00', 'salary': '', 'employmentLevel': 'Specjalista', 'jobDescription': ' Do Twoich zadań będzie należeć: Współodpowiedzialność za rozwój sprzedaży usług logistyki kontraktowej Kalkulacja projektów logistycznych w oparciu o dostępne narzędzia Opracowywanie wdrożenia oraz budowanie procesów dla nowych klientów...', 'offerType': [], 'optionalCv': False, 'countryName': 'Polska', 'mainCategoriesIds': [5017, 5028], 'offers': [{'offerId': 7439566, 'offerUrl': 'https://www.pracuj.pl/praca/inzynier-procesow-logistycznych-warszawa,oferta,7439566', 'regionName': 'mazowieckie', 'cities': ['Warszawa'], 'label': 'Warszawa'}], 'typesOfContract': ['Umowa o pracę'], 'workSchedules': ['Pełny etat'], 'remoteWork': False}
...