Imdb webpage को कैसे स्क्रैप करें?


10

मैं डेटा विश्लेषण सीखने के प्रयास के एक भाग के रूप में अपने आप से पायथन का उपयोग करके वेब स्क्रैपिंग सीखने की कोशिश कर रहा हूं। मैं imdb वेबपेज को देखने की कोशिश कर रहा हूं जिसका url निम्नलिखित है: http://www.imdb.com/search/title?sort=num_votes,desc&start=1&title_type=fiture&year=1950,2012

मैं ब्यूटीफुल मॉड्यूल का उपयोग कर रहा हूं। निम्नलिखित कोड मैं उपयोग कर रहा हूं:

r = requests.get(url) # where url is the above url    
bs = BeautifulSoup(r.text)
for movie in bs.findAll('td','title'):
    title = movie.find('a').contents[0]
    genres = movie.find('span','genre').findAll('a')
    genres = [g.contents[0] for g in genres]
    runtime = movie.find('span','runtime').contents[0]
    year = movie.find('span','year_type').contents[0]
    print title, genres,runtime, rating, year

मुझे निम्नलिखित आउटपुट मिल रहे हैं:

The Shawshank Redemption [u'Crime', u'Drama'] 142 mins. (1994)

इस कोड का उपयोग करके, मैं शीर्षक, शैली, रनटाइम और वर्ष को परिमार्जन कर सकता हूं, लेकिन मैं imdb मूवी आईडी और न ही रेटिंग को परिमार्जन नहीं कर सकता। तत्वों (क्रोम ब्राउज़र में) का निरीक्षण करने के बाद, मुझे एक पैटर्न नहीं मिल रहा है, जो मुझे ऊपर दिए गए समान कोड का उपयोग करने देगा।

क्या कोई मुझे कोड का टुकड़ा लिखने में मदद कर सकता है जो मुझे फिल्म आईडी और रेटिंग्स को खत्म करने देगा?


1
मैंने आपके कोड को थोड़ा संपादित किया है लेकिन यह विफल है क्योंकि ratingपरिभाषित नहीं है। यदि आप इसे ठीक करते हैं, तो आप भी जोड़ सकते हैं from BeautifulSoup import BeautifulSoup, और import requests। और क्यों नहीं url="http://etc"हम भी दिखाते हैं कि हमें अपने लिए ऐसा नहीं करना है?
Spacedman

जवाबों:


12

स्क्रैप करने के बजाय, आप सीधे यहां डेटा प्राप्त करने का प्रयास कर सकते हैं: http://www.imdb.com/interfaces । ऐसा लगता है कि उनके पास फिल्मों, अभिनेताओं आदि के लिए ftp के माध्यम से डेटा उपलब्ध है।


2
@ क्रेग थैचर, लिंक के लिए धन्यवाद। यह परियोजना वेब स्क्रैपिंग और इसलिए इन सभी परेशानियों पर एक सीखने के प्रयास का हिस्सा है। - :)
user62198

8

मैं एक समाधान निकालने में सक्षम हूं। मैंने सोचा था कि अगर किसी को कुछ अलग करने का सुझाव देना है तो वह किसी भी तरह की मदद करेगा।

bs = BeautifulSoup(r.text)
for movie in bs.findAll('td','title'):
    title = movie.find('a').contents[0]
    genres = movie.find('span','genre').findAll('a')
    genres = [g.contents[0] for g in genres]
    runtime = movie.find('span','runtime').contents[0]
    rating = movie.find('span','value').contents[0]
    year = movie.find('span','year_type').contents[0]
    imdbID = movie.find('span','rating-cancel').a['href'].split('/')[2]
    print title, genres,runtime, rating, year, imdbID

आउटपुट इस तरह दिखता है:

The Shawshank Redemption [u'Crime', u'Drama'] 142 mins. 9.3 (1994) tt0111161

2

आप कक्षा से सब कुछ पा सकते हैं = "रेटिंग रेटिंग-सूची"

आपको केवल इतना करना है कि रिट्रीव एट्रीब्यूशन आईडी: [id = "tt1345836 | imdb | - 8.5 | 8.5 | advsearch"] जब आपके पास यह सामग्री हो, तो आप इस स्ट्रिंग को '|' से विभाजित करते हैं, और आपको मिलता है: 1. पैरामीटर: फिल्म आईडी 3. पैरामीटर: मूवी स्कोर


धन्यवाद। @ मैटिक डीबी ... मैं आईडी प्राप्त करने में सक्षम था।बेलो मेरा समाधान है
user62198

2

सामान्य प्रतिक्रिया के एक बिट के रूप में, मुझे लगता है कि आप अपने आउटपुट प्रारूप को बेहतर बनाने के लिए अच्छा करेंगे। प्रारूप के साथ समस्या यह खड़ा है कि प्रोग्रामेटिक रूप से डेटा प्राप्त करने का कोई पारदर्शी तरीका नहीं है। इसके बजाय प्रयास करने पर विचार करें:

print "\t".join([title, genres,runtime, rating, year])

टैब सीमांकित फ़ाइल के बारे में अच्छी बात यह है कि यदि आप स्केलिंग को समाप्त करते हैं, तो इसे आसानी से इम्पाला (या छोटे पैमाने पर, सरल मायस्कल तालिकाओं) में पढ़ा जा सकता है। इसके अतिरिक्त, आप तब अजगर में डेटा में प्रोग्रामेटिकली पढ़ सकते हैं:

 line.split("\t")

सलाह के दूसरे बिट, क्या मुझे लगता है कि आप अपने प्रारंभिक परिमार्जन की आवश्यकता से अधिक जानकारी प्राप्त करने का सुझाव देंगे। डिस्क स्थान प्रसंस्करण समय की तुलना में सस्ता है, इसलिए जब आप अपने एनालिटिक का विस्तार करते हैं तो हर बार स्क्रैपर को फिर से देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.