2014-07-21 14 views
7

मैं कुछ कोडिंग नौसिखिया हूं, और मैं एंड्रॉइड 3000 के गीत रैप प्रतिभा, http://genius.com/artists/Andre-3000 से सुंदर सूप (एक पायथन लाइब्रेरी का उपयोग करके डेटा खींचने के लिए स्क्रैप करने की कोशिश कर रहा हूं) एचटीएमएल और एक्सएमएल फाइलें)। मेरे अंतिम लक्ष्य में एक स्ट्रिंग प्रारूप में डेटा है। यहां मेरे पास अब तक है:रैप जीनियस डब्ल्यू/पायथन पर वेब स्क्रैपिंग रैप गीत

from bs4 import BeautifulSoup 
from urllib2 import urlopen 

artist_url = "http://rapgenius.com/artists/Andre-3000" 

def get_song_links(url): 
    html = urlopen(url).read() 
    # print html 
    soup = BeautifulSoup(html, "lxml") 
    container = soup.find("div", "container") 
    song_links = [BASE_URL + dd.a["href"] for dd in container.findAll("dd")] 

    print song_links 

get_song_links(artist_url) 
for link in soup.find_all('a'): 
    print(link.get('href')) 

इसलिए मुझे शेष कोड के साथ मदद चाहिए। मैं अपने गीत स्ट्रिंग प्रारूप में कैसे प्राप्त करूं? और फिर मैं वाक्य और शब्दों को टोकन करने के लिए राष्ट्रीय भाषा उपकरण किट (nltk) का उपयोग कैसे करूं?

उत्तर

3

यहाँ एक उदाहरण है, पृष्ठ पर गीत लिंक के सभी हड़पने कैसे उन्हें का पालन करें और मिल गाने के बोल:

from urlparse import urljoin 
from bs4 import BeautifulSoup 
import requests 


BASE_URL = "http://genius.com" 
artist_url = "http://genius.com/artists/Andre-3000/" 

