• XSS.stack #1 – первый литературный журнал от юзеров форума

Как я писал парсер для sharewod.biz. (Спойлер: не дописал).

Hiccstrid

RAID-массив
Забанен
Регистрация
10.06.2019
Сообщения
54
Реакции
27
Пожалуйста, обратите внимание, что пользователь заблокирован
Практикуясь на python, решил написать парсер для sharewood.biz. За акк спасибо Newbie.
Первым делом идём смотрим, какой и куда запрос предаётся при авторизации.

4564


4565


Кстати пользователь с таким логином и паролем действительно существует, случайно это обнаружил (Интересно почему?).
С логином и паролем понятно, что ещё за токен? Этот токен генерируется каждый раз, то есть каждый раз он новый. Смотрим исходный код страницы и видим:

4566


Более менее понятно, начинаем кодить.
Импортируем нужные библиотеки: requests для авторизации, и BeautifulSoup для парсинга:
Python:
import requests
from bs4 import BeautifulSoup
Открываем сессию, запоминаем её в переменную s, задаём headers, переходим по ссылке для авторизации:
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)
Создаём объект класса BeautifulSoup, и парсим токен:
Python:
soup = BeautifulSoup(r.text, 'lxml')
token = soup.find('input', {'name':'_xfToken'}).get('value')
Создаём словарь login_data с нужными значениями:
Python:
login_data = {
        'login': 'login',                            
        'password': 'password',                    
        'remember': '1',
        '_xfRedirect': 'https://sharewood.biz/',
        '_xfToken': token
        }
Используя метод post передаём наш словарь, авторизуемся, и возвращаем ссесию:
Python:
r = s.post(url, data=login_data, headers=headers)
return s

Авторизовались. Теперь можно парсить данные с радостью подумал я, не меня ждал сюрприз.

4568


Что же делать? Неужели придётся использовать selenium, подумал я. Но решил посмотреть, что происходит когда я нажимаю на лайк.

4589

Интересно, значит идёт post запрос. Возможно удастся что-то сделать.
Попробуем перейти по этой ссылке:

4584

Такс. Кнопка, ну ладно попробую передать post запрос, может прокатит. (На то "больше не нравится" не обращайте внимание, принцип такой же).
Что там у нас передаётся в запросе:

4585


Знакомый нам токен, его мы уже умеем парсить, закодированная ссылка, уже начал искать как в pythone кодируются urlы. Но потом в исходном коде нашёл следущее:

4588


То что нам нужно. Кстати нам нужно найти ссылку, на которую отправляется этот самый запрос: https://sharewood.biz/posts/43467/like
Эту самую, но в исходном коде не нашёл, но нашёл вот что:

4590


Цифра есть, а ссылку можем сами сформировать. Начинаем:
Передаём в функцию сессию, и 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'
    }
Делаем post запрос и переходим к нашему материалу, который требуется спарсить, ищем этот элемент:
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а, на который этот запрос отправляется:

4591


Но при тестировнии возникает проблема:

4592


Неужто не везде работает? Но перейдя на форум и попытавшись поставить лайк вижу:

4593


Ясно. Оказывается у них ограничение: 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()
 

Вложения

  • 2019-07-16_20-03-15.png
    2019-07-16_20-03-15.png
    8.1 КБ · Просмотры: 173
  • 2019-07-16_20-06-29.png
    2019-07-16_20-06-29.png
    9 КБ · Просмотры: 173
мультипоток сделал бы на шарпе каком-то) а так можно думаю написать рабочий парсер, если посмотреть есть ли у них тариф с анлим лайками
 
Пожалуйста, обратите внимание, что пользователь заблокирован
мультипоток сделал бы на шарпе каком-то) а так можно думаю написать рабочий парсер, если посмотреть есть ли у них тариф с анлим лайками
какой еще шарп. Речь о питоне.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
мультипоток сделал бы на шарпе каком-то) а так можно думаю написать рабочий парсер, если посмотреть есть ли у них тариф с анлим лайками
Для всех одинаково: 15 лайков, у модера их спрашивал, тут только если модераторский акк.
 
Для всех любителей питона и парсеров, хотел бы от себя еще посоветовать либу Grab, с ней можно быстро распарсить сайты как с BeautifulSoup только на мой взгляд быстрее и проще.

Авторизация:

from grab import Grab
g = Grab()
g.go('https://google.com')
g.doc.set_input('login', 'login')
g.doc.set_input('pass', 'pass')
g.submit()

Поиск нужной информации:

