अजगर के साथ वेब स्क्रैपिंग [बंद]


183

मैं वेब साइट से दैनिक सूर्योदय / सूर्यास्त के समय को हड़पना चाहता हूं। क्या पायथन के साथ वेब सामग्री को परिमार्जन करना संभव है? मॉड्यूल क्या उपयोग किया जाता है? क्या कोई ट्यूटोरियल उपलब्ध है?


3
पायथन में वेब स्क्रैपिंग के कई विकल्प हैं। मैंने इसी तरह के सवाल के जवाब में यहां कुछ विकल्प गिनाए ।
फिलीपो

सिर्फ पायथॉन स्टैंडर्ड लाइब्रेरी में HTML पार्सर में निर्मित का उपयोग क्यों न करें? निश्चित रूप से एक कार्य के लिए इतना सरल और निराला (दिन में सिर्फ एक बार), मुझे किसी अन्य उपकरण की खोज करने के लिए बहुत कम कारण दिखाई देते हैं। docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare

आशा है कि यह पोस्ट इस संबंध में किसी के लिए उपयोगी हो सकती है। एक शुरुआत के लिए एक अच्छा ट्यूटोरियल। samranga.blogspot.com/2015/08/web-scraping-beginner-python.html यह अजगर के साथ वेब स्क्रैपिंग के लिए सुंदर सूप पाइथन लाइब्रेरी का उपयोग करता है।
समिधा चतुर्भुज

जवाबों:


187

शानदार BeautifulSoup लाइब्रेरी के संयोजन में urllib2 का उपयोग करें :

import urllib2
from BeautifulSoup import BeautifulSoup
# or if you're using BeautifulSoup4:
# from bs4 import BeautifulSoup

soup = BeautifulSoup(urllib2.urlopen('http://example.com').read())

for row in soup('table', {'class': 'spad'})[0].tbody('tr'):
    tds = row('td')
    print tds[0].string, tds[1].string
    # will print date and sunrise

7
छोटी टिप्पणी: यह 6 के साथ पंक्ति के स्थान पर सूप के साथ अनुरोध पैकेज का उपयोग करके थोड़ा सरलीकृत किया जा सकता है: सूप = सुंदरसुपे (अनुरोध.गेट (' example.com') पाठ )
डी कोएट्जी

4
पारितोषिक के लिए धन्यवाद। अनुरोध पैकेज अभी तक मौजूद नहीं था, जब मैंने ऊपर स्निपेट लिखा था ;-)

1
@DerrickCoetzee - आपका सरलीकरण एक मिसिंगसेमा त्रुटि (कम से कम मेरी स्थापना पर) उठाता है। यह काम करता है:soup = BeautifulSoup(requests.get('http://example.com').text)
kmkmote

@kmote: यह वही है जो मैंने टाइप किया था, लेकिन मैं backticksकोड के आसपास भूल गया और इसने इसे लिंक में बदल दिया। धन्यवाद!
D Coetzee

आप कैसे सुनिश्चित करेंगे कि सामग्री td और tr में होगी। यह उल और ली में भी सही हो सकता है?
शशांक हेगड़े

62

मैं सच में बकवास की सिफारिश करेंगे।

हटाए गए उत्तर से उद्धरण:

  • स्क्रेपी क्रॉलिंग मैकेनाइज की तुलना में सबसे तेज है क्योंकि अतुल्यकालिक संचालन (मुड़ के ऊपर) का उपयोग करता है।
  • स्क्रेपी को libxml2 के शीर्ष पर पार्सिंग (x) html के लिए बेहतर और तेज़ समर्थन प्राप्त है।
  • स्क्रेपी पूर्ण यूनिकोड के साथ एक परिपक्व ढांचा है, पुनर्निर्देशन, gzipped प्रतिक्रियाओं, विषम एनकोडिंग, एकीकृत कैश कैश आदि को संभालता है।
  • एक बार जब आप स्क्रेपी में होते हैं, तो आप 5 मिनट से भी कम समय में एक स्पाइडर लिख सकते हैं जो छवियों को डाउनलोड करता है, थंबनेल बनाता है और निकाले गए डेटा को सीधे csv या json में निर्यात करता है।

13
मैंने देखा कि यह सवाल पहले से ही 2 साल पुराना था, फिर भी लगता है कि किसी और के सवाल होने की स्थिति में स्क्रैपी का नाम यहाँ होना चाहिए।
शेजाक ट्रेकक

4
स्क्रैपी एक रूपरेखा है, और इसलिए यह भयानक है और सोचता है कि यह आपकी परियोजना से अधिक महत्वपूर्ण है। यह ट्विस्टेड की भयानक (अनावश्यक) सीमाओं के कारण एक रूपरेखा है।
user1244215

