Полезные скрипты на python для windows

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

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

Почему в эпоху программирования мы все еще делаем то, что можем автоматизировать. Подумайте о задачах, которые вы повторяете ежедневно или ежедневных проектах, требующих автоматизации, таких как чтение электронной почты, редактирование изображений, чтение PDF и т. д. В этой статье мы рассмотрим 10 скриптов автоматизации для ваших повседневных задач.
Автоматизация решает проблему один раз, а затем ставит ее на автопилот
— Майкл Хаятт
👉 Автоматизируем отправку электронной почты с помощью Python
Этот потрясающий скрипт автоматизации позволит вам читать и отправлять электронные письма, будь то Outlook, Gmail или любой другой почтовый сервер. Ниже пример кода, который разделен на две части.
Чтение электронной почты и отправка электронной почты использует модуль IMAP для чтения электронных писем, а другой использует модуль SMTP для отправки электронной почты, ниже приведен код:

# Automate Emails with Python
import imaplib
import email
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# Read Email
Email = imaplib.IMAP4_SSL('imap.gmail.com')
Email.login('your_username', 'your_password')
status, msgs = Email.select('INBOX')    
print("Status: ", status)
for i in range(1, int(msgs[0])):
    res, message = Email.fetch(str(i), '(RFC822)')
    for r in message:
        if isinstance(r, tuple):
            message = email.message_from_bytes(r[1])
            print (message["subject"])
---------------------------------------------------
# Send Email
Your_Email = "test@xyz.com" 
password = "your_password"
reciver = "Sender Mail" 
subject = "Medium Article"
text_msg = "Hi, Codedev010 here from Medium Article"
msg = MIMEMultipart()
msg["From"] = Your_Email
msg["To"] = reciver
msg["Subject"] = subject
msg.attach(MIMEText(text_msg, 'plain'))
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(Your_Email, password)
MSG = msg.as_string()
server.sendmail(Your_Email, reciver, MSG)
server.quit()

172 / 5 000

Результаты перевода

star_border

👉 Редактор изображений на Python

Используйте этот скрипт автоматизации для программного редактирования изображений. Ниже я приводу общие функции для редактирования изображений, такие как размытие, поворот, объединение изображений и т. д.

# Редактор изображений
# pip install pillow
from PIL import Image
from PIL import ImageDraw
# Combine Image
img1 = Image.open('img101.jpg')
img2 = Image.open('img102.jpg')
combine = Image.blend(img1, img2, 0.5)
# Resize Image
resize = Image.open('img101.jpg')
resize = resize.resize((300, 300))
# Flip an Image 
flip_image = Image.open('img101.jpg')
flip_image = flip_image.transpose(Image.FLIP_LEFT_RIGHT)
# Blur an Image
blur_image = Image.open('img101.jpg')
blur_image = blur_image.filter(Image.BLUR)
# Add Drop Shadow
shadow_image = Image.open('img101.jpg')
shadow_image = shadow_image.filter(Image.EDGE_ENHANCE_MORE)
# Crop an Image
crop_image = Image.open('img101.jpg')
crop_image = crop_image.crop((50, 50, 300, 200))
#Add Brightness
bright_image = Image.open('img101.jpg')
bright_image = bright_image.point(lambda p: p + 50)
# Add Text to Image
text_image = Image.open('img101.jpg')
text_image = text_image.convert('RGB')
draw = ImageDraw.Draw(text_image)
draw.text((10, 10), "Hello World", (255, 255, 255))
# Rotate an Image
rotate_image = Image.open('img101.jpg')
rotate_image = rotate_image.rotate(90)
# Save Image
img1.save('img101.jpg')

👉 Редактор аудио на Python
Этот скрипт автоматизации будет редактировать аудио файлы. Вы можете извлекать звуки, объединять их, воспроизводить, разделять/вырезать фрагменты аудио и многое другое. Скрипт использует модуль Pydub, который является модулем управления звуком. Код приведен ниже:

# Редактор аудио на Python
# pip install pydub
from pydub import AudioSegment
from pydub.utils import mediainfo
from pydub.playback import play
# Extract Sound from Video
sound = AudioSegment.from_file("video.mp4", format="mp4")
sound.export("music.mp3", format="mp3")
# Get Media Info
info = mediainfo("musci.wav")
print(info)
# Play Sound
play("music.mp3")
# Combine Sounds
sound1 = AudioSegment.from_file("music.mp3")
sound2 = AudioSegment.from_file("music.mp3")
combined = sound1 + sound2
combined.export("music_combined.mp3", format="mp3")
# Split Audio
sound = AudioSegment.from_file("music.mp3", format="mp3")
sound_1 = sound[:10000]
sound_2 = sound[10000:]
sound_1.export("music_1.mp3", format="mp3")
sound_2.export("music_2.mp3", format="mp3")
# Increase or Reduce Volumn
sound = AudioSegment.from_file("music.mp3", format="mp3")
sound_volumn = sound + 10
sound_volumn.export("music_volumn.mp3", format="mp3")
# Adding Silence to Audio
sound = AudioSegment.from_file("music.mp3", format="mp3")
sound_silence = sound + AudioSegment.silent(duration=1000)
sound_silence.export("music_silence.mp3", format="mp3")

👉 Установите пароль на ваши файлы
Вам нужно было скрыть свои файлы, чтобы никто не мог их прочитать, тогда этот скрипт автоматизации поможет вам. Скрипт использует метод криптографии для шифрования ваших файлов, и когда вам нужно их открыть, вы можете их расшифровать с кодом ниже. Это очень безопасный способ скрыть ваши файлы, потому что расшифровать файл без ключа невозможно.

https://t.me/pro_python_code – бесплатное обучение Python c нуля

# Lock Your Files
#pip install cryptography
from cryptography.fernet import Fernet
def Lock_file(file_name, key):
    with open(file_name, 'rb') as file:
        data = file.read()
    f = Fernet(key)
    encrypted_data = f.encrypt(data)
    with open(file_name, 'wb') as file:
        file.write(encrypted_data)
    print("File Lock...")
def Unlock_file(file_name, key):
    with open(file_name, 'rb') as file:
        data = file.read()
    f = Fernet(key)
    decrypted_data = f.decrypt(data)
    with open(file_name, 'wb') as file:
        file.write(decrypted_data)
    print("File Unlock...")
key = input("Enter the key: ")
Lock_file('test.txt', key)
Unlock_file('test.txt', key)

👉 Мобильные приложения на Python
Вы можете разрабатывать мобильные приложения с помощью Python. Модуль Kivy используется для разработки кроссплатформенных приложений, таких как Android, IOS и Win. В приведенном ниже коде будут важные виджеты Kivy, которые мы будем использовать для разработки приложения для начинающих.
Примечание. После того, как ваше приложение будет прочитано, вы можете собрать его Apk со следующим модулем: pip install buildozer