response = requests.get(artist_url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36'}) 

soup = BeautifulSoup(response.text, "lxml") 
for song_link in soup.select('ul.song_list > li > a'): 
    link = urljoin(BASE_URL, song_link['href']) 
    response = requests.get(link) 
    soup = BeautifulSoup(response.text) 
    lyrics = soup.find('div', class_='lyrics').text.strip() 

    # tokenize `lyrics` with nltk 

ध्यान दें कि requests मॉड्यूल यहाँ प्रयोग किया जाता है। यह भी ध्यान रखें कि User-Agent शीर्षलेख आवश्यक है क्योंकि साइट 403 - Forbidden इसके बिना लौटाती है।

+0

इस महान है, लेकिन मैं इस त्रुटि मिलती है जब मैं इसे चलाने के लिए प्रयास करें "ImportError: नहीं मॉड्यूल नामित BS4" – Ibrewster

+0

@Ibrewster आप 'beautifulsoup4' स्थापित करने की आवश्यकता: रन 'पीआईपी सुंदरसूप 4 स्थापित करें। – alecxe

+0

हाँ, मेरे पास पहले से ही bs4 स्थापित है, और यह काम नहीं कर रहा था। तो मैंने इसे पुनः स्थापित करने का प्रयास किया और यह अभी भी काम नहीं करता है। – Ibrewster

1

सबसे पहले, प्रत्येक लिंक के लिए आपको उस पृष्ठ को डाउनलोड करने और सुंदरसप के साथ इसका विश्लेषण करने की आवश्यकता होगी। फिर उस पृष्ठ पर एक विशिष्ट विशेषता की तलाश करें जो गीत को अन्य पृष्ठ सामग्री से अलग करता है। मुझे उपयोगी होने के लिए < डेटा-संपादकीय-राज्य = "स्वीकृत" डेटा-वर्गीकरण = "स्वीकृत" डेटा-समूह = "0" > मिला। फिर सभी गीत रेखाएं प्राप्त करने के लिए गीत पृष्ठ सामग्री पर .find_all चलाएं। प्रत्येक पंक्ति के लिए आप प्रत्येक गीत रेखा से टेक्स्ट प्राप्त करने के लिए .get_text() पर कॉल कर सकते हैं।

NLTK का सवाल है, एक बार यह स्थापित किया गया है आप इसे आयात और इतने तरह वाक्य पार्स कर सकते हैं:

from nltk.tokenize import word_tokenize, sent_tokenize 
words = [word_tokenize(t) for t in sent_tokenize(lyric_text)] 

यह आपको प्रत्येक वाक्य में सभी शब्दों की एक सूची दे देंगे।

0

आशा है कि यह अभी भी प्रासंगिक है! मैं एमिनेम के गीतों के साथ एक ही काम कर रहा हूं, लेकिन lyrics.com से। क्या इसे रैप जीनियस से होना है? मैंने lyrics.com को स्क्रैप करना आसान पाया।

आंद्रे 3000 प्राप्त करने के लिए बस कोड को तदनुसार बदलें।

मेरा कोड यहां है; यह गीत लिंक हो जाता है और फिर उन पृष्ठों गीत पाने के लिए scrapes और एक सूची के लिए गीत संलग्न कर देता है:

import re 
import requests 
import nltk 
from bs4 import BeautifulSoup 

url = 'http://www.lyrics.com/eminem' 
r = requests.get(url) 
soup = BeautifulSoup(r.content) 
gdata = soup.find_all('div',{'class':'row'}) 

eminemLyrics = [] 

for item in gdata: 
    title = item.find_all('a',{'itemprop':'name'})[0].text 
    lyricsdotcom = 'http://www.lyrics.com' 
    for link in item('a'): 
     try: 
      lyriclink = lyricsdotcom+link.get('href') 
      req = requests.get(lyriclink) 
      lyricsoup = BeautifulSoup(req.content) 
      lyricdata = lyricsoup.find_all('div',{'id':re.compile('lyric_space|lyrics')})[0].text 
      eminemLyrics.append([title,lyricdata]) 
      print title 
      print lyricdata 
      print 
     except: 
      pass 

यह आपको एक सूची में बोल दे देंगे। सभी शीर्षक मुद्रित करने के लिए:

titles = [i[0] for i in eminemLyrics] 
print titles 

एक विशेष गीत पाने के लिए:

titles.index('Cleaning out My Closet') 
120 

गीत tokenize करने के लिए, में है कि मूल्य (120) प्लग:

song = nltk.word_tokenize(eminemLyrics[120][1]) 
nltk.pos_tag(song) 
1

GitHub/jashanj0tsingh/LyricsScraper.py के बुनियादी scraping प्रदान करता है genius.com को एक टेक्स्ट फ़ाइल में गीत दें जहां प्रत्येक पंक्ति एक गीत का प्रतिनिधित्व करती है। यह कलाकार के नाम को इनपुट के रूप में लेता है। जेनरेट की गई टेक्स्ट फ़ाइल को तब आपके कस्टम nltk या सामान्य पार्सर को आसानी से खिलाया जा सकता है जो आप चाहते हैं।

कोड के नीचे है:

# A simple script to scrape lyrics from the genius.com based on atrtist name. 

import re 
import requests 
import time 
import codecs 

from bs4 import BeautifulSoup 
from selenium import webdriver 

mybrowser = webdriver.Chrome("path\to\chromedriver\binary") # Browser and path to Web driver you wish to automate your tests cases. 

user_input = input("Enter Artist Name = ").replace(" ","+") # User_Input = Artist Name 
base_url = "https://genius.com/search?q="+user_input # Append User_Input to search query 
mybrowser.get(base_url) # Open in browser 

t_sec = time.time() + 60*20 # seconds*minutes 
while(time.time()<t_sec): # Reach the bottom of the page as per time for now TODO: Better condition to check end of page. 
    mybrowser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    html = mybrowser.page_source 
    soup = BeautifulSoup(html, "html.parser") 
    time.sleep(5) 

pattern = re.compile("[\S]+-lyrics$") # Filter http links that end with "lyrics". 
pattern2 = re.compile("\[(.*?)\]") # Remove unnecessary text from the lyrics such as [Intro], [Chorus] etc.. 

with codecs.open('lyrics.txt','a','utf-8-sig') as myfile: 
    for link in soup.find_all('a',href=True): 
      if pattern.match(link['href']): 
       f = requests.get(link['href']) 
       lyricsoup = BeautifulSoup(f.content,"html.parser") 
       #lyrics = lyricsoup.find("lyrics").get_text().replace("\n","") # Each song in one line. 
       lyrics = lyricsoup.find("lyrics").get_text() # Line by Line 
       lyrics = re.sub(pattern2, "", lyrics) 
       myfile.write(lyrics+"\n") 
mybrowser.close() 
myfile.close() 
+0

इंस्टॉल करें [अपने उत्तर में कुछ संदर्भ जोड़ने का प्रयास करें] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain- लिंक-कहीं-सच-अच्छा-जवाब) – alex

संबंधित मुद्दे