Соскоб в сети с Python [закрыто]


183

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


3
В Python есть несколько вариантов очистки веб-страниц. Я перечислил некоторые варианты здесь в ответ на аналогичный вопрос.
филиппо

Почему бы просто не использовать встроенный анализатор HTML в стандартной библиотеке Python? Конечно, для задачи, такой простой и нечастой (всего один раз в день), я не вижу особых причин искать какие-либо другие инструменты. docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare

Надеюсь, что этот пост может быть полезным для кого-то по этому поводу. Хороший учебник для начинающих. samranga.blogspot.com/2015/08/web-scraping-beginner-python.html Он использует красивую библиотеку Python супа для очистки веб-страниц с Python.
Самита Чатуранга

Ответы:


187

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

7
Небольшой комментарий: это можно немного упростить, используя пакет запросов, заменив строку 6 на: sou = BeautifulSoup (запросы.get (' example.com'). Text )
D Coetzee

4
Спасибо за чаевые. пакет запросов еще не существовал, когда я написал фрагмент выше ;-)

1
@DerrickCoetzee - ваше упрощение вызывает ошибку MissingSchema (по крайней мере, при моей установке). Это работает:soup = BeautifulSoup(requests.get('http://example.com').text)
kmote

@kmote: это было то, что я напечатал, но я забыл backticksвокруг кода, и он превратил его в ссылку. Спасибо!
D Coetzee

Как вы уверены, что контент будет в тд и тр. Это может быть в ul и li также верно?
Шашанк Хегде

62

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

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

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

13
Я не заметил, что этому вопросу уже 2 года, но все же чувствую, что Scrapy следует назвать здесь на тот случай, если у кого-то еще возникнет тот же вопрос.
Сяак Трехаак

4
Scrapy - это основа, и поэтому она ужасна и думает, что она важнее вашего проекта. Это фреймворк из-за ужасных (ненужных) ограничений Twisted.
user1244215

4
@ user1244215: Это фреймворк, потому что фреймворки хороши. Если вы не хотите использовать его в качестве фреймворка, ничто не помешает объединить весь ваш код в один файл.
Блендер

1
Но он не поддерживает Python 3.x.

17

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

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

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

Я бы настоятельно рекомендовал проверить 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

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

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

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

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

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

Удачи!


Это может быть идея установить максимум на количество прочитанных байтов. response.read (100000000) или что-то подобное, чтобы эти URL для ISO не заполняли вашу оперативную память. Счастливого майнинга.
Эндрю Пэйт

4

Я использую комбинацию 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'}]

1

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

1

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

0

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

0

У 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.