# Develop Mobile Apps with Kivy
# pip install kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.checkbox import CheckBox    
from kivy.uix.image import Image
from kivy.uix.popup import Popup
class MobileApp(App):
def build(self):
        # Layout of App
        layout = BoxLayout(orientation="vertical")
# Label 
        label = Label(text="Hello Kivy!")
# Button
        btn = Button(text="Click Me!")
# Button Action
        btn.bind(on_press=self.btn_pressed)
# Input Box
        input_box = TextInput(hint_text="Input Here",size_hint=(.3,.2))
# Check Box
        check_box = CheckBox(text="Check Me!")
        
        # ScrollView
        scroll_view = ScrollView()
        grid_layout = GridLayout(cols=2, size_hint_y=None)
                      grid_layout.bind(minimum_height=grid_layout.setter('height'))
# Add Image to App
        image = Image(source="medium.png")
# Popup
        popup = Popup(title="Popup", size_hint=(.5,.5))
    
        # Add to layout
        layout.add_widget(label)
        layout.add_widget(btn)
        layout.add_widget(input_box)
        layout.add_widget(scroll_view)
        layout.add_widget(check_box)
        layout.add_widget(image)
        layout.add_widget(popup)
return layout
    def btn_pressed(self, instance):
        print("Button Pressed!")
# Run the App
app = MobileApp()
app.run()

👉 Программа записи экрана Python
Теперь вы можете записывать экраны рабочего стола с помощью Python со скоростью 60 кадров в секунду. Этот скрипт автоматизации использует несколько модулей для выполнения своей работы, и это очень полезен для тех, кто хочет выполнять запись экрана программно.

import pyautogui
import numpy as np
import cv2
import keyboard
# pip install opencv-python
# pip install pyautogui
# pip install keyboard
# pip install numpy
def Screen_Recording():
    while True:
        # Press R to Start Recording
        if keyboard.is_pressed('r'):
            print("Recording Has been Started...")
            # resolution
            capture_area = (1920, 1080) 
            
            codec = cv2.VideoWriter_fourcc(*'mp4v')
            filename = "Your_Recording.mp4"
# Frame per Second
            fps = 60.0
            output_video = cv2.VideoWriter(filename, codec, fps, capture_area)
            while True:
                image = pyautogui.screenshot()
                Image_frame = np.array(image)
                Image_frame = cv2.cvtColor(Image_frame, cv2.COLOR_BGR2RGB)
                output_video.write(Image_frame)
                cv2.waitKey(1)
                # Press Q button to Stop recording
                if keyboard.is_pressed('q'):
                    print("Recording Has been Stopped...")
                    break
output_video.release()
            cv2.destroyAllWindows()
Screen_Recording()

👉 Проверка грамматики на Python
Проверка грамматики всегда сложна но этот скрипт автоматизации поможет вам. Этот удивительный скрипт использует модуль Gingerit, который подключен к API средства проверки Ginger Grammer, и второй модуль Streamlit для создания веб-приложений с меньшим количеством кода. Это удобный скрипт, когда у вас есть много текста или данных, которые нужно проверить программно.

# Proofreading with Pyton
# pip install gingerit
# pip install streamlit
from gingerit.gingerit import GingerIt
import streamlit as webapp
app = GingerIt()
webapp.title('Proofreading in Python')
Text = webapp.text_area("Enter Your Text or Sentence:", value='', height=None, max_chars=None, key=None)
if webapp.button('Correct Sentence'):
    if Text == '':
        webapp.write('Please enter text for proofreading') 
    else: 
        correction = app.parse(Text)
        webapp.markdown('Corrected Text => ' + str(correction["result"]))

👉 Извлечение текста из PDF с Python
Этот скрипт просто извлечет текст из вашего PDF. Этот скрипт очень удобен для разработчиков и людей, которые ищут автоматизированный способ извлечения содержимого таблицы из файлов PDF. Потому что никто не любит сидеть и извлекать строки одну за другой из нескольких pdf. Проверьте код ниже:

# Extract Tables from Camelot
# pip install camelot-py
import camelot
table = camelot.read_pdf('test.pdf', pages='1-2')
# get total number of tables
print("Total tables: ", table.n) # 2
# print table by num
print(table[0].df)
print(table[1].df)
# Export Table to CSV
table[0].to_csv('table1.csv')
table[1].to_csv('table2.csv')
# Export Table to Excel
table[0].to_excel('table1.xlsx')
# Export Table to HTML
table[0].to_html('table1.html')
# Extract and Export Table At Once
table.export('tables.csv', f='csv', compress=True)
# Parse Table Report
table[0].parse(['Date', 'Description', 'Amount'])

👉 Автоматизируем работу MS Excel, Word и PowerPoint
Думали ли вы, что с помощью Python можно также автоматизировать программное обеспечение MS Office? Тогда этот скрипт позволит вам это сделать. Скрипт разделен на три части, и каждая часть имеет модуль для чтения и записи данных в программном обеспечении MS.

# Автоматизируем работу MS Excel, Word и PowerPoint
# pip install xlrd
import xlrd
wb = xlrd.open_workbook('test.xlsx')
worksheet = wb.sheet_by_index(0)
# Read by row and col number
print(worksheet.cell_value(0, 0))
# read whole row
print(worksheet.row_values(0))
# read whole col
print(worksheet.col_values(1))
# Write to excel by row and col number
worksheet.write(0, 0, 'Hello')
wb.save('test.xlsx')
-------------------------------------------------
# Automate MS WORD
# pip install python-docx
import docx
 
doc = docx.Document("zen_of_python.docx")
 
# read paragraph by paragraph
text = [p.text for p in doc.paragraphs]
print(text)
# read table by table
for table in doc.tables:
    for row in table.rows:
        for cell in row.cells:
            print(cell.text)
# Write in Doc
doc.add_paragraph("Hello World")
doc.save("test.docx")
-------------------------------------------------
# Automate PowerPoint
# pip install python-pptx
from pptx import Presentation
# Read Slides
PP = Presentation('file.pptx')
for slide in PP.slides:
    for shape in slide.shapes:
        for paragraph in shape.text_frame.paragraphs:
            for data in paragraph.runs:
                print(data.text)
# Write in PPT
PP = Presentation()
title_slide_layout = PP.slide_layouts[0]
slide = PP.slides.add_slide(title_slide_layout)
title = slide.shapes.title
title.text = "Medium Article"
PP.save('file.pptx')

👉 Преобразовываем Изображение в PDF с Python
Этот простой скрипт автоматизации поможет вам преобразовать ваши изображения в формат PDF.

