2014-09-04 1 views
2

Я пытаюсь работать с web-Crawler в python, чтобы напечатать количество рекомендованных facebook. например, в этой статье из sky-news (http://news.sky.com/story/1330046/are-putins-little-green-men-back-in-ukraine) есть около 60 отзывов facebook. Я хочу напечатать это число в программе python с помощью веб-искателя. я пытался сделать это, но он не печатает ничего:Веб-искатель для facebook в python

import requests 
from bs4 import BeautifulSoup 

def get_single_item_data(item_url): 
    source_code = requests.get(item_url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text) 
    # if you want to gather information from that page 
    for item_name in soup.findAll('span', {'class': 'pluginCountTextDisconnected'}): 
     try: 
       print(item_name.string) 
     except: 
       print("error") 

get_single_item_data("http://news.sky.com/story/1330046/are-putins-little-green-men-back-in-ukraine") 
+0

Если ничего не печатает, то либо все 'item_name.string's являются' '' 'или' soup.findAll' возвращает пустой. Так почему бы вам не попробовать простую отладку, например 'found = soup.findAll (...); печать (найдено) '? – OJFord

+1

Если он ничего не печатает, очевидно, что цикл 'for' выполняет 0 раз, что означает, что' soup.findAll' ничего не возвращает, а это значит, что с этим классом нет элементов ''. Итак ... глядя на «суп», что заставляет вас думать, что такие элементы существуют? Можете ли вы опубликовать урезанный пример документа HTML, который, по вашему мнению, должен работать с этим кодом, но не так ли? (См. [MCVE] (http://stackoverflow.com/help/mcve).) – abarnert

+1

Кроме того, меня беспокоит, что вы используете 'findAll', который был« фактически устаревшим »именем в конце BS 3.x дней, и теперь является «наследием». Это означает, что вы копируете и вставляете какой-то действительно древний код (или после очень устаревшего учебника), и если это так, скорее всего, будет много проблем. – abarnert

ответ

2

Facebook рекомендует динамически загружаются из JavaScript, поэтому они не будут доступны для вашего HTML-парсер. Вам нужно будет использовать Graph API и FQL, чтобы получить ответ прямо из Facebook.

Here is a web console где вы можете исследовать запросы, как только вы создали токен доступа.

3

с Facebook рекомендует нагрузки в iframe. Вы можете следить за атрибут iframe Src на этой странице, а затем загрузить текст в span.pluginCountTextDisconnected в:

import requests 
from bs4 import BeautifulSoup 

url = 'http://news.sky.com/story/1330046/are-putins-little-green-men-back-in-ukraine' 
r = requests.get(url) # get the page through requests 
soup = BeautifulSoup(r.text) # create a BeautifulSoup object from the page's HTML 

url = soup('iframe')[0]['src'] # search for the iframe element and get its src attribute 
r = requests.get('http://' + url[2:]) # get the next page from requests with the iframe URL 
soup = BeautifulSoup(r.text) # create another BeautifulSoup object 

print(soup.find('span', class_='pluginCountTextDisconnected').string) # get the directed information 

Второй requests.get записывается как таковой из-за src атрибут возвращает //www.facebook.com/plugins/like.php?href=http%3A%2F%2Fnews.sky.com%2Fstory%2F1330046&send=false&layout=button_count&width=120&show_faces=false&action=recommend&colorscheme=light&font=arial&height=21. Я добавил http:// и проигнорировал ведущий //.


BeautifulSoup documentation
Requests documentation

+0

Большое спасибо, его работа !. – Yagel

+0

Я действительно не понимаю эти 3 строки кода и что это делает: 1.BeautifulSoup (r.text) 2.soup ('iframe') [0] ['src'] 3.requests.get ('http: // '+ url [2:]) Я только вчера начал изучать python, спасибо – Yagel

+1

@Yagel Я добавил комментарии к нескольким строкам и двум ссылкам для вас. – Celeo