Хотелось бы, чтобы эта статья была о том, как поделиться своим опытом о том, как много я заработал с помощью «двух строк кода» для парсинга веб-сайта или «как я создал краулер, чтобы запускать его годами». Моя цель состояла в том, чтобы извлечь данные о зарплате с Indeed.com или данные о недвижимости с Zillow.com, но, к сожалению, из-за динамического содержимого HTML я не смог успешно очистить данные или любые учебные пособия, доступные на Youtube или Medium.com, оказались полезными.

Моя мотивация пойти после Zillow состояла в том, чтобы добавить больше «функций» к моим данным благодаря информации о школьном рейтинге, которая у них есть. Поскольку собранные данные будут использоваться для создания алгоритма линейной регрессии, обсуждающего взаимосвязь между школьными рейтингами и ценами на жилье, Zillow имеет гораздо больше смысла.

Еще одно событие со стороны Zillow заключается в том, что они запретили свой бесплатный API примерно год назад. Теперь он предлагается через другую платформу, на которую вам нужно получить приглашение.

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

Предупреждение. Я понял одну общую вещь: большинству, если не всем, учебникам на Youtube больше года, поэтому к тому времени, когда вы их просматриваете, динамическое содержимое их страницы уже может быть изменено. такие сайты. Кроме того, они в основном занимаются статическими сайтами, таблицами и т. Д. Для создания контента, поэтому большинство из них на данный момент просто наживка для кликов.

Повестка дня

  1. Веб-скрейпинг против веб-сканирования
  2. Что ты можешь сделать?
  3. «/robots.txt»

Моя цель в написании этой статьи состоит не в том, чтобы научить вас парсить страницу, а в том, чтобы помочь вам преодолеть некоторые из наиболее часто используемых инструментов, с которыми вы, вероятно, столкнетесь.

1. Веб-скрейпинг против веб-сканирования

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

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

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

2. Что вы можете сделать?

Используя три наиболее применяемые библиотеки BeautifulSoup, Requests и Selenium.

С помощью библиотеки BeautifulSoup;

from urllib.request import urlopen
from bs4 import BeautifulSoup
url = ''
html = urlopen(url)
bs = BeautifulSoup(html, 'html.parser')

for child in bs.find('table',{'id':'giftList'}).children:
    print(child)

Как прирожденный пользователь Selenium, мое первое впечатление об этом инструменте было таково, что я не чувствовал в нем необходимости. Но когда я начал использовать его в большем количестве проектов и комбинировать с Selenium, я понял, что из этого может получиться что-то прекрасное.

С помощью запросов;

import requests
from pandas.io.json import json_normalize

url = 'url you want to scrape'
jsonData = requests.get(url).json()

table = json_normalize(jsonData['data'])

С документацией по запросам можно ознакомиться здесь. Он возвращает формат JSON, вам просто нужно взять его оттуда.

Или с помощью Selenium WebDriver

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import json

driver=webdriver.Chrome(executable_path='./chromedriver.exe')
driver.get(url)
rating=WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.XPATH, 'your xpath locator'))
    )

Selenium WebDriver — это инструмент автоматизации, который помогает автоматизировать движения браузера, ориентируясь на DOM веб-сайта с помощью локаторов, таких как селекторы CSS, Xpath, идентификатор, имя и т. д. Это широко используемый инструмент среди тестировщиков автоматизации, и написанные тесты могут быть ненадежными, потому что, если есть какие-либо изменения в DOM, инструмент не сможет найти элемент. Выше приведен шаблонный код, который вы можете использовать, чтобы начать свое путешествие. Кроме того, с помощью расширения CroPath Chrome вы можете легко находить элементы, находя относительные и абсолютные Xpaths.

Еще одна проблема с этим инструментом заключается в том, что он работает с вызовами AJAX. AJAX = Aсинхронный JavaScript Aи XML. Вы можете получить больше информации об этом здесь, но в целом, это

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

Это также кошмар инженеров по автоматизации тестирования. Поскольку Selenium (в отличие от Cypress) работает в браузере, он не имеет никакого контроля над вызовами AJAX. Здесь на помощь приходят ожидания. Ожидания просто позволяют пользователям явно или неявно ожидать загрузки ожидаемых элементов.

образец кода:

from selenium.webdriver.support.ui import WebDriverWait

driver.navigate("file:///race_condition.html")
el = WebDriverWait(driver).until(lambda d: d.find_element_by_tag_name("p"))
assert el.text == "Hello from JavaScript!"

Прежде чем забыть упомянуть, я также был забанен в Zillow и Realtor с помощью Selenium, поэтому убедитесь, что вы добавляете метод sleep() в свои вызовы. Или еще лучший вариант — использовать прокси. Но имейте в виду, что прокси открыты для безопасности уязвимости. Вот пример кода, чтобы проверить, работает ли прокси, после чего вы можете использовать его, чтобы запустить свой код на сайте.

# Import the required Modules
import requests
# Create a pool of proxies
proxies = {
 'http://',
 'http://',
 'http://',
 
}
url = ''
# Iterate the proxies and check if it is working.
for proxy in proxies:
 try:
  page = requests.get(
  url, proxies={"http": proxy, "https": proxy})
# Prints Proxy server IP address if proxy is alive.
  print("Status OK, Output:", page.text)
except OSError as e:
# Proxy returns Connection error
  print(e)

3. «/robots.txt» 🤔

Когда вы добавляете «/robots.txt» после URL-адреса сайта, он сообщает вам о том, что разрешено или запрещено для очистки с веб-страницы. Как видно из трех веб-сайтов, которые я пытался очистить, они, как правило, ничего не разрешают для очистки?!

Заключение

Если вам нужно работать с данными о недвижимости, я предлагаю вам проверить другие веб-сайты по недвижимости, такие как centre21 или realtor.com. Возможно, вам повезет больше. Что касается парсинга Indeed.com, мой честный отзыв по этому поводу: даже не пытайтесь. Действительно. com — очень грязное место, и на большинстве вакансий даже нет информации о зарплате или диапазоне. Но если вы хотите парсить такой сайт, как Craigslist, вы можете найти небольшой пример, над которым я работал здесь. Также, пожалуйста, помните о правилах парсинга сайта.

Спасибо за прочтение!