Добро пожаловать в первый пост серии Upwork. В этой серии мы будем работать над реальными приложениями.
Прежде чем мы продолжим, я хочу познакомить вас с новым Канал YouTube – обратный питон
Какое основное различие между этим каналом от других? Я пытаюсь показать вам реальные приложения вместо простых учебных пособий. Сложные проекты увеличат ваше алгоритмическое мышление и навыки решения проблем. В этих видео я не записывал свой голос, причина в том, что я уже объяснил проект в своем блоге, поэтому я просто показываю процедуру проекта шаг за шагом. Но если вы хотите объяснить в видео, дайте мне знать в комментариях.
Хорошо! Давайте начнем!
Интернет -скребок и извлечение данных
Наша задача – создать веб -гусеница, который ежедневно собирает данные со страниц отчетов транспортной компании.
Нажмите здесь, чтобы увидеть описание проекта
Шаг 1: Понимание задачи
Во -первых, важно четко понимать задачу. Они хотят, чтобы мы открепили данные, затем сохранили их в файле CSV, где каждый атрибут, перечисленный выше, является его собственным отдельным столбцом.
Мы собираемся ползти по следующей информации:
- Дата («Информация ниже отражает содержание информационных систем управления FMCSA как {date}»)
- Рабочее статус
- Юридическое название
- Название DBA
- Физический адрес
- Почтовый адрес
- Номер USDOT
- Силовые единицы
- Водители
Страницы отчетов можно получить с помощью точек или с другими идентификаторами идентификаторов. Каждая страница имеет свой собственный идентификатор (точка). Итак, эти точки находятся в файле Excel. Мы должны прочитать этот файл и извлечь точки оттуда, а затем передать его в URL, чтобы получить доступ к странице отчета.
Шаг 2: Создание нашей среды и установка зависимостей
Теперь мы знаем, что клиент хочет от нас, поэтому давайте создадим нашу виртуальную среду, а затем проверим элементы, которые мы собираемся ползти.
Чтобы создать VirtualEnv Запустите следующую команду в вашем терминале:
virtualenv env
затем установите BeautifulSoup который представляет собой пакет Python для анализа документов HTML и XML и xlrd которая является библиотекой для чтения данных и информации о форматировании из файлов Excel:
pip install beautifulsoup4 xlrd
Шаг 3: Данные ползания
Хорошо, разработчики! Давайте начнем с открытия примера URL из описания проекта, чтобы увидеть поля.
Нажмите, чтобы увидеть пример URL
Страница должна выглядеть так:
Наша первая цель – найти – Date («Информация ниже отражает содержание информационных систем управления FMCSA по состоянию на {date}»)
Правда в том, что мы не можем ползти по этому элементу по конкретному имени или идентификатору. К сожалению, этот отчет испортился.
Но мы видим, что этот элемент в жирный формат. Есть также много элементов, расположенных в формате жирного шрифта. Тем не менее, мы можем ползти из них в качестве текста и использовать Regex Чтобы извлечь необходимые данные.
Регулярное выражение (регуляция) представляет собой специальную последовательность символов, которая помогает вам сопоставить или найти другие строки или наборы строк, используя специализированный синтаксис, удерживаемый в шаблоне.
Дата, расположенная между Информация, приведенная ниже, отражает содержание информационных систем управления FMCSA по состоянию на и . (точка) . Таким образом, чтобы найти дату, регулярно будет смотреть между этими строками.
import re # regex import urllib.request from urllib.request import urlopen, Request from bs4 import BeautifulSoup def crawl_data(url): req = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) html = urlopen(req).read() bs = BeautifulSoup(html, 'html.parser') # Find all bold texts bold_texts = bs.find_all('b') for b in bold_texts: try: # look between these strings date = re.search('The information below reflects the content of the FMCSA management information systems as of(.*).', b.get_text(strip=True, separator=' ')).group(1).strip() # If regex finds multiple dots, extract string before first dot if len(date) > 11: date = date.split(".",1)[0] print(date) except AttributeError: pass
Ну, если вы запустите программу, вы увидите, что она печатает дату.
Позвольте мне быстро показать вам, как работает Режима, потому что я чувствую, что некоторые из вас пытаются понять.
Рассмотрим следующий код:
import re # We need to extarct "coderasha" from the string data = "Hello my name is coderasha." name = re.search('Hello my name is (.*).', data) print(name) # Output: <_sre.SRE_Match object; span=(0, 27), match='Hello my name is coderasha.'>
Поскольку вы видите, что совпадение найдено, но его напечатано как объект. Группа (1) Захватить текст, сопоставляемый в резервуаре внутри них в пронумерованную группу, которую можно повторно использовано с помощью пронумерованной обратной ссылки
import re # We need to extarct "coderasha" from the string data = "Hello my name is coderasha." name = re.search('Hello my name is (.*).', data).group(1) print(name) # Output: coderasha
Итак, я применяю ту же логику, чтобы найти дату внутри струн, которые ползали.
Следующим шагом является поиск стола и продолжать ползать в других полях. К счастью, таблица находится между Центр теги. Тем не менее, мы должны снова найти данные, используя Regex, потому что элементы таблицы не имеют никакого особого атрибута.
# Get all texts inside table information = bs.find('center').get_text(strip=True, separator=' ') # Find fields using RegEx operating = re.search('Operating Status:(.*)Out', information).group(1).strip() legal_name = re.search('Legal Name:(.*)DBA', information).group(1).strip() physical_address = re.search('Physical Address:(.*)Phone', information).group(1).strip() mailing_address = re.search('Mailing Address:(.*)USDOT', information).group(1).strip() usdot_address = re.search('USDOT Number:(.*)State Carrier ID Number', information).group(1).strip() power_units = re.search('Power Units:(.*)Drivers', information).group(1).strip() drivers = re.search('Drivers:(.*)MCS-150 Form Date', information).group(1).strip()
Шаг 4: Напишите данные в CSV
После ползания данных пришло время создать новый файл CSV и записать в него данные. Я предпочитаю создать другую функцию, которая будет обрабатывать это действие.
import csv def write_csv(date, operating, legal_name, physical_address, mailing_address, usdot_address, power_units, drivers): with open(usdot_address + '.csv', mode='w', newline='', encoding="utf-8") as csv_file: fieldnames = ['Date', 'Operating Status', 'Legal_Name', 'Physical Address', 'Mailing Address', 'Power Units', 'Drivers'] writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() writer.writerow({ 'Date':date, 'Operating Status': operating, 'Legal_Name': legal_name, 'Physical Address':physical_address, 'Mailing Address': mailing_address, 'Power Units':power_units, 'Drivers':drivers })
Имя CSV должно быть уникальным, поэтому я назвал его с usdot_address или с другим идентификационным идентификатором отчета из ползанных данных
Шаг 5: Прочитайте файл Excel для данных для полза для каждой точки
Последний шаг – прочитать файл Excel и передать эти точки в конце URL -адреса для доступа к страницам. Мы можем использовать xlrd Чтобы прочитать файл Excel
import xlrd dots = [] def read_excel_file(): loc = ("dots.xls") wb = xlrd.open_workbook(loc) sheet = wb.sheet_by_index(0) sheet.cell_value(0, 0) # First five dot in excel for i in range(1,5): # Convert floats to string and clean from .0 dot = str(sheet.cell_value(i, 0)).replace('.0', '') dots.append(dot)
xlrd читает числа как плавающие, поэтому лучшее решение – скрыть их к строкам и использовать Заменить () Метод для удаления .0 конец строки.
и передать эти точки в URL:
for dot in dots: crawl_data('https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&query_string=' + dot) # Sleep 5 seconds to avoid any errors time.sleep(5)
Вот полный код:
import re import csv import urllib.request from urllib.request import urlopen, Request from bs4 import BeautifulSoup import xlrd import time dots = [] def read_excel_file(): loc = ("dots.xls") wb = xlrd.open_workbook(loc) sheet = wb.sheet_by_index(0) sheet.cell_value(0, 0) for i in range(1,5): dot = str(sheet.cell_value(i, 0)).replace('.0', '') dots.append(dot) def crawl_data(url): req = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) html = urlopen(req).read() bs = BeautifulSoup(html, 'html.parser') bold_texts = bs.find_all('b') for b in bold_texts: try: date = re.search('The information below reflects the content of the FMCSA management information systems as of(.*).', b.get_text(strip=True, separator=' ')).group(1).strip() if len(date) > 11: date = date.split(".",1)[0] print(date) except AttributeError: pass information = bs.find('center').get_text(strip=True, separator=' ') operating = re.search('Operating Status:(.*)Out', information).group(1).strip() legal_name = re.search('Legal Name:(.*)DBA', information).group(1).strip() physical_address = re.search('Physical Address:(.*)Phone', information).group(1).strip() mailing_address = re.search('Mailing Address:(.*)USDOT', information).group(1).strip() usdot_address = re.search('USDOT Number:(.*)State Carrier ID Number', information).group(1).strip() power_units = re.search('Power Units:(.*)Drivers', information).group(1).strip() drivers = re.search('Drivers:(.*)MCS-150 Form Date', information).group(1).strip() write_csv(date, operating, legal_name, physical_address, mailing_address, usdot_address, power_units, drivers) def write_csv(date, operating, legal_name, physical_address, mailing_address, usdot_address, power_units, drivers): with open(usdot_address + '.csv', mode='w', newline='', encoding="utf-8") as csv_file: fieldnames = ['Date', 'Operating Status', 'Legal_Name', 'Physical Address', 'Mailing Address', 'Power Units', 'Drivers'] writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() writer.writerow({ 'Date':date, 'Operating Status': operating, 'Legal_Name': legal_name, 'Physical Address':physical_address, 'Mailing Address': mailing_address, 'Power Units':power_units, 'Drivers':drivers }) read_excel_file() print(dots) for dot in dots: crawl_data('https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&query_string=' + dot) time.sleep(5)
Миссия выполнена
Надеюсь, вам понравился первый пост нового сериала Upwork. Предложение о работе по -прежнему открывается, поэтому, если хотите, вы можете отправить предложение клиенту, используя этот код. Пожалуйста, посмотрите Обратный питон Для получения дополнительных статей, подобных этому и подписаться на Канал YouTube – обратный питон Для удивительного контента.
Увидимся скоро, разработчики! Оставайся на связи!
Оригинал: “https://dev.to/coderasha/web-scraper-data-extraction-with-python-upwork-series-1-19e3”