Соскоб с помощью Python - PullRequest
       57

Соскоб с помощью Python

177 голосов
/ 17 января 2010

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

Ответы [ 13 ]

185 голосов
/ 17 января 2010

Используйте 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
59 голосов
/ 22 декабря 2011

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

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

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

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

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

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 голосов
/ 21 мая 2013

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

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

Вы можете получить это так:

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

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

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

Удачи!

4 голосов
/ 01 декабря 2012

Я использую комбинацию Scrapemark (поиск URL - 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'}]
2 голосов
/ 19 ноября 2014

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

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

Подробнее об очистке веб-страниц

2 голосов
/ 18 февраля 2014

Я только что видел RoboBrowser в Еженедельник Пикодера .

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

1 голос
/ 08 февраля 2015

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

В Python есть хорошие возможности для очистки сети.Лучший из них с каркасом - scrapy .Это может быть немного сложнее для начинающих, так что здесь немного помочь.
1. Установите Python выше 3.5 (будут работать нижние до 2.7).
2. Создайте среду в conda (я сделал это).
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.

...