Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

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

#html #python #парсер #beautiful_soup


Не подскажете, как спарсить колонку 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ую?
    


Ответы

Ответ 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'])

Ответ 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("{0}
".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 цикл

Комментариев нет:

Отправить комментарий