4
@ user1244215: यह एक फ्रेमवर्क है क्योंकि फ्रेमवर्क अच्छे हैं। यदि आप इसे एक फ्रेमवर्क के रूप में उपयोग नहीं करना चाहते हैं, तो आपको अपने सभी कोड को एक फ़ाइल में जाम करने से कुछ भी नहीं है।
ब्लेंडर

1
लेकिन यह पायथन 3.x का समर्थन नहीं करता है।

17

मैंने इस बिट-बकेट लाइब्रेरी में अपने वेब स्क्रैपिंग कार्य से स्क्रिप्ट एकत्र की ।

आपके मामले के लिए उदाहरण स्क्रिप्ट:

from webscraping import download, xpath
D = download.Download()

html = D.get('http://example.com')
for row in xpath.search(html, '//table[@class="spad"]/tbody/tr'):
    cols = xpath.search(row, '/td')
    print 'Sunrise: %s, Sunset: %s' % (cols[1], cols[2])

आउटपुट:

Sunrise: 08:39, Sunset: 16:08
Sunrise: 08:39, Sunset: 16:09
Sunrise: 08:39, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:11
Sunrise: 08:40, Sunset: 16:12
Sunrise: 08:40, Sunset: 16:13

10

मैं दृढ़ता से मवाद की जाँच करने का सुझाव दूंगा । इसमें jquery-like (aka css-like) सिंटैक्स का उपयोग किया गया है जो उस पृष्ठभूमि से आने वाले लोगों के लिए चीजों को वास्तव में आसान बनाता है।

आपके मामले के लिए, यह कुछ इस तरह होगा:

from pyquery import *

html = PyQuery(url='http://www.example.com/')
trs = html('table.spad tbody tr')

for tr in trs:
  tds = tr.getchildren()
  print tds[1].text, tds[2].text

आउटपुट:

5:16 AM 9:28 PM
5:15 AM 9:30 PM
5:13 AM 9:31 PM
5:12 AM 9:33 PM
5:11 AM 9:34 PM
5:10 AM 9:35 PM
5:09 AM 9:37 PM

7

HTTP अनुरोध करने के लिए आप urllib2 का उपयोग कर सकते हैं , और फिर आपके पास वेब सामग्री होगी।

आप इसे इस तरह प्राप्त कर सकते हैं:

import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()

सुंदर सूप एक अजगर HTML पार्सर है जो स्क्रीन स्क्रैपिंग के लिए अच्छा माना जाता है।

विशेष रूप से, यहाँ एक HTML दस्तावेज़ पार्स करने पर उनका ट्यूटोरियल है।

सौभाग्य!


यह बाइट्स रीड रीड पर अधिकतम सेट करने के लिए एक विचार हो सकता है। response.read (100000000) या ऐसा कुछ जो ISO के लिए उन URL को आपकी RAM भरता नहीं है। खुश खनन।
andrew pate

4

मैं स्क्रैपमार्क के एक संयोजन का उपयोग करता हूं (urls - py2 खोज रहा है) और CANlib2 (छवियों को डाउनलोड करना - py2 + 3)। स्क्रैपमार्कहोम कोड की 500 लाइनें हैं, लेकिन नियमित अभिव्यक्ति का उपयोग करता है, इसलिए यह इतना तेज़ नहीं हो सकता है, परीक्षण नहीं किया।

अपनी वेबसाइट को स्क्रैप करने के लिए उदाहरण:

import sys
from pprint import pprint
from scrapemark import scrape

pprint(scrape("""
    <table class="spad">
        <tbody>
            {*
                <tr>
                    <td>{{[].day}}</td>
                    <td>{{[].sunrise}}</td>
                    <td>{{[].sunset}}</td>
                    {# ... #}
                </tr>
            *}
        </tbody>
    </table>
""", url=sys.argv[1] ))

उपयोग:

python2 sunscraper.py http://www.example.com/

परिणाम:

[{'day': u'1. Dez 2012', 'sunrise': u'08:18', 'sunset': u'16:10'},
 {'day': u'2. Dez 2012', 'sunrise': u'08:19', 'sunset': u'16:10'},
 {'day': u'3. Dez 2012', 'sunrise': u'08:21', 'sunset': u'16:09'},
 {'day': u'4. Dez 2012', 'sunrise': u'08:22', 'sunset': u'16:09'},
 {'day': u'5. Dez 2012', 'sunrise': u'08:23', 'sunset': u'16:08'},
 {'day': u'6. Dez 2012', 'sunrise': u'08:25', 'sunset': u'16:08'},
 {'day': u'7. Dez 2012', 'sunrise': u'08:26', 'sunset': u'16:07'}]

1

उपयोग करके अपने जीवन को आसान बनाएं CSS Selectors

