Scrapowanie stron z Pythonem

Chciałbym pobrać dzienne godziny wschodu / zachodu Słońca ze strony internetowej. Czy możliwe jest zeskrobywanie treści internetowych za pomocą Pythona? jakie są używane moduły? Czy jest dostępny jakiś tutorial?

Author: ST4, 2010-01-17

12 answers

Użyj urllib2 w połączeniu z biblioteką brilliant BeautifulSoup :

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
 181
Author: lesmana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-22 08:51:37

Naprawdę polecam Scrapy.

Cytat z usuniętej odpowiedzi:

  • Scrapy crawling jest najszybszy niż mechanize, ponieważ używa operacji asynchronicznych (na wierzchu Twisted).
  • Scrapy ma lepsze i najszybsze wsparcie dla parsowania (x)html na libxml2.
  • Scrapy jest dojrzałym frameworkiem z pełnym unicode, obsługuje przekierowania, odpowiedzi gzipped, dziwne kodowania, zintegrowaną pamięć podręczną http, itp.
  • Gdy już będziesz Scrapował, możesz napisać pająka w mniej niż 5 minut, które pobierają obrazy, tworzą miniatury i eksportują wyodrębnione dane bezpośrednio do pliku csv lub json.
 59
Author: Sjaak Trekhaak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-20 13:59:00

Zebrałem skrypty z mojej pracy skrobania sieci do tej bit-bucket biblioteki.

Przykładowy skrypt dla Twojego przypadku:

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])

Wyjście:

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
 16
Author: hoju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 17:37:25

Zdecydowanie sugerowałbym sprawdzenie pyquery . Używa składni podobnej do jQuery (aka podobnej do css), która sprawia, że rzeczy są naprawdę łatwe dla tych, którzy pochodzą z tego tła.

W Twoim przypadku byłoby to coś w stylu:

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

Wyjście:

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
 10
Author: scottmrogowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 09:20:58

Możesz użyć urllib2 do wykonania żądań HTTP, a następnie będziesz mieć zawartość www.

Możesz to zrobić tak:

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

Beautiful Soup jest pythonowym PARSEREM HTML, który powinien być dobry do skrobania ekranu.

W szczególności, tutaj jest ich samouczek na temat parsowania dokumentu HTML.

Powodzenia!
 7
Author: danben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 22:39:47

Używam kombinacji Scrapemark (znajdowanie adresów URL - py2) i httlib2 (pobieranie obrazów - py2+3). Na scrapemark.py ma 500 linii kodu, ale używa wyrażeń regularnych, więc może nie być tak szybko, nie testować.

Przykład scrapowania Twojej strony:

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] ))

Użycie:

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

Wynik:

[{'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'}]
 4
Author: Nils,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 09:20:33

Właśnie widziałem RoboBrowser w Pycoder ' s Weekly.

Biblioteka do scrapowania stron internetowych zbudowana na Requests i BeautifulSoup. Jak Mechanize, ale z testami, dokumentami i interfejsem Pythonicznym.

 2
Author: opyate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-18 15:29:23

Scrapy open source framework pomoże w scrapie www w Pythonie.Ten otwarty i oparty na współpracy framework do wydobywania potrzebnych danych ze stron internetowych.

Skrobanie stron internetowych jest ściśle związane z indeksowaniem stron internetowych, które indeksuje informacje w Internecie za pomocą bota lub robota sieciowego i jest uniwersalną techniką przyjętą przez większość wyszukiwarek.

Więcej O Web Scraping

 2
Author: GowriShankar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-19 05:16:04

Ułatw sobie życie używając CSS Selectors

Wiem, że spóźniłem się na imprezę, ale mam dla Ciebie miłą propozycję.

Użycie BeautifulSoup jest już sugerowane wolałbym użyć CSS Selectors do zeskrobywania danych wewnątrz HTML

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
Author: Umair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-08 13:52:29

Oto prosty web crawler, użyłem BeautifulSoup i będziemy szukać wszystkich linków (anchorów) ,która nazwa klasy to _3NFO0d. użyłem Flipkar.com, jest to sklep internetowy.

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
Author: Atul Chavan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-21 15:01:19

Jeśli myślimy o pobraniu nazwy elementów z konkretnej kategorii, możemy to zrobić, podając nazwę klasy tej kategorii za pomocą selektora css:

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)

Oto częściowe wyniki wyszukiwania:

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
Author: SIM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-19 16:37:07

Nowsza odpowiedź na to pytanie. lxml pojawił się jako preferowany sposób skrobania stron internetowych w Pythonie. Nie ma zależności od skręconych w przeciwieństwie do Scrappy. Również zatwierdzony przez Hitchhiker ' s guide to Python.

 0
Author: Harry Moreno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 21:30:58