class MyClass:
def __init__(self):
self.methods = []
for name in dir(self):
attr = getattr(self, name)
if callable(attr) and not name.startswith("__"):
self.methods.append(attr)
def print_hello(self):
print("Hello!")
test = MyClass()
test.methods[0]()
class MyClass:
def __init__(self):
"""Тут не должно быть много логики"""
self.my_attr = 'my attribute'
@property
def methods(self):
"""Динамическое получение списка методов
Зачем так?
1) мы убрали логику из __init__
2) узнаем о методе, даже если добавили его потом с помощью setattr
"""
result = []
for name in dir(self):
# добавлена проверка name != 'methods',
# чтобы избежать бесконечной рекурсии
if name != 'methods' and not name.startswith("__"):
attr = getattr(self, name)
if callable(attr):
result.append(attr)
return result
@property
def my_property(self):
"""это property, а не метод"""
pass
def my_method_1(self):
"""а вот это метод"""
print("my method 1")
def my_method_2(self):
"""и это не метод"""
print("my method 2")
test = MyClass()
print('Всего методов:', len(test.methods))
for method in test.methods:
method()
# Получим в выводе две строки:
# Всего методов: 2
# my function 1
# my function 2
def get_session():
session = requests.Session()
session.headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'ru,en-US;q=0.5',
'Accept-Encoding':'gzip, deflate, br',
'DNT':'1',
'Connection':'keep-alive',
'Upgrade-Insecure-Requests':'1',
'Pragma':'no-cache',
'Cache-Control':'no-cache'}
return cfscrape.create_scraper(sess=session)
session = get_session() # Дальше работать как с обычной requests.Session
import requests
import cfscrape
def get_session():
session = requests.Session()
session.headers = {
'Host':'www.artstation.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'ru,en-US;q=0.5',
'Accept-Encoding':'gzip, deflate, br',
'DNT':'1',
'Connection':'keep-alive',
'Upgrade-Insecure-Requests':'1',
'Pragma':'no-cache',
'Cache-Control':'no-cache'}
return cfscrape.create_scraper(sess=session)
def artstation():
url = 'https://www.artstation.com/kyuyongeom'
page_url = 'https://www.artstation.com/users/kyuyongeom/projects.json'
post_pattern = 'https://www.artstation.com/projects/{}.json'
session = get_session()
absolute_links = []
response = session.get(page_url, params={'page':1}).json()
pages, modulo = divmod(response['total_count'], 50)
if modulo: pages += 1
for page in range(1, pages+1):
if page != 1:
response = session.get(page_url, params={'page':page}).json()
for post in response['data']:
shortcode = post['permalink'].split('/')[-1]
inner_resp = session.get(post_pattern.format(shortcode)).json()
for img in inner_resp['assets']:
if img['asset_type'] == 'image':
absolute_links.append(img['image_url'])
with open('links.txt', 'w') as file:
file.write('\n'.join(absolute_links))
if __name__ == '__main__':
artstation()
import requests
url = 'https://www.artstation.com/users/kuvshinov_ilya'
json_url = 'https://www.artstation.com/users/kuvshinov_ilya/projects.json?page=1'
header = {
'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'accept-encoding':'gzip, deflate, br',
'accept-language':'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'cache-control':'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
session = requests.Session()
session.headers = header
r = session.get(url)
if r.status_code == 200:
json_r = session.get(json_url)
if json_r.status_code == 200:
print(json_r.text)
else:
print(json_r.status_code)
input
на Python версии 3.5 и выше - зарегистрированный баг, являющийся следствием бага Python. Если вкратце, то функция print
использует для вывода сишную функцию write
с дескриптором stdout
, а функция input
WinAPI-вызов WriteConsoleW
, который управляющие последовательности не понимает. #!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
import pyautogui #грузим pyautogui
scri = pyautogui.size() #определим размер экрана
mous_pos = pyautogui.position() # определим позицию курсора
#pyautogui.moveTo(mous_pos[0]+100, mous_pos[1]+100, duration=1)
#Перемещение в вашем случае не обязательно - это пример
pyautogui.typewrite('\nСейчас я напечатаю десять символов в секунду!\n', interval=0.1)
print (scri, mous_pos[0], mous_pos[1]) # распечатаем позицию курсора мыши