Парсинг колонки таблицы

132
17 июля 2019, 02:10

Не подскажете, как спарсить колонку Bitcoinprice таблицы с сайта MYIP.MS? Спарсить всю страницу могу, а вот как конкретную колонку таблицы не понимаю.

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
site= "https://ru.myip.ms/browse/market_bitcoin/%D0%91%D0%B8%D1%82%D0%BA%D0%BE%D0%B8%D0%BD_%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%86%D0%B5%D0%BD.html#a"
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(site,headers=hdr)
page = urlopen(req)
soup = BeautifulSoup(page, "lxml")
print(soup)

UPD. Разобрался с таблицей, но как можно спарсить остальные страницы таблицы, а не только 1ую?

Answer 1

Это возможно сделать через BeautifulSoup, но гораздо проще будет сделать это через pandas и .read_html() метод, парся таблицу напрямую в DataFrame:

import pandas as pd
from urllib.request import Request, urlopen

site = "https://ru.myip.ms/browse/market_bitcoin/%D0%91%D0%B8%D1%82%D0%BA%D0%BE%D0%B8%D0%BD_%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%86%D0%B5%D0%BD.html#a"
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(site, headers=hdr)
page = urlopen(req)
df = pd.read_html(page.read(), attrs={"id": "market_bitcoin_tbl"})[0]
df = df.rename(columns=lambda x: x.strip()) # remove extra newlines from the column names
print(df['Bitcoin Price'])
Answer 2

Что касается Вашей второй проблемы, следовать пагинации мы можем эмулируя XHR POST запросы, попутно сохраняя данные в датафрейм. Что-то вроде вот такого:

from time import sleep
import pandas as pd
import requests

host = 'ru.myip.ms'
index_url = 'https://ru.myip.ms'
home_url = "https://ru.myip.ms/browse/market_bitcoin/%D0%91%D0%B8%D1%82%D0%BA%D0%BE%D0%B8%D0%BD_%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%86%D0%B5%D0%BD.html#a"
base_ajax_url = "https://ru.myip.ms/ajax_table/market_bitcoin/{page}"

with requests.Session() as session:
    session.headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
        'Host': host
    }
    # visit home page and parse the initial dataframe
    response = session.get(home_url)
    df = pd.read_html(response.text, attrs={"id": "market_bitcoin_tbl"})[0]
    df = df.rename(columns=lambda x: x.strip())  # remove extra newlines from the column names
    sleep(2)
    # start paginating with page=2
    page = 2
    while True:
        url = base_ajax_url.format(page=page)
        print("Processing {url}...".format(url=url))
        response = session.post(url,
                                data={'getpage': 'yes', 'lang': 'ru'},
                                headers={
                                    'X-Requested-With': 'XMLHttpRequest',
                                    'Origin': index_url,
                                    'Referer': home_url
                                })
        # add data to the existing dataframe
        try:
            new_df = pd.read_html("<table>{0}</table>".format(response.text))[0]
        except ValueError:  # could not extract data from HTML - last page?
            break
        new_df.columns = df.columns
        df = pd.concat([df, new_df])
        page += 1
        sleep(1)

print(df)

В пагинации на этой странице больше 4700 страниц, поэтому я не стал проверять все от начала до конца, но код работает для меня на нескольких страницах.

Обратите внимание на следующие вещи:

  • использую requests и requests.Session() для удобного менеджмента веб-скрейпинг сессии
  • подобавлял тут и там искусственные задержки между реквестами, см. How to be a good citizen when crawling web sites?
  • в качестве условия выхода из цикла мы используем факт того, что pandas не может распарсать данные, когда мы достигаем страницы без данных, а только с текстом ошибки - возможно есть получше способ выйти из цикла - например, можно заранее отпарсать кол-во страниц и использовать обычный for цикл
READ ALSO
Не ставится цвет на объект

Не ставится цвет на объект

Когда пишу вот такой код чтобы установить цвет устанавливается всегда белый

150
Парсинг модального окна

Парсинг модального окна

Появилась необходимость в парсинге данных в модальном окне: при клике на пункт меню открывается окно, затем в него подгружаются данные, адрес...

138
Обработчик shift и shift + del

Обработчик shift и shift + del

Стоит задача реализовать очистку listbox на нажатие Shift и очистку textbox на нажатие комбинации клавиш Shift + DelКак не писал обработчики всегда так...

161
Как загрузить готовое Android-приложение (файл .apk) в эмулируемую среду в Visual Studio, чтобы оно там было изначально?

Как загрузить готовое Android-приложение (файл .apk) в эмулируемую среду в Visual Studio, чтобы оно там было изначально?

Мне нужно создавать автоматизированные тесты для Android-приложения в Visual Studio при помощи XamarinUITest

158