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?
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
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.
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
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
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!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'}]
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.
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.
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
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
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()
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
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.
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