Рубрики
Без рубрики

Веб -скребок и извлечение данных с помощью Python | Серия Upwork #1

Привет, разработки! Добро пожаловать в первый пост серии Upwork. В этой серии мы будем работать над настоящим … Tagged с Python, WebDev, базой данных, учебным пособием.

Добро пожаловать в первый пост серии 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”