# Images to Python
from PIL import Image
def Images_Pdf(filename, output):
    images = []
for file in filename:
        im = Image.open(file)
        im = im.convert('RGB')
        images.append(im)
    
    images[0].save(output, save_all=True, append_images=images[1:])
Images_Pdf(["test1.jpg", "test2.jpg", "test3.jpg"], "output.pdf")

👉Заключительные мысли
Что ж, я очень рад, что вы дошли до конца этой статьи, и я надеюсь, что вы найдете ее информативной и получили удовольствие от ее чтения. Если вам понравилась эта статья, не забудьте поделиться ❤️ ею со своими друзьями.

Больше полезных скриптов в нашем телеграмм канале по аналитике данных на Python

https://t.me/data_analysis_ml

Просмотры: 3 702

Статья будет полезна специалистам, которые хотели бы автоматизировать свою работу. Для работы со скриптами потребуются минимальные знания программирования и установленные библиотеки. Для каждого примера в конце есть ссылка на полный код, который нужно открывать в Jupyter Notebook. Больше скриптов в Telegram-канале seo_python.

С каждым годом процесс оптимизации требует всё больше технических навыков. Среди текущих требований к специалисту часто указывают, что необходимо знание какого-либо языка программирования, например, Python.

Python — простой и лаконичный язык, позволяющий автоматизировать значительную часть рутинных задач и анализировать данные, что особенно актуально при работе с крупными проектами.

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

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

1. Генерация RSS-фида для турбо-страниц «Яндекса»

Этот способ подходит для случаев, когда необходимо быстро запустить и протестировать турбо-страницы. Рекомендую использовать скрипт для генерации RSS-канала для статейных сайтов, контент которых изменяется редко. Этот метод подходит для быстрого запуска страниц с целью проверить теорию и посмотреть результаты внедрения технологии «Яндекса».

Что потребуется:

  • Netpeak Spider.
  • Базовые знания применения XPath.
  • Установленные Python-библиотеки.

Плюсы подхода:

  • Быстрое внедрение. Не требуется помощь программиста.
  • Не нужно подключение к базе, где хранится контент. Весь контент и его разметку берём прямо со страниц (одновременно минус).
  • Используем стандартные SEO-инструменты.

Минусы:

  • Необновляемый XML-файл. После изменения контента требуется пересобрать контент и формировать новый XML.
  • Новые страницы также не будут попадать в файл. Для них будет необходимо заново парсить контент и формировать XML.
  • Создаём нагрузку на свой сайт при сборе контента.

Ниже описана последовательность работ.

Подготавливаем данные

С помощью Screaming frog seo spider или Netpeak Spider парсим контент страниц, для которых будем подключать турбо-страницы.

На этом этапе подготавливаем данные для обязательных элементов, необходимых при формировании XML-файла.

Обязательные поля:

  • Link — URL страницы.
  • H1 — заголовок страницы.
  • Turbo:content — содержимое страницы.

