Почему не работает функция? Использованы cUrl, requests, re, BeautifulSoup, urllib.parse.quote_plus итерация по offset
Не могу понять, почему функция не выполняется. Это учебная задача, поэтому использован cUrl, а не API.
По смыслу мы задаём запрос и число групп ВКонтакте, которое нам должен выдать поисковик. С функциями как таковыми я сталкиваюсь впервые поэтому return не писал.
Ячейка с кодом (я работаю в Jupyter Notebook) не завершается ошибкой, интерраптом или кёрнелом, выполняется до конца. В Jupyter print(request) показывает, что он правильно энкодит строку, принт по строкам данных не идёт. В GoogleColab не работают ни print, ни display по request
def VKGroupSearcher(request='Python', size=120):
offset = 0 # make default value to offset
# import libraries (to soft copy func in another notebook)
import requests
import re
from bs4 import BeautifulSoup
import urllib.parse
# Encode UTF-8 string in URL-decode for payload
request = urllib.parse.quote_plus(request)
display(request)
# create empty lists to fill by data
titles = list()
links = list()
members = list()
# do this cycle while volume of data not reached value = second par of func (size, default value=120)
while len(titles) > size:
#prepare to make payload with our values
url = "https://vk.com/al_search.php"
bs = 'act=show_more&al=1&al_ad=0&c%5Bq%5D=%D0%A7%D0%B5%D0%BB%D1%81%D0%B8&c%5Bsection%5D=communities&offset='
ls = '&query_id=8487084244853056841&real_offset='
payload='act=show_more&al=1&al_ad=0&c%5Bq%5D='+request+'&c%5Bsection%5D=communities&offset='+str(offset)+'&query_id=8487084244853056841&real_offset='+str(offset)
headers = {
'authority': 'vk.com',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400',
'x-requested-with': 'XMLHttpRequest',
'content-type': 'application/x-www-form-urlencoded',
'accept': '*/*',
'origin': 'https://vk.com',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'cookie': 'remixlang=0; remixstid=410050341_WXoC4nrzgM50ZFRz0Opo19adR4p9UgFI3aLrE5ma92s; remixflash=0.0.0; remixscreen_width=1920; remixscreen_height=1080; remixscreen_depth=24; remixscreen_orient=1; remixdt=0; remixusid=ZmRjMTczYjc0Njc1ZmRjMjNkNWY0MTc3; remixab=1; remixfeed=*.*.*.*.*.*.ph.photos%2Cvideos%2Cclips%2Cfriends%2Cgroups%2Cpodcasts%2Ccoronavirus%2Cukraine%2Cqazaqstan%2Cfootball%2Cphoto; remixscreen_dpr=1; remixmdevice=1920/1080/1/u0021u0021-u0021u0021u0021u0021; remixdark_color_scheme=1; remixcolor_scheme_mode=auto; remixff=101; remixgp=a9abd98da7e122a65a5d7b5f1e27c742; remixua=41%7C-1%7C104%7C149565787; remixrefkey=ac7597979ed97d5c31; remixscreen_winzoom=1; remixbdr=1; remixsid=5c89c7cbc204db9e61f852a68b7949030faa5c8f2b9fe40daf99dda858a75; remixseenads=0; remixjsp=%7B%22id%22%3A%22kifikxoq.ac%22%2C%22loc%22%3A%22https%3A//vk.com/search%3Fc%255Bper_page%255D%3D40%26c%255Bq%255D%3D%25D0%25A7%25D0%25B5%25D0%25BB%25D1%2581%25D0%25B8%26c%255Bsection%255D%3Dcommunities%22%2C%22events%22%3A%5B%5B%22TTFCP%22%2C1416%2C%22search%22%2C%224g%22%2C%22105208%22%5D%2C%5B%22domComplete%22%2C4394%2C%22search%22%2C%224g%22%2C%22105208%22%5D%2C%5B%22domContentLoadedEventEnd%22%2C2282%2C%22search%22%2C%224g%22%2C%22105208%22%5D%2C%5B%22loadEventEnd%22%2C4394%2C%22search%22%2C%224g%22%2C%22105208%22%5D%2C%5B%22TTI%22%2C5962%2C%22search%22%2C%224g%22%2C%22105208%22%5D%5D%7D'
}
response = requests.request("POST", url, headers=headers, data=payload)
# make our raw data as text and prepare to BS
page = response.text
# In data we have garbage with escape character. Clean it!
page = page.replace('\\', '')
page = page.replace('\\n', '')
soup = BeautifulSoup(page)
# Find div we need and parse this one and append to our lists
result = soup.findAll('div', {'data-sec':'groups'})
for res in result:
titles.append(res.find('img')['alt'])
links.append(res.find('a')['href'])
members.append(re.sub(r'\D', '', res.find('div', {'class':'info'}).text))
print(res.find('img')['alt']), res.find('a')['href'], re.sub(r'\D', '', res.find('div', {'class':'info'}).text)
offset +=40