Уведомления

Группа в Telegram: @pythonsu

#1 Март 19, 2014 15:41:42

S1asH
От:
Зарегистрирован: 2010-02-11
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

загрузка страниц с vk.com

народ помогите.
хочу собрать адреса всех страниц с vk со страницы поиска людей все не могу додумать как сделать так чтоб сначала вытаскивал первые 30 пользователей а потом на шел по ссылке и загружал остальные 30 и так пока не загрузит всех пользователей.



Офлайн

#2 Март 19, 2014 16:30:46

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

загрузка страниц с vk.com

Для этих целей, вроде как подходит vk api. Есть библиотека для python vkontakte, для запросов к api.
https://vk.com/pages?oid=-1&p=users.search

Отредактировано alexsis (Март 19, 2014 16:31:13)

Офлайн

#3 Март 20, 2014 06:03:55

S1asH
От:
Зарегистрирован: 2010-02-11
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

загрузка страниц с vk.com

хотелось бы все сделать без использования API.
думаю надо все это реализовать через цикл, но все не могу додумать как. т.е скрипт должен сначала первых 30 пользователей по ссылке (https://vk.com/search?c%5Bage_from%5D=18&c%5Bcity%5D=1&c%5Bcountry%5D=1&c%5Bname%5D=1&c%5Bphoto%5D=1&c%5Bsection%5D=people) потом по ссылке взятой из more и так пока пользователи не закончатся(не будит значения в more)

вот часть что написал

import mechanize
from BeautifulSoup import BeautifulSoup
import re
import time,datetime
br = mechanize.Browser()
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_robots(False)
br.open('https://vk.com/')
br.select_form(nr=0)
br.form['email'] = 'username'
br.form['pass'] = 'passwd'
br.submit()
br.open('https://vk.com/search?c%5Bage_from%5D=18&c%5Bcity%5D=1&c%5Bcountry%5D=1&c%5Bname%5D=1&c%5Bphoto%5D=1&c%5Bsection%5D=people')
doc=br.response().read()
soup=BeautifulSoup(''.join(doc))
#url = 'https://vk.com/' + soup.findAll(attrs={"class":"simple_fit_item search_item"})[0]['href']#ссылки на страницы
#more = 'https://vk.com/' + soup.findAll(attrs={"class": "show_more"})[0]['href']#ссылка на загрузку еще пользователей
"""тут должен быть код позволяющий загрузить пользователей из vk"""



Офлайн

#4 Март 20, 2014 09:49:55

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

загрузка страниц с vk.com

Почему вы избегаете использования api? Это будет намного удобней чем парсинг html.

Офлайн

#5 Март 20, 2014 10:58:48

S1asH
От:
Зарегистрирован: 2010-02-11
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

загрузка страниц с vk.com

в Api есть ограничение на количество результатов в 1000. и вопрос как мне обрабатывать параметр offset после 1000 результатов



Офлайн

#6 Март 20, 2014 12:42:41

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

загрузка страниц с vk.com

S1asH
в Api есть ограничение на количество результатов в 1000. и вопрос как мне обрабатывать параметр offset после 1000 результатов

Для каждого запроса просто нужно увеличивать смещение.

Офлайн

#7 Март 22, 2014 15:05:32

wiygn
Зарегистрирован: 2012-08-19
Сообщения: 52
Репутация: +  2  -
Профиль   Отправить e-mail  

загрузка страниц с vk.com

Вам сюда
https://vk.com/dev/users.search

Алгоритм несложный:
Из ответа на запрос апи берем

response.json()['response']['count']
— число
Над этим числом проводим нехитрую манипуляцию
number_of_cycles = round(count / 1000 + 0.5)
Тут мы делим на тысячу (ведь в ответе не может быть больше тысячи айтемов) и прибавляем .5 для постоянного округления вверх, чтобы, например, в случае 40331го результа начинался новый цикл, а завершался после парсинга сорока тысяч.

Потом задаем offset и начинаем нужный цикл

offset = 0
for i in range(number_of_cycles):
	# Каждый цикл возвращает нам 1000 идентификаторов и мы сохраняем их во временный список items для обхода
	r = requests.get(url=VK_API_URL, params={'offset': offset, 'count': 1000, 'v': '5.14'})
	items = r.json()['response']['items']
	# Проходимся по этому списку и делаем все что нам нужно
	for item in items:
		doTheMagic(item)
	# Задаем смещение для следующей тысячи
	offset += 1000

Конкретно в вашем случае даже с отдельными элементами ничего делать не нужно, а просто мерджить два списка.

Отредактировано wiygn (Март 22, 2014 15:06:09)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version