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

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

Ответ 1

Используйте 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

Ответ 2

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

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

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

Ответ 3

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

Пример сценария для вашего случая:

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

Ответ 4

Я бы настоятельно рекомендовал проверить pyquery. Он использует jquery-подобный (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

Ответ 5

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

Вы можете сделать это следующим образом:

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

Beautiful Soup - это парсер HTML на основе python, который, как предполагается, хорош для очистки экрана.

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

Удачи!

Ответ 6

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

Ответ 7

Я только что увидел RoboBrowser в Pycoder Weekly.

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

Ответ 8

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

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

Подробнее о веб-скребке

Ответ 9

Сделайте свою жизнь проще, используя 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 

Ответ 10

Вот простой веб-искатель, я использовал 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()

Ответ 11

Если мы думаем получить имя элементов из какой-либо определенной категории, тогда мы можем это сделать, указав имя класса этой категории с помощью селектора 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 Shoes
Shirts, T-Shirts...Under ₹599For Men
Nike, UCB, Adidas & moreUnder ₹999Men Sandals, Slippers
Philips & moreStarting ₹99LED Bulbs & Emergency Lights

Ответ 12

У Python есть хорошие возможности для очистки сети. Лучший из них с каркасом - это скрап. Это может быть немного сложнее для начинающих, так что здесь немного помочь.
1. Установите Python выше 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 напрямую. Вы можете получить ссылку на API, а затем проанализировать JSON, чтобы получить необходимую информацию, или попробовать selenium.