from grab import Grab
g = Grab()
g.go('https://google.com')
g.doc.select('//a[@class="b-serp-item__title-link"]/@href').text()

Это я так на вскидку что вспомнил) подробнее тут: https://grablab.org/docs/index.html
 
Немного добавлю по сессиям в requests.
Чтобы каждый раз не писать headers=headers, заголовки в сессии можно задать сразу (также и прокси с куками):
Python:
s = requests.session()
s.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0',
                  'Referer': 'https://www.google.com'})
s.proxies.update({'http': 'socks5://127.0.0.1:9050', 'https': 'socks5://127.0.0.1:9050'})
А если нужно одноразово именить один из заголовков в каком-то одном запросе, тогда можно через параметр headers:
Python:
r = s.get(url, headers={'Referer': 'https://www.yandex.ru'}, timeout=10)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Что мешает запилить авторегер? Или там капча?
UPD:

Ооо... Мой... бог! :D

g3tOtKb.png
Проблема не в этом. При регистрации вы получаете обычный акк, то есть скачать вы ничего не сможете. Для того, чтобы качать и ставить лайки, нужно купить премку за 490 рублей.
Вот и обломс...
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Для всех любителей питона и парсеров, хотел бы от себя еще посоветовать либу Grab, с ней можно быстро распарсить сайты как с BeautifulSoup только на мой взгляд быстрее и проще.

Авторизация:

from grab import Grab
g = Grab()
g.go('https://google.com')
g.doc.set_input('login', 'login')
g.doc.set_input('pass', 'pass')
g.submit()

Поиск нужной информации:

from grab import Grab
g = Grab()
g.go('https://google.com')
g.doc.select('//a[@class="b-serp-item__title-link"]/@href').text()

Это я так на вскидку что вспомнил) подробнее тут: https://grablab.org/docs/index.html
Вот это интересно.Не работал с Grab, слушай вопросы есть.
Ты через
g.doc.set_input('login', 'login')
g.doc.set_input('pass', 'pass')
g.submit()

передаёшь инфу в поля а потом инициализируешь нажатие кнопки или как?)
 
Вот это интересно.Не работал с Grab, слушай вопросы есть.
Ты через
g.doc.set_input('login', 'login')
g.doc.set_input('pass', 'pass')
g.submit()

передаёшь инфу в поля а потом инициализируешь нажатие кнопки или как?)

Да да все верно. либо g.doc.submit() либо g.submit() я так из головы просто накидал, но конструкция именно такая. Очень хорошая и простая lib.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да да все верно. либо g.doc.submit() либо g.submit() я так из головы просто накидал, но конструкция именно такая. Очень хорошая и простая lib.
Да, я уже понял.)Вчера топик написал о этой либе. Но узнал что оказывается она не будет корректно работать при написании софта с винды. В связи с тем что curl и pycurl нету в Шиндовс и в связи с этим она будет тупо крашиться. По этому нужно писать софты с Линьки, это прям грусть - боль. Но выходит чекеры на нём и брутеры писать самый кайф.
 
Да, я уже понял.)Вчера топик написал о этой либе. Но узнал что оказывается она не будет корректно работать при написании софта с винды. В связи с тем что curl и pycurl нету в Шиндовс и в связи с этим она будет тупо крашиться. По этому нужно писать софты с Линьки, это прям грусть - боль. Но выходит чекеры на нём и брутеры писать самый кайф.

Да почему) я ее без проблем под Win ставил. Она и там и там замечательно работает и все либы ставятся как pycurl и так далее)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да почему) я ее без проблем под Win ставил. Она и там и там замечательно работает и все либы ставятся как pycurl и так далее)
У меня python 3.7, пытался накатить pycurl и у меня крашится установка либы, пробовал через pip и easy.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Качай уже готовый exe и ставь) зачем усложнять. http://pycurl.sourceforge.net/download/pycurl-7.21.5/ вот тут качай только питон поставь 3.5 а не 3.7 или ищи под 3.7 готовый установщик. И вот еще есть .whl пареты готовые уже https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl
А на 3.5 у меня не накатывается Grab)) Пошёл я линьку ставить, заебло это
А что с паретами то делать? (Разобрался, но ... ERROR: pycurl-7.43.0.3-cp38-cp38m-win32.whl is not a supported wheel on this platform.)
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Тогда просто глянь готовый .exe pycurl для своей версии питона и все.
Они есть только под старые версии, к сожалению.А я пишу на 3.7 версии. Вот такие вот пироги.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх