Пожалуйста, обратите внимание, что пользователь заблокирован
Практикуясь на python, решил написать парсер для sharewood.biz. За акк спасибо Newbie.
Первым делом идём смотрим, какой и куда запрос предаётся при авторизации.
Кстати пользователь с таким логином и паролем действительно существует, случайно это обнаружил (Интересно почему?).
С логином и паролем понятно, что ещё за токен? Этот токен генерируется каждый раз, то есть каждый раз он новый. Смотрим исходный код страницы и видим:
Более менее понятно, начинаем кодить.
Импортируем нужные библиотеки: requests для авторизации, и BeautifulSoup для парсинга:
Открываем сессию, запоминаем её в переменную s, задаём headers, переходим по ссылке для авторизации:
Создаём объект класса BeautifulSoup, и парсим токен:
Создаём словарь login_data с нужными значениями:
Используя метод post передаём наш словарь, авторизуемся, и возвращаем ссесию:
Авторизовались. Теперь можно парсить данные с радостью подумал я, не меня ждал сюрприз.
Что же делать? Неужели придётся использовать selenium, подумал я. Но решил посмотреть, что происходит когда я нажимаю на лайк.
Интересно, значит идёт post запрос. Возможно удастся что-то сделать.
Попробуем перейти по этой ссылке:
Такс. Кнопка, ну ладно попробую передать post запрос, может прокатит. (На то "больше не нравится" не обращайте внимание, принцип такой же).
Что там у нас передаётся в запросе:
Знакомый нам токен, его мы уже умеем парсить, закодированная ссылка, уже начал искать как в pythone кодируются urlы. Но потом в исходном коде нашёл следущее:
То что нам нужно. Кстати нам нужно найти ссылку, на которую отправляется этот самый запрос: https://sharewood.biz/posts/43467/like
Эту самую, но в исходном коде не нашёл, но нашёл вот что:
Цифра есть, а ссылку можем сами сформировать. Начинаем:
Передаём в функцию сессию, и url на материал, впоследствии эти urlы брались из списка.
Парсим токен, url для запроса, и url на который отправлять запрос, записываем всё в словарь.
Делаем post запрос и переходим к нашему материалу, который требуется спарсить, ищем этот элемент:
Результат работы, для наглядности печатаю токен, url для post запроса, и цифру, которая требуется для создания urlа, на который этот запрос отправляется:
Но при тестировнии возникает проблема:
Неужто не везде работает? Но перейдя на форум и попытавшись поставить лайк вижу:
Ясно. Оказывается у них ограничение: 15 лайков в сутки. Печально.
Способ полностью рабочий, я проверил это запустив парсер с ссылкой на материал который я не лайкал, лайк был поставлен.
Если бы не ограничение, можно было спарсить все ссылки в разделе, а потом прогнать через цикл. Но увы...
Если есть сайты, с которых вы хотите что-то спарсить, обращайтесь, если смогу - реализую.
P.S За код не ругайте, это черновой вариант, до чистого не пришлось дойти...
Код целиком:
Первым делом идём смотрим, какой и куда запрос предаётся при авторизации.
Кстати пользователь с таким логином и паролем действительно существует, случайно это обнаружил (Интересно почему?).
С логином и паролем понятно, что ещё за токен? Этот токен генерируется каждый раз, то есть каждый раз он новый. Смотрим исходный код страницы и видим:
Более менее понятно, начинаем кодить.
Импортируем нужные библиотеки: requests для авторизации, и BeautifulSoup для парсинга:
Python:
import requests
from bs4 import BeautifulSoup
Python:
def auth():
with requests.Session() as s:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66'
}
url = 'https://sharewood.biz/login/login'
r = s.get(url, headers=headers)
Python:
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
Python:
login_data = {
'login': 'login',
'password': 'password',
'remember': '1',
'_xfRedirect': 'https://sharewood.biz/',
'_xfToken': token
}
Python:
r = s.post(url, data=login_data, headers=headers)
return s
Авторизовались. Теперь можно парсить данные с радостью подумал я, не меня ждал сюрприз.
Что же делать? Неужели придётся использовать selenium, подумал я. Но решил посмотреть, что происходит когда я нажимаю на лайк.
Интересно, значит идёт post запрос. Возможно удастся что-то сделать.
Попробуем перейти по этой ссылке:
Такс. Кнопка, ну ладно попробую передать post запрос, может прокатит. (На то "больше не нравится" не обращайте внимание, принцип такой же).
Что там у нас передаётся в запросе:
Знакомый нам токен, его мы уже умеем парсить, закодированная ссылка, уже начал искать как в pythone кодируются urlы. Но потом в исходном коде нашёл следущее:
То что нам нужно. Кстати нам нужно найти ссылку, на которую отправляется этот самый запрос: https://sharewood.biz/posts/43467/like
Эту самую, но в исходном коде не нашёл, но нашёл вот что:
Цифра есть, а ссылку можем сами сформировать. Начинаем:
Передаём в функцию сессию, и url на материал, впоследствии эти urlы брались из списка.
Парсим токен, url для запроса, и url на который отправлять запрос, записываем всё в словарь.
Python:
def get_course(session, url):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66'
}
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
print(token)
r_url = soup.find('meta', {'property':'og:url'}).get('content')[21:]
print(r_url)
post = soup.find('article', class_='message message--post js-post js-inlineModContainer').get('data-content')[5:]
print(post)
data = {
'xfRequestUri': r_url,
'_xfWithData': '1',
'_xfToken': token,
'_xfResponseType': 'json'
}
Python:
p_url = 'https://sharewood.biz/posts/' + str(post) + '/like'
r = session.post(p_url, data=data, headers=headers)
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
mat = soup.find('div', class_='bbCodeBlock bbCodeBlock--hide clike').find('div', class_='bbCodeBlock-content').text
print(mat)
Результат работы, для наглядности печатаю токен, url для post запроса, и цифру, которая требуется для создания urlа, на который этот запрос отправляется:
Но при тестировнии возникает проблема:
Неужто не везде работает? Но перейдя на форум и попытавшись поставить лайк вижу:
Ясно. Оказывается у них ограничение: 15 лайков в сутки. Печально.
Способ полностью рабочий, я проверил это запустив парсер с ссылкой на материал который я не лайкал, лайк был поставлен.
Если бы не ограничение, можно было спарсить все ссылки в разделе, а потом прогнать через цикл. Но увы...
Если есть сайты, с которых вы хотите что-то спарсить, обращайтесь, если смогу - реализую.
P.S За код не ругайте, это черновой вариант, до чистого не пришлось дойти...
Код целиком:
Python:
from bs4 import BeautifulSoup
import requests
def auth():
with requests.Session() as s:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66'
}
url = 'https://sharewood.biz/login/login'
r = s.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
login_data = {
'login': 'login',
'password': 'password',
'remember': '1',
'_xfRedirect': 'https://sharewood.biz/',
'_xfToken': token
}
r = s.post(url, data=login_data, headers=headers)
return s
def get_course(session, url):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66'
}
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
print(token)
r_url = soup.find('meta', {'property':'og:url'}).get('content')[21:]
print(r_url)
post = soup.find('article', class_='message message--post js-post js-inlineModContainer').get('data-content')[5:]
print(post)
data = {
'xfRequestUri': r_url,
'_xfWithData': '1',
'_xfToken': token,
'_xfResponseType': 'json'
}
p_url = 'https://sharewood.biz/posts/' + str(post) + '/like'
r = session.post(p_url, data=data, headers=headers)
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
mat = soup.find('div', class_='bbCodeBlock bbCodeBlock--hide clike')#.find('div', class_='bbCodeBlock-content').text
print(mat)
def main():
url = 'https://sharewood.biz/threads/swiftbook-Платные-видеокурсы-на-русском-языке-по-swift-5-2019.49758/'
s = auth()
get_course(s, url)
if __name__ == '__main__':
main()