Фильтры на сайте никак не влияют на ссылку сайта (парсинг)
Есть сайт с которого нужно спарсить список состоящий из названий фильмов. Проблема заключается в том, что фильмы и сериалы находятся на одной страничке, а при фильтрации на самом сайте ссылка не меняется и я никак не могу дать парсеру понять что мне нужны только фильмы. Использование фильтров на сайте вообще никак не влияет на ссылку, что делать в такой ситуации?
Сайт с которого я пытаюсь парсить: https://hd.filmshd.top/xfsearch/genre/мелодрама/
def sandbox (base_url, headers):
movies = []
session = requests.Session()
request = session.get(base_url, headers = headers)
if request.status_code == 200:
soup = bs(request.content, 'html.parser')
divs = soup.select('div.th-item')
for div in divs:
name = div.find('div', attrs = {'class': 'th-tip-title'}).text
movies.append(name)
print(movies)
else:
print('FAILED')
Ответы (1 шт):
Автор решения: Wairua
→ Ссылка
Можно передать категорию в параметрах запроса
(Но при этом нужно использовать метод POST):
from bs4 import BeautifulSoup as Soup
import requests
def sandbox(base_url):
movies = []
payloads = {"xsort": "1", "xs_field": "category", "xs_value": "1"}
# "xs_value": "1" - Это фильмы
# "xs_value": "2" - Это сериалы
session = requests.Session()
request = session.post(base_url, data=payloads)
if request.status_code == 200:
soup = Soup(request.content, 'html.parser')
divs = soup.find_all('div', {'class': 'th-item'})
for div in divs:
name = div.find('div', {'class': 'th-tip-title'}).text
movies.append(name)
print(movies)
else:
print('FAILED')
if __name__ == '__main__':
sandbox('https://hd.filmshd.top/xfsearch/genre/%D0%BC%D0%B5%D0%BB%D0%BE%D0%B4%D1%80%D0%B0%D0%BC%D0%B0/')
Или отфильтровать ее в процессе обработки Soup:
from bs4 import BeautifulSoup as Soup
import requests
def sandbox(base_url):
movies = []
session = requests.Session()
request = session.get(base_url)
if request.status_code == 200:
soup = Soup(request.content, 'html.parser')
divs = soup.find_all('div', {'class': 'th-item'})
for div in divs:
if 'сезон' not in div.select_one('div', {'class': 'th-meta th-qual'}).text.strip():
name = div.find('div', {'class': 'th-tip-title'}).text
movies.append(name)
print(movies)
else:
print('FAILED')
if __name__ == '__main__':
sandbox('https://hd.filmshd.top/xfsearch/genre/%D0%BC%D0%B5%D0%BB%D0%BE%D0%B4%D1%80%D0%B0%D0%BC%D0%B0/')
# ['Хорошие новозди', 'Маленькие женщины', 'Уловки страсти: Девушка встречает парня', 'Повторим?', 'История любви из параллельного мира', 'Всем парням: P.S. Я люблю тебя', 'Принцесса Монако', 'Босиком по городу', 'Малефисента', 'Легионы']
Ну или вот так можно собрать названия со всех страниц с фильмами:
from bs4 import BeautifulSoup as Soup
import requests
def sandbox(base_url):
movies = []
payloads = {"xsort": "1", "xs_field": "category", "xs_value": "1"}
with requests.Session() as session:
request = session.post(base_url, data=payloads)
if request.status_code == 200:
soup = Soup(request.content, 'html.parser')
pages_qty = int(soup.find('div', {'class': 'navigation'}).find_all('a')[-1].text)
for page in range(1, pages_qty + 1):
page_url = base_url + f'page/{page}/'
html = session.get(page_url)
if request.status_code == 200:
soup = Soup(html.content, 'html.parser')
divs = soup.find_all('div', {'class': 'th-item'})
for div in divs:
name = div.find('div', {'class': 'th-tip-title'}).text
movies.append(name)
else:
print('FAILED')
print(movies)
else:
print('FAILED')
if __name__ == '__main__':
sandbox('https://hd.filmshd.top/xfsearch/genre/%D0%BC%D0%B5%D0%BB%D0%BE%D0%B4%D1%80%D0%B0%D0%BC%D0%B0/')