सेमल्ट से एक ट्यूटोरियल: पायथन में वेब स्क्रैपिंग

मैंने हाल ही में KinoPoisk (IMDB का रूसी संस्करण) का दौरा किया है और मुझे पता चला है कि इन वर्षों में मैं 1000 से अधिक फिल्मों को रेट करने में सफल रहा। मुझे लगा कि इन आंकड़ों पर अधिक विस्तृत शोध करना दिलचस्प होगा: क्या मेरी फिल्म का स्वाद समय के साथ बदल गया है? वर्ष के किस मौसम में मैं अधिक फिल्में देखता हूं?

लेकिन इससे पहले कि हम सुंदर ग्राफिक्स का विश्लेषण और निर्माण करें, हमें डेटा प्राप्त करने की आवश्यकता है। दुर्भाग्य से, कई सेवाओं में सार्वजनिक एपीआई नहीं होता है, इसलिए आपको अपनी आस्तीन ऊपर रोल करना पड़ता है और HTML पृष्ठों को पार्स करना पड़ता है।

यह लेख उन लोगों के लिए है, जो हमेशा यह जानना चाहते थे कि वेब स्क्रेपिंग का उपयोग कैसे किया जाए, लेकिन इस पर अपना हाथ नहीं मिला या यह नहीं जानते थे कि कहां से शुरू करें।

कार्य

हमारा काम पहले से देखी गई फिल्मों के बारे में डेटा निकालना है: फिल्म का शीर्षक, देखने की तारीख और समय, उपयोगकर्ता की रेटिंग।

वास्तव में, हमारा काम 2 चरणों में होने जा रहा है:

स्टेज 1: html पेज डाउनलोड और सेव करें

चरण 2: पार्स HTML को आगे के विश्लेषण के लिए उपयुक्त प्रारूप में (csv, json, पांडा डेटाफ्रेम आदि)

उपकरण

Http-request भेजने के लिए बहुत सारे अजगर-पुस्तकालय हैं। सबसे प्रसिद्ध और बहुत आसान एक अनुरोध है।

Html पार्सिंग के लिए लाइब्रेरी चुनना भी आवश्यक है।

बीटफुलसुप, एलएक्सएमएल

Html को पार्स करने और उनमें से किसी एक को चुनने के लिए ये दो सबसे लोकप्रिय पुस्तकालय हैं, बस एक व्यक्तिगत प्राथमिकता है। इसके अलावा, इन पुस्तकालयों को एक-दूसरे से निकटता से जोड़ा गया है: एक्सीलरेशन के लिए सुंदर पार्स ने आंतरिक पार्सर के रूप में lxml का उपयोग करना शुरू कर दिया, और lxml में, एक सूपपर मॉड्यूल जोड़ा गया। दृष्टिकोणों की तुलना करने के लिए, मैं ब्यूटीफुलसप के साथ डेटा को पार्स करूँगा और मॉड्यूल lxml.html में XPath चयनकर्ताओं का उपयोग करूँगा।

डेटा डाउनलोड कर रहा है

चलो डेटा डाउनलोड करना शुरू करते हैं। सबसे पहले, आइए केवल पृष्ठ को url द्वारा प्राप्त करने और इसे स्थानीय फ़ाइल में सहेजने का प्रयास करें।

हम परिणामी फ़ाइल खोलते हैं और देखते हैं कि यह इतना आसान नहीं है: साइट ने हमें रोबोट माना और डेटा नहीं दिखाएगी।

आइए जानें साइट कैसे काम करती है

ब्राउज़र को साइट से जानकारी प्राप्त करने में कोई समस्या नहीं है। आइए देखें कि यह अनुरोध कैसे भेजता है। ऐसा करने के लिए हम ब्राउज़र में "डेवलपर टूल" में "नेटवर्क" पैनल का उपयोग करते हैं (मैं इसके लिए फायरबग का उपयोग करता हूं), आमतौर पर, हमें जो अनुरोध चाहिए वह सबसे लंबा है।

जैसा कि हम देख सकते हैं, ब्राउज़र हेडरएजेंट, कुकी और अन्य कई मापदंडों को भी भेजता है। सबसे पहले, हम सिर्फ हेडर में सही UserAgent भेजने की कोशिश करेंगे।

इस बार हम सफल हैं, और अब हमें आवश्यक डेटा दिया गया है। यह ध्यान देने योग्य है कि कभी-कभी साइट कुकी की वैधता की भी जांच करती है, जिस स्थिति में अनुरोध लाइब्रेरी में सत्र मदद करेगा।

सभी दरें डाउनलोड करें

अब हम दरों के साथ एक पृष्ठ को बचाने में सक्षम हैं। लेकिन आमतौर पर उपयोगकर्ता के पास बहुत सारी दरें होती हैं, और सभी पृष्ठों के माध्यम से पुनरावृति करना आवश्यक है। पृष्ठ संख्या जो हमें रुचिकर बनाती है, वह सीधे url में स्थानांतरित करना आसान है।

Html से डेटा एकत्रित करना

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

bs4 आयात से BeautifulSoup

lxml आयात html से

# सुंदर सूप

सूप = सुंदरसुपे (पाठ)

film_list = soup.find ('div', ('वर्ग': 'profileFilmsList'))

# एलएक्सएमएल

पेड़ = HTML.fromstring (पाठ)

film_list_lxml = tree.xpath ('// div [@class =' 'प्रोफाइलफिल्मिस्ट' ']'] [0]

आइए जानें कि फिल्म का रूसी शीर्षक और फिल्म के पृष्ठ का लिंक कैसे निकाला जाए (पाठ और विशेषता का मूल्य कैसे प्राप्त करें)।

यदि आपको अंग्रेजी में शीर्षक निकालने की आवश्यकता है तो बस "nameRus" को "nameEng" में बदलें।

परिणाम

हमने वेबसाइटों को पार्स करने का तरीका सीखा, पुस्तकालयों के अनुरोधों, ब्यूटीफुल और एलएक्सएमएल के साथ-साथ KinoPoisk पर पहले से देखी गई फिल्मों के आगे के विश्लेषण के लिए उपयुक्त डेटा प्राप्त किया।