Веб-скребок с Python



Я хотел бы захватить ежедневно восход / закат раз с веб-сайта. Можно ли очистить веб-контент с помощью Python? какие модули используются? Есть ли учебник?

306   12  

12 ответов:

использовать urllib2 в сочетании с блестящим 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

Я бы очень рекомендовал Scrapy.

цитата из удаленного ответа:

  • Scrapy ползать быстрее, чем механизировать, потому что использует асинхронные операции (поверх скрученных).
  • Scrapy имеет лучшую и самую быструю поддержку для разбора (x)html поверх libxml2.
  • Scrapy-это зрелый фреймворк с полным юникодом, обрабатывает перенаправления, gzipped ответы, нечетные кодировки, интегрированный http-кэш и т. д.
  • как только вы находитесь в Scrapy вы можете написать паука менее чем за 5 минут, который загружает изображения, создает эскизы и экспортирует извлеченные данные непосредственно в csv или json.

Я собрал вместе скрипты из моей веб-Скребковой работы в это бит-ведро библиотека.

пример скрипта для вашего случая:

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

я настоятельно рекомендую проверить pyquery. Он использует jQuery-подобный (он же css-подобный) синтаксис, который делает вещи очень легкими для тех, кто исходит из этого фона.

для вашего случая, это было бы что-то вроде:

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

можно использовать urllib2 чтобы сделать HTTP-запросы, а затем у вас будет веб-контент.

вы можете получить его так:

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

Красивый Суп это python HTML парсер, который должен быть хорош для очистки экрана.

в частности, здесь это их учебник по разбору HTML-документа.

удачи!

Я использую комбинацию Scrapemark (поиск URL-адресов-py2) и httlib2 (загрузка изображений-py2+3). The scrapemark.py имеет 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'}]

Я только что видел RoboBrowser на страницы pycoder'еженедельно.

библиотека для веб-выскабливания, построенная на запросах и BeautifulSoup. Как механизировать, но с тестами, документами и обновления интерфейса.

Scrapy open source framework поможет веб-лом в python.Это открытый исходный код и совместная платформа для извлечения необходимых данных с веб-сайтов.

веб-выскабливание тесно связано с веб-индексированием, которое индексирует информацию в интернете с помощью бота или веб-искателя и является универсальным методом, принятым большинством поисковых систем.

Подробнее О Веб-Выскабливание

сделать вашу жизнь проще с помощью CSS Selectors

Я знаю, что опоздал на вечеринку, но у меня есть хорошее предложение для вас.

используя BeautifulSoup уже было предложено, я бы предпочел использовать CSS Selectors чтобы очистить данные внутри 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 

вот простой веб-искатель, я использовал BeautifulSoup, и мы будем искать все ссылки (якоря) ,чье имя класса _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()

Если мы думаем о получении имени элементов из любой конкретной категории, то мы можем сделать это, указав имя класса этой категории с помощью селектора 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)

это частичные результаты поиска:

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

новый ответ на этот вопрос. lxml появился в качестве предпочтительного способа сделать веб-скребок в Python. Не имеет никакой зависимости от Twisted в отличие от scrapy. Также одобрен Автостопом по Python.

Comments

    Ничего не найдено.