Используя XPath, парсим контент страниц со всей HTML-разметкой. Копируем через панель разработчика или пишем свой запрос (например, //div[@class=’entry-content entry—item’]).

Экспортируем полученные данные в CSV. В результате в CSV-файле должно быть три столбца:

  • Link.
  • H1.
  • Turbo:content.

Скрипт генерации файла

Подключаем нужные библиотеки.

import csv
import pandas as pd
import os
import math

Считываем файл с подготовленными данными.

data = pd.read_csv(‘internal_all — internal_all.csv’) #дописать «, header=1», если проблема при считывании заголовка
data = data[[‘Address’, ‘H1-1’, ‘текст 1’]]
## Если в таблицу попали лишние страницы, их можно легко отфильтровать. Ниже примеры.
# data = data[data[‘Status Code’]==200] # Фильтруем страницы с 200 ответом
# data = data[~data[‘Address’].str.contains(‘page’)] # Фильтруем страницы не содержащие «»
# data = data.drop(index=0)

Выводим информацию о количестве строк в файле и итоговом количестве RSS-файлов, которые будут сгенерированы.

rows_in_rss = 1000 # количество строк в одном rss-канале
total_rows = len(data) — 1
total_xml_file = math.ceil((total_rows-1)/rows_in_rss)
print(‘Всего в файле строк:’, total_rows)
print(‘Будет сгенерировано xml-файлов:’, total_xml_file)

Формируем структуру RSS-канала. Создаём функцию create_xml, отвечающую за создание начала файла.

def create_xml(item_count_next):
rss_file = open(‘rss{:.0f}.xml’.format(item_count_next/rows_in_rss), ‘w’, encoding=»utf-8″)
rss_file.write(
«»»<?xml version=»1.0″ encoding=»UTF-8″?>
<rss xmlns:yandex=»http://news.yandex.ru»
xmlns:media=»http://search.yahoo.com/mrss/»
xmlns:turbo=»http://turbo.yandex.ru»
version=»2.0″>
<channel>»»»)
rss_file.close()

Функция close_xml будет закрывать файл.

def close_xml(item_count_next):
rss_file = open(‘rss{:.0f}.xml’.format(item_count_next/rows_in_rss), ‘a’, encoding=»utf-8″)
rss_file.write(
‘ </channel>’ + ‘n’+
‘</rss>’
)
rss_file.close()

В функцию data_for_rss передаём номер первой и последней строки. Для этого промежутка будем формировать RSS.

Построчно считываем строки в датафрейме и формируем <item>, записывая получившиеся данные в XML-файл. Каждая строка в датафрейме — новая страница.

def data_for_rss(item_count_prev, item_count_next):

data_rss = data[item_count_prev:item_count_next]

if len(data_rss) != 0:

with open(‘rss{:.0f}.xml’.format(item_count_next/rows_in_rss), ‘a’, encoding=»utf-8″) as rss_file:

for index, row in data_rss.iterrows():

url = str(row[0])

h1 = str(row[1])

text = str(row[2])

rss_file.write(«»»<item turbo=»true»>
<link>»»»+ url + «»»</link>
<turbo:content>
<![CDATA[
<header> <h1>»»»+ h1 +»»»</h1>
</header>»»»
+ text+
«»»<div data-block=»share» data-network=»vkontakte,odnoklassniki,facebook,twitter»></div>
]]>
</turbo:content>
</item>»»»)

Делаем проверку размера получившихся фидов. Размер XML-файла не должен превышать 15 МБ. Если размер получился больше, изменяем количество строк в одном файле, изменяя значение переменной rows_in_rss.

def size_file(item_count_next):

size_final_file_MB = os.path.getsize(‘rss{:.0f}.xml’.format(item_count_next/rows_in_rss))/1024/1024

if size_final_file_MB < 15:
print(‘Файл создан’)
else:
print(‘Нужно уменьшить шаг’)

Финальный шаг — генерация фидов.

item_count_prev = 0

item_count_next = 1000 # должен быть равен rows_in_rss

count_rss = 0

print(total_xml_file)

while count_rss < total_xml_file:

create_xml(item_count_next)

data_list = data_for_rss(item_count_prev,item_count_next)

close_xml(item_count_next)

size_file(item_count_next)

item_count_prev += rows_in_rss

item_count_next += rows_in_rss

count_rss += 1

Остаётся добавить RSS в личном кабинете «Яндекс.Вебмастера» и настроить меню, лого, счётчики систем аналитики.

Ссылка на скрипт (открывать в Jupyter Notebook).

2. Техническое задание для копирайтеров

ТЗ для копирайтеров — довольно рутинная работа, которая занимает много времени у специалиста. Ниже рассмотрим три варианта автоматизации этого процесса, используя различные сервисы:

  • Семантического ядра нет, статья не написана.
  • Семантическое ядро есть, статья не написана.
  • Статья написана, требуется рерайт.

Что потребуется:

  • Подписка на сервис с доступом к API.
  • Подписка на сервис с пополненным балансом.
  • Установленные Python-библиотеки.
  • Кластеризованное семантическое ядро (я использую KeyAssort) для случая, когда ядро есть, а статья не написана.

Ниже рассмотрим все варианты, для каждого я распишу плюсы и минусы этих подходов. Стоит помнить, что результаты, которые выдают сервисы, стоит перепроверять. Так как везде есть свои технические нюансы.

Вариант 1. Семантического ядра нет, статья не написана

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

Плюсы подхода:

  • Не тратим время на сбор ядра (подходит для статей с широкой семантикой и хорошей видимостью URL конкурентов в топе).
  • В работу берём максимальное количество ключей, по которым конкуренты имеют видимость.

Минусы:

  • Нужна подписка на сервисы.
  • Данные, которые выдают сервисы, не всегда точны. Например, Megaindex не определяет длину текста меньше определённого количества знаков (около 200 символов). Поэтому показатели выборочно стоит перепроверить.
  • Не можем повлиять на кластеризацию.

Подключаем необходимые библиотеки.

import requests
import json
import pymorphy2
import re
import urllib.request as urlrequest
from urllib.parse import urlencode
from collections import Counter

Нам понадобятся:

  • Token — токен API MegaIndex.
  • Ser_id — регион, по которому будут сниматься данные. Полный список можно получить, используя метод get_ser.
  • Keywords_list — список ключевых слов, для которых будем получать данные.

token = «xxxxxxxxxxxxxxxxxxx»
ser_id = 174 #ID поисковой системы яндекс_спб
keywords_list = [‘основной маркерный запрос статьи №1’, ‘основной маркерный запрос статьи №2’, ‘основной маркерный запрос статьи №3’]
morph = pymorphy2.MorphAnalyzer() # создаем экземпляр pymorphy2, понадобится нам дальше для морфологического анализа

Для получения ключевых слов по нужным нам маркерным запросам будем использовать метод url_keywords API Serpstat. Этот метод возвращает ключевые фразы в топе поисковой системы по заданному URL. Получать будем видимость конкурентов по URL, которые находятся в топе выбранной поисковой системы.

Для работы берём пример кода из документации и оборачиваем его в функцию serpstat_keywords. Подставляем свои значения для token и региона se, по которому будем получать данные. Получить полный список регионов можно здесь.

def serpstat_keywords(url):

host = ‘http://api.serpstat.com/v3’
method = ‘url_keywords’
params = {
‘query’: ‘{}’.format(url), # string for get info
‘se’: ‘y_213’, # string search engine, y_2 — спб, y_213 — мск
‘token’: ‘xxxxxxxxxxxxxxxxxxx’, # string personal token
}

api_url = «{host}/{method}?{params}».format(
host=host,
method=method,
params=urlencode(params)
)

try:
json_data = urlrequest.urlopen(api_url).read()
except Exception as e0:
print(«API request error: {error}».format(error=e0))
pass

data = json.loads(json_data)

return data

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

def morph_word_lemma(key):
meaningfullPoSes=[‘NPRO’, ‘PREP’, ‘CONJ’, ‘PRCL’, ‘INTJ’] # фильтруем граммемы https://pymorphy2.readthedocs.io/en/latest/user/grammemes.html
reswords=[]

for word in re.findall(«([А-ЯЁа-яё0-9]+(-[А-ЯЁа-яё0-9]+)*)», key): # фразу бьем на слова
word = word[0]
word_normal_form = morph.parse(word)[0].normal_form
form = morph.parse(word)[0].tag

if form.POS in meaningfullPoSes:
continue
else:
reswords.append(word_normal_form)

return reswords

Не забываем, что pymorphy2 работает только с русским языком. Если в словосочетаниях будут фразы на другом языке, он их пропустит.

Составляем словарь вида «Лемма: [количество упоминаний леммы]».

def counter_dict_list(list_values):

list_values_all=[]

for item in list_values:
list_values_word_lemma = morph_word_lemma(item)

for item in list_values_word_lemma:
list_values_all.append(item)
dict_values_word_lemma = dict(Counter(list_values_all))

sorted_dict_values_word_lemma = list(dict_values_word_lemma.items())
sorted_dict_values_word_lemma.sort(key=lambda i: i[1], reverse=True)
sorted_dict_values_word_lemma = dict(sorted_dict_values_word_lemma)

return (sorted_dict_values_word_lemma)

Создаём финальный файл и записываем строку заголовка.

# чистим файл и записываем строку заголовка
f = open(‘api.txt’, ‘w’)
f.write(«key»+’t’ + «base_urls»+ ‘t’ + ‘symbols_median’ + ‘t’ + ‘n’)
f.close()

Получаем данные по API и парсим полученный текст.

def megaindex_text_score(key):

keyword_list = []
uniq_keyword_list = []

try:
url = ‘http://api.megaindex.com/visrep/text_score?key={}&words={}&ser_id={}’.format(token, key, ser_id)
r = requests.get(url)
json_string = r.text
parsed_string = json.loads(json_string)[‘data’]
list_base_urls = parsed_string[‘serps’][0][‘base_urls’]
symbols_median = parsed_string[‘old_api’][‘fragments’][‘long’][‘symbols_median’]
except Exception as ex_megaindex:
print(«API megaindex request error: {error}».format(error=ex_megaindex))
list_base_urls = []
symbols_median = ‘Данные не получены’

for url in list_base_urls:
url = url.replace(‘http:’, ‘https:’)
data = serpstat_keywords(url)

try:
for keyword in data[‘result’][‘hits’]:
keyword_list.append(keyword[‘keyword’])
except:
pass

for item in set(keyword_list):
uniq_keyword_list.append(item)

count_lemma = counter_dict_list(uniq_keyword_list)

return (list_base_urls, symbols_median, count_lemma)

Проходимся по списку маркерных запросов и генерируем задание.

print (‘Всего будет сгенерировано ТЗ: ‘, len(keywords_list))

for keywords in keywords_list:
print(keywords)

try:
list_base_urls, symbols_median, count_lemma = megaindex_text_score(keywords)
except Exception as ex:
pass
print(f’Errow: {ex}’)

with open(‘api.txt’, ‘a’) as f:
f.write(‘{}t{}t{}tnn’.format(keywords, list_base_urls, symbols_median))
f.write(‘Лемма’ +’t’ + ‘Количество повторений’ + ‘n’)

for key, value in count_lemma.items():
f.write(‘{}t{}n’.format(key, value))
f.write(‘n’+’n’+’n’)

print (‘end’)

Получившийся результат переносим в «Google Таблицы». Пример ТЗ.

Нужно понимать, что «количество упоминаний леммы» в ТЗ — это сколько раз лемма встречалась в ключевых словах.

Вариант 2. Статья написана, требуется рерайт

Подход применим для случаев, когда статья уже написана, но не получает трафика.

Плюсы подхода:

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

Минусы (те же, что и у варианта номер один):

  • Нужна подписка на сервисы.
  • Данные, которые выдают сервисы, не всегда точны. Например, Megaindex не определяет длину текста меньше определённого количества знаков (около 200 символов). Поэтому показатели выборочно стоит перепроверить.
  • Не можем повлиять на кластеризацию.

Набор библиотек аналогичен варианту номер один, отличается набор входных параметров. Вместо списка основных маркерных запросов передаём словарь следующего вида:

{‘основной маркерный запрос статьи №1′:’url, соответствующий основному маркерному запросу’}

token = «xxxxxxxxxxxxxxxxxxx»
ser_id = 174 #ID поисковой системы яндекс_спб — 174
keywords_url_dict = {‘основной маркерный запрос статьи №1′:’url_основного маркерного запроса статьи №1’, ‘основной маркерный запрос статьи №2′:’url_основного маркерного запроса статьи №2’}

morph = pymorphy2.MorphAnalyzer() # создаем экземпляр pymorphy2, понадобится нам дальше для морфологического анализа

Следующие функции копируем из первого варианта:

  • serpstat_keywords;
  • morph_word_lemma;
  • counter_dict_list.

Чистим файл и записываем строку заголовка.

f = open(‘api.txt’, ‘w’)
f.write(«key»+’t’+»compare_urls» + ‘t’ + «base_urls»+ ‘t’ + «relevance» + ‘t’ + ‘symbols median’ + ‘t’ +’symbols text’+ ‘t’ + ‘symbols diff’+ ‘t’+ ‘words median’ + ‘t’ + ‘words value text’ + ‘t’ + ‘words diff’ + ‘n’)
f.close()

Получаем данные по API и парсим полученный текст. Получать будем следующие данные для ТЗ:

  • list_base_urls — список URL в топ-10 по маркерному запросу;
  • relevance — релевантность анализируемой страницы страницам в топе;
  • symbols_median — медиана длины текста (знаков без пробелов) по топу;
  • symbols_text — количество символов в анализируемом тексте;
  • symbols_diff — разница symbols_median и symbols_text;
  • words_median — медиана слова в URL по топу;
  • words_value_text — медиана слов в анализируемом тексте;
  • words_diff — разница слов;
  • count_lemma— посчитанные леммы.

def megaindex_text_score(key, key_url):

keyword_list = []
uniq_keyword_list = []

try:
url = ‘http://api.megaindex.com/visrep/text_score?key={}&words={}&ser_id={}&compare_urls={}’.format(token, key, ser_id, key_url)
r = requests.get(url)
json_string = r.text
parsed_string = json.loads(json_string)[‘data’]
list_base_urls = parsed_string[‘serps’][0][‘base_urls’]
relevance = parsed_string[‘serps’][0][‘compare_urls’][0][‘relevance’]*100
symbols_median = parsed_string[‘old_api’][‘fragments’][‘long’][‘symbols_median’]
symbols_text = parsed_string[‘old_api’][‘compare_docs’][key_url][‘fragments’][‘long’][‘symbols’]
symbols_diff = symbols_median — symbols_text
words_median = parsed_string[‘serps’][0][‘compare_urls’][0][‘diffs’][‘word_count’][‘long’][‘median’]
words_value_text = parsed_string[‘serps’][0][‘compare_urls’][0][‘diffs’][‘word_count’][‘long’][‘value’]
words_diff = parsed_string[‘serps’][0][‘compare_urls’][0][‘diffs’][‘word_count’][‘long’][‘diff’]

except Exception as ex_megaindex:
print(«API megaindex request error: {error}».format(error=ex_megaindex))
list_base_urls = []
symbols_median = ‘Данные не получены’

for url in list_base_urls:
url = url.replace(‘http:’, ‘https:’)
data = serpstat_keywords(url)

try:
for keyword in data[‘result’][‘hits’]:
keyword_list.append(keyword[‘keyword’])
except:
pass

for item in set(keyword_list):
uniq_keyword_list.append(item)

count_lemma = counter_dict_list(uniq_keyword_list)

return (list_base_urls, relevance, symbols_median, symbols_text, symbols_diff, words_median, words_value_text, words_diff, count_lemma)

Проходимся по списку маркерных запросов и генерируем задание.

print (‘Всего будет сгенерировано ТЗ: ‘, len(keywords_url_dict))

for keywords in keywords_url_dict.keys():
print(keywords, keywords_url_dict[keywords])

try:
list_base_urls, relevance, symbols_median, symbols_text, symbols_diff, words_median, words_value_text, words_diff, count_lemma = megaindex_text_score(keywords, keywords_url_dict[keywords])
except Exception as ex:
pass
print(f’Errow: {ex}’)

with open(‘api.txt’, ‘a’) as f:
f.write(‘{}t{}t{}t{}t{}t{}t{}t{}t{}t{}tnn’.format(keywords, keywords_url_dict[keywords], list_base_urls, relevance, symbols_median, symbols_text, symbols_diff, words_median, words_value_text, words_diff))
f.write(‘Лемма’ +’t’ + ‘Количество повторений’ + ‘n’)

for key, value in count_lemma.items():
f.write(‘{}t{}n’.format(key, value))
f.write(‘n’+’n’+’n’)

print (‘end’)

Вариант 3. Семантическое ядро есть, статья не написана

Рассмотрим ситуацию, когда у специалиста есть собранное и кластеризованное семантическое ядро.

Плюсы подхода:

  • Работаем уже с тщательно проработанным и кластеризованным семантическим ядром.

Минусы (почти те же, что и у первого варианта):

  • Нужна подписка на сервисы.
  • Данные, которые выдают сервисы, не всегда точны. Например, Megaindex не определяет длину текста меньше определённого количества знаков (около 200 символов). Поэтому показатели выборочно стоит перепроверить.

Подключаем необходимые библиотеки, указываем токен для работы с Megaindex и ser_id нужного региона.

import pymorphy2
import requests
import json
import re
morph = pymorphy2.MorphAnalyzer()
token = «xxxxxxxxxxxxxxxxxxxxx»
ser_id = 174 #174 #ID поисковой системы яндекс_спб

Для работы скрипта нам понадобится txt-файл (‘data_tz.txt’) с кластеризованным ядром.

Формат файла: Ключ → Группа; разделитель табуляция.

item_dict = {}
flag = True

with open(‘data_tz.txt’) as file:

for line in file:

if flag:
flag = False # пропускаем строку заголовка
else:
line = line.strip().split(‘ ‘)
word = line[0]
group = line[1]

if group not in item_dict:
item_dict[group] = []
item_dict[group].append(word)
else:
item_dict[group].append(word)

Работаем со словарём, полученным на предыдущем шаге. Для каждой группы обходим все ключевые фразы, разбиваем их на слова, нормализуем и добавляем в словарь.

group_word_count_dict = {}

for key, value in item_dict.items():
group_word_count_dict.setdefault(key, {})

for item in value:

for word in re.findall(«([А-ЯЁа-яё0-9]+(-[А-ЯЁа-яё0-9]+)*)», item):
word = word[0]
word = morph.parse(word)[0].normal_form
form = morph.parse(word)[0].tag

#не добавляем в словарь местоимение-существительное, предлог, союз, частица, междометие
if (‘NPRO’ in form or ‘PREP’ in form or ‘CONJ’ in form or ‘PRCL’ in form or ‘INTJ’ in form):
continue
else:
group_word_count_dict[key].setdefault(word, 0)

if word in group_word_count_dict[key]:
group_word_count_dict[key][word] += 1

#Сортировка получивщегося словаря
for key, value in group_word_count_dict.items():
sorted_group_word_count_dict = list(value.items())
sorted_group_word_count_dict.sort(key=lambda i: i[1], reverse=True)
sorted_group_word_count_dict = dict(sorted_group_word_count_dict)
group_word_count_dict[key] = sorted_group_word_count_dict

print(group_word_count_dict)
print(‘end’)

Получаем данные по API и парсим полученный текст.

def megaindex_text_score(key):

try:
url = ‘http://api.megaindex.com/visrep/text_score?key={}&words={}&ser_id={}’.format(token, key, ser_id)
r = requests.get(url)
json_string = r.text
parsed_string = json.loads(json_string)[‘data’]
list_base_urls = parsed_string[‘serps’][0][‘base_urls’]
symbols_median = parsed_string[‘old_api’][‘fragments’][‘long’][‘symbols_median’]

except Exception as ex_megaindex:
print(«API megaindex request error: {error}».format(error=ex_megaindex))
list_base_urls = [‘Данные не получены’]
symbols_median = 0

return(list_base_urls, symbols_median)

Подготавливаем финальный файл.

# чистим файл
f = open(‘group_word_lemma.txt’, ‘w’)
f.write(‘Группа’ +’t’ + ‘Конкуренты’ +’t’ + ‘Символов ЗБП’+ ‘n’)
f.close()

with open(‘group_word_lemma.txt’ , ‘a’) as f:

for key_dict, value_dict in group_word_count_dict.items():

base_urls, symbols_median = megaindex_text_score(key_dict)

if symbols_median < 8000: # Ограничение по количеству символов

print(key_dict, base_urls, symbols_median)

f.write(‘{}t{}t{}nn’.format(key_dict, base_urls, symbols_median))
f.write(‘Лемма’ +’t’ + ‘Количество повторений’ + ‘n’)

for key, value in value_dict.items():
print(key, value)
f.write(‘{}t{}n’.format(key, value))
f.write(‘n’+’n’+’n’)

print(‘end’)

Проходимся по списку групп и генерируем задание.

with open(‘group_word_lemma.txt’ , ‘a’) as f:

for key_dict, value_dict in group_word_count_dict.items():

base_urls, symbols_median = megaindex_text_score(key_dict)

if symbols_median < 8000: # Ограничение по количеству символов

print(key_dict, base_urls, symbols_median)

f.write(‘{}t{}t{}nn’.format(key_dict, base_urls, symbols_median))
f.write(‘Лемма’ +’t’ + ‘Количество повторений’ + ‘n’)

for key, value in value_dict.items():
print(key, value)
f.write(‘{}t{}n’.format(key, value))
f.write(‘n’+’n’+’n’)
print(‘end’)

Так как основной маркерный запрос в этом случае — название категории, нужно следить за полнотой и правильностью её написания.

Аналогично первому варианту, получившийся результат переносим в «Google Таблицы». Получившееся ТЗ в таком же формате.

Предложенные скрипты можно дорабатывать, добавляя в них и другие важные на ваш взгляд требования к тексту.

Имея список URL конкурентов, можно парсить:

  • Title страниц.
  • Заголовки H1 — H6.
  • Количество нумерованных, маркированных списков, изображений на странице и так далее.

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

3. Анализ логов

При техническом аудите сайтов полезно анализировать логи сайта. Возможные варианты анализа:

  • Использовать возможности, которые предоставляет хостер. Чаще всего это решение в виде надстройки, например, AWStats. Минусы: не гибко, чаще всего предоставляется определённый набор графиков, которые никак не изменить.
  • Использовать платные решения. Например, Screaming Frog SEO Log File Analyser — бесплатная версия работает с файлами до 1000 строк. Минусы: цена, не всегда логи вашего сервера будут соответствовать тому виду, который требуется для работы в программе.
  • Использовать ELK-стек (elastic + logstash + kibana). Минусы: требуются знания по настройке хранилища и передаче в него данных.
  • Решение на Python с использованием библиотек.

Подробнее что про то, что такое логи, их структуру и содержание можно почитать в статье. Перейдём к скрипту.

Что потребуется:

  • Лог-файлы сайта.
  • Установленные Python-библиотеки.

Плюсы подхода:

  • Бесплатное решение.
  • Можно быстро проанализировать лог-файл в любом формате.
  • Легко обрабатывает большие файлы на несколько миллионов записей.

Минусы:

  • Хранение данных на своём устройстве (если работаете не на выделенном сервере).
  • Чтобы проанализировать данные за новый период, необходимо заново считать данные, разобрать и записать их в анализируемый CSV-файл.
  • В приведённом скрипте только базовые универсальные примеры анализа.

Для работы будем использовать библиотеку apache-log-parser, подробная документация по ссылке на GitHub.

import apache_log_parser
import csv

Для начала обработаем наш лог-файл и запишем данные в CSV. Если файлов несколько, склеить их можно следующей командой:

!cat access.log.1 access.log.2 access.log.3 > all_log.log

Создаем файл log.csv и записываем в него строку заголовка с названием столбцов. Столбцы определяются в соответствии с вашим лог-файлом.

csv_file = open(‘log.csv’, ‘w’)
data = [[‘remote_host’, ‘server_name2’, ‘query_string’, ‘time_received_isoformat’, ‘request_method’, ‘request_url’, ‘request_http_ver’, ‘request_url_scheme’, ‘request_url_query’, ‘status’, ‘response_bytes_clf’, ‘request_header_user_agent’, ‘request_header_user_agent__browser__family’, ‘request_header_user_agent__browser__version_string’, ‘request_header_user_agent__os__family’, ‘request_header_user_agent__os__version_string’, ‘request_header_user_agent__is_mobile’]]
with csv_file:
writer = csv.writer(csv_file)
writer.writerows(data)
csv_file.close()

Читаем построчно access.log, парсим строку и записываем разобранные данные в CSV. Используем функцию make_parser, которая принимает строку из файла журнала в указанном нами формате и возвращает проанализированные значения в виде словаря.

Формат строки из журнала указывается в make_parserс помощью поддерживаемых значений, указанных в документации, — supported values.

Пример строки

54.36.148.252 example.ru — [13/Oct/2019:12:00:01 +0300] «GET /lenta/example/example/p1 HTTP/1.1» 301 5 «-» «Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)» 0.137 0.137 .