मुझे पता है कि मैं पार्टी करने के लिए देर से आया हूं लेकिन मेरे पास आपके लिए एक अच्छा सुझाव है।

उपयोग करना BeautifulSoupपहले से ही सुझाया गया है मैं CSS SelectorsHTML के अंदर डेटा परिमार्जन करना पसंद करूंगा

import urllib2
from bs4 import BeautifulSoup

main_url = "http://www.example.com"

main_page_html  = tryAgain(main_url)
main_page_soup = BeautifulSoup(main_page_html)

# Scrape all TDs from TRs inside Table
for tr in main_page_soup.select("table.class_of_table"):
   for td in tr.select("td#id"):
       print(td.text)
       # For acnhors inside TD
       print(td.select("a")[0].text)
       # Value of Href attribute
       print(td.select("a")[0]["href"])

# This is method that scrape URL and if it doesnt get scraped, waits for 20 seconds and then tries again. (I use it because my internet connection sometimes get disconnects)
def tryAgain(passed_url):
    try:
        page  = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
        return page
    except Exception:
        while 1:
            print("Trying again the URL:")
            print(passed_url)
            try:
                page  = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
                print("-------------------------------------")
                print("---- URL was successfully scraped ---")
                print("-------------------------------------")
                return page
            except Exception:
                time.sleep(20)
                continue 

1

अगर हम किसी विशिष्ट श्रेणी से वस्तुओं का नाम लेने के बारे में सोचते हैं तो हम ऐसा कर सकते हैं कि सीएसएस चयनकर्ता का उपयोग करके उस श्रेणी के वर्ग नाम को निर्दिष्ट करके:

import requests ; from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get('https://www.flipkart.com/').text, "lxml")
for link in soup.select('div._2kSfQ4'):
    print(link.text)

यह आंशिक खोज परिणाम है:

Puma, USPA, Adidas & moreUp to 70% OffMen's Shoes
Shirts, T-Shirts...Under ₹599For Men
Nike, UCB, Adidas & moreUnder ₹999Men's Sandals, Slippers
Philips & moreStarting 99LED Bulbs & Emergency Lights

0

यहाँ एक साधारण वेब क्रॉलर है, मैंने ब्यूटीफुल का उपयोग किया है और हम उन सभी लिंक्स (एंकर) की खोज करेंगे जिनका वर्ग नाम _3NFO0d है। मैंने Flipkar.com का उपयोग किया, यह एक ऑनलाइन रिटेलिंग स्टोर है।

import requests
from bs4 import BeautifulSoup
def crawl_flipkart():
    url = 'https://www.flipkart.com/'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text, "lxml")
    for link in soup.findAll('a', {'class': '_3NFO0d'}):
        href = link.get('href')
        print(href)

crawl_flipkart()

0

अजगर के पास वेब को खंगालने के लिए अच्छे विकल्प हैं। एक रूपरेखा के साथ सबसे अच्छा एक है scrapy । यह शुरुआती लोगों के लिए थोड़ा मुश्किल हो सकता है, इसलिए यहां थोड़ी मदद है।
1. 3.5 से ऊपर अजगर स्थापित करें (2.7 तक कम लोग काम करेंगे)।
2. कॉन्डा में एक वातावरण बनाएं (मैंने ऐसा किया था)।
3. किसी स्थान पर स्क्रैपी स्थापित करें और वहां से चलाएं।
4. Scrapy shellआपको कोड का परीक्षण करने के लिए एक इंटरेक्टिव इंटरफ़ेस देगा।
5. Scrapy startproject projectnameएक ढांचा तैयार करेगा।
6. Scrapy genspider spidernameएक मकड़ी पैदा करेगा। आप जितने चाहें उतने मकड़ी बना सकते हैं। यह सुनिश्चित करते हुए कि आप प्रोजेक्ट डायरेक्टरी के अंदर हैं।


अनुरोध और सुंदर सूप का उपयोग करना आसान है । दस्तावेज़ीकरण के माध्यम से जाने के लिए एक घंटे का समय देने से पहले, यह आपके अधिकांश संदेहों को हल कर देगा। BS4 आपके द्वारा चुने जा सकने वाले पार्सरों की विस्तृत श्रृंखला पेश करता है। स्क्रैपिंग को आसान बनाने के लिए उपयोग user-agentऔर उपयोग करें sleep। BS4 एक bs.tag का उपयोग करता है variable[0]। अगर कोई js चल रहा है, तो आप सीधे अनुरोधों और bs4 का उपयोग कर सकते हैं। आप एपीआई लिंक प्राप्त कर सकते हैं, फिर JSON को पार्स कर सकते हैं ताकि आपको आवश्यक जानकारी या कोशिश मिल सके selenium

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