Пример разбора

with open(‘all_log.log’) as file:
for line in file:

line = line.strip()
line_parser = apache_log_parser.make_parser(«%h %V %q %t «%r» %>s %b «%{Referer}i» «%{User-Agent}i»»)
log_line_data = line_parser(f'{line}’)

#Пишем в файл нужные данные
data = [[log_line_data[‘remote_host’], log_line_data[‘server_name2’], log_line_data[‘query_string’], log_line_data[‘time_received_isoformat’], log_line_data[‘request_method’], log_line_data[‘request_url’], log_line_data[‘request_http_ver’], log_line_data[‘request_url_scheme’], log_line_data[‘request_url_query’], log_line_data[‘status’], log_line_data[‘response_bytes_clf’], log_line_data[‘request_header_user_agent’], log_line_data[‘request_header_user_agent__browser__family’], log_line_data[‘request_header_user_agent__browser__version_string’], log_line_data[‘request_header_user_agent__os__family’], log_line_data[‘request_header_user_agent__os__version_string’], log_line_data[‘request_header_user_agent__is_mobile’]]]
csv_file = open(‘log.csv’, ‘a’)
with csv_file:
writer = csv.writer(csv_file)
writer.writerows(data)

Далее анализируем полученный CSV-файл. Анализ можно провести в Excel или любом другом удобном инструменте. Для примера рассмотрим несколько вариантом получения данных на Python.

Подключаем библиотеку для анализа данных и считываем файл.

import pandas as pd
data = pd.read_csv(‘log.csv’)

Посмотрим распределение страниц по статус коду страниц.

status_code_count = data[‘status’].value_counts()
print(status_code_count)

Посчитаем количество страниц со статусом 410 для каждого user-agent.

data[data[‘status’]==410][‘request_header_user_agent__browser__family’].value_counts()

В результате работы скрипта мы получили готовый CSV-файл с разобранными по столбцам записями из лог-файла. Далее можно анализировать данные в соответствии с вашими целями.

The examples below will increase in number of lines of code and difficulty:

1 line: Output

print ('Hello, world!')

2 lines: Input, assignment

name = input('What is your name?n')
print ('Hi, %s.' % name)

3 lines: For loop, built-in enumerate function, new style formatting

friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
    print ("iteration {iteration} is {name}".format(iteration=i, name=name))

4 lines: Fibonacci, tuple assignment

parents, babies = (1, 1)
while babies < 100:
    print ('This generation has {0} babies'.format(babies))
    parents, babies = (babies, parents + babies)

5 lines: Functions

def greet(name):
    print ('Hello', name)

greet('Jack')
greet('Jill')
greet('Bob')

6 lines: Import, regular expressions

import re
for test_string in ['555-1212', 'ILL-EGAL']:
    if re.match(r'^d{3}-d{4}$', test_string):
        print (test_string, 'is a valid US local phone number')
    else:
        print (test_string, 'rejected')

7 lines: Dictionaries, generator expressions

prices = {'apple': 0.40, 'banana': 0.50}
my_purchase = {
    'apple': 1,
    'banana': 6}
grocery_bill = sum(prices[fruit] * my_purchase[fruit]
                   for fruit in my_purchase)
print ('I owe the grocer $%.2f' % grocery_bill)

8 lines: Command line arguments, exception handling

# This program adds up integers that have been passed as arguments in the command line
import sys
try:
    total = sum(int(arg) for arg in sys.argv[1:])
    print ('sum =', total)
except ValueError:
    print ('Please supply integer arguments')

9 lines: Opening files

# indent your Python code to put into an email
import glob
# glob supports Unix style pathname extensions
python_files = glob.glob('*.py')
for file_name in sorted(python_files):
    print ('    ------' + file_name)

    with open(file_name) as f:
        for line in f:
            print ('    ' + line.rstrip())

    print()

10 lines: Time, conditionals, from..import, for..else

from time import localtime

activities = {8: 'Sleeping',
              9: 'Commuting',
              17: 'Working',
              18: 'Commuting',
              20: 'Eating',
              22: 'Resting' }

time_now = localtime()
hour = time_now.tm_hour

for activity_time in sorted(activities.keys()):
    if hour < activity_time:
        print (activities[activity_time])
        break
else:
    print ('Unknown, AFK or sleeping!')

11 lines: Triple-quoted strings, while loop

REFRAIN = '''
%d bottles of beer on the wall,
%d bottles of beer,
take one down, pass it around,
%d bottles of beer on the wall!
'''
bottles_of_beer = 9
while bottles_of_beer > 1:
    print (REFRAIN % (bottles_of_beer, bottles_of_beer,
        bottles_of_beer - 1))
    bottles_of_beer -= 1

12 lines: Classes

class BankAccount(object):
    def __init__(self, initial_balance=0):
        self.balance = initial_balance
    def deposit(self, amount):
        self.balance += amount
    def withdraw(self, amount):
        self.balance -= amount
    def overdrawn(self):
        return self.balance < 0
my_account = BankAccount(15)
my_account.withdraw(50)
print (my_account.balance, my_account.overdrawn())

13 lines: Unit testing with unittest

import unittest
def median(pool):
    copy = sorted(pool)
    size = len(copy)
    if size % 2 == 1:
        return copy[int((size - 1) / 2)]
    else:
        return (copy[int(size/2 - 1)] + copy[int(size/2)]) / 2
class TestMedian(unittest.TestCase):
    def testMedian(self):
        self.assertEqual(median([2, 9, 9, 7, 9, 2, 4, 5, 8]), 7)
if __name__ == '__main__':
    unittest.main()

14 lines: Doctest-based testing

def median(pool):
    '''Statistical median to demonstrate doctest.
    >>> median([2, 9, 9, 7, 9, 2, 4, 5, 8])
    6 #change to 7 in order to pass the test
    '''
    copy = sorted(pool)
    size = len(copy)
    if size % 2 == 1:
        return copy[int((size - 1) / 2)]
    else:
        return (copy[int(size/2 - 1)] + copy[int(size/2)]) / 2
if __name__ == '__main__':
    import doctest
    doctest.testmod()

15 lines: itertools

from itertools import groupby
lines = '''
This is the
first paragraph.

This is the second.
'''.splitlines()
# Use itertools.groupby and bool to return groups of
# consecutive lines that either have content or don't.
for has_chars, frags in groupby(lines, bool):
    if has_chars:
        print (' '.join(frags))
# PRINTS:
# This is the first paragraph.
# This is the second.

16 lines: csv module, tuple unpacking, cmp() built-in

import csv

# need to define cmp function in Python 3
def cmp(a, b):
    return (a > b) - (a < b)

# write stocks data as comma-separated values
with open('stocks.csv', 'w', newline='') as stocksFileW:
    writer = csv.writer(stocksFileW)
    writer.writerows([
        ['GOOG', 'Google, Inc.', 505.24, 0.47, 0.09],
        ['YHOO', 'Yahoo! Inc.', 27.38, 0.33, 1.22],
        ['CNET', 'CNET Networks, Inc.', 8.62, -0.13, -1.4901]
    ])

# read stocks data, print status messages
with open('stocks.csv', 'r') as stocksFile:
    stocks = csv.reader(stocksFile)

    status_labels = {-1: 'down', 0: 'unchanged', 1: 'up'}
    for ticker, name, price, change, pct in stocks:
        status = status_labels[cmp(float(change), 0.0)]
        print ('%s is %s (%.2f)' % (name, status, float(pct)))

18 lines: 8-Queens Problem (recursion)

BOARD_SIZE = 8

def under_attack(col, queens):
    left = right = col

    for r, c in reversed(queens):
        left, right = left - 1, right + 1

        if c in (left, col, right):
            return True
    return False

def solve(n):
    if n == 0:
        return [[]]

    smaller_solutions = solve(n - 1)

    return [solution+[(n,i+1)]
        for i in range(BOARD_SIZE)
            for solution in smaller_solutions
                if not under_attack(i+1, solution)]
for answer in solve(BOARD_SIZE):
    print (answer)

20 lines: Prime numbers sieve w/fancy generators

import itertools

def iter_primes():
     # an iterator of all numbers between 2 and +infinity
     numbers = itertools.count(2)

     # generate primes forever
     while True:
         # get the first number from the iterator (always a prime)
         prime = next(numbers)
         yield prime

         # this code iteratively builds up a chain of
         # filters...slightly tricky, but ponder it a bit
         numbers = filter(prime.__rmod__, numbers)

for p in iter_primes():
    if p > 1000:
        break
    print (p)

21 lines: XML/HTML parsing

dinner_recipe = '''<html><body><table>
<tr><th>amt</th><th>unit</th><th>item</th></tr>
<tr><td>24</td><td>slices</td><td>baguette</td></tr>
<tr><td>2+</td><td>tbsp</td><td>olive oil</td></tr>
<tr><td>1</td><td>cup</td><td>tomatoes</td></tr>
<tr><td>1</td><td>jar</td><td>pesto</td></tr>
</table></body></html>'''

# From http://effbot.org/zone/element-index.htm
import xml.etree.ElementTree as etree
tree = etree.fromstring(dinner_recipe)

# For invalid HTML use http://effbot.org/zone/element-soup.htm
# import ElementSoup, StringIO
# tree = ElementSoup.parse(StringIO.StringIO(dinner_recipe))

pantry = set(['olive oil', 'pesto'])
for ingredient in tree.getiterator('tr'):
    amt, unit, item = ingredient
    if item.tag == "td" and item.text not in pantry:
        print ("%s: %s %s" % (item.text, amt.text, unit.text))

28 lines: 8-Queens Problem (define your own exceptions)

BOARD_SIZE = 8

class BailOut(Exception):
    pass

def validate(queens):
    left = right = col = queens[-1]
    for r in reversed(queens[:-1]):
        left, right = left-1, right+1
        if r in (left, col, right):
            raise BailOut

def add_queen(queens):
    for i in range(BOARD_SIZE):
        test_queens = queens + [i]
        try:
            validate(test_queens)
            if len(test_queens) == BOARD_SIZE:
                return test_queens
            else:
                return add_queen(test_queens)
        except BailOut:
            pass
    raise BailOut

queens = add_queen([])
print (queens)
print ("n".join(". "*q + "Q " + ". "*(BOARD_SIZE-q-1) for q in queens))

33 lines: «Guess the Number» Game (edited) from http://inventwithpython.com

import random

guesses_made = 0

name = input('Hello! What is your name?n')

number = random.randint(1, 20)
print ('Well, {0}, I am thinking of a number between 1 and 20.'.format(name))

while guesses_made < 6:

    guess = int(input('Take a guess: '))

    guesses_made += 1

    if guess < number:
        print ('Your guess is too low.')

    if guess > number:
        print ('Your guess is too high.')

    if guess == number:
        break

if guess == number:
    print ('Good job, {0}! You guessed my number in {1} guesses!'.format(name, guesses_made))
else:
    print ('Nope. The number I was thinking of was {0}'.format(number))

These all run under Python 3. If you are interested in differences between Python 2 and Python 3, please take a look at the previous version of this page.


CategoryDocumentation

Понравилась статья? Поделить с друзьями:
  • Полезные программы после установки windows 10
  • Полезные программы на рабочий стол для windows 10
  • Полезные программы для системного администратора windows
  • Полезные программы для пк windows 7 64 bit скачать бесплатно
  • Полезные программы для пк windows 7 32 bit на русском скачать