Устранение проблем с отзывчивым Bootstrap столом - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь очистить таблицу от https://www.pepperscale.com/hot-pepper-list/, которая оказывается проблемой. Когда я звоню на сайт через requests или urllib, я получаю только первые 10 результатов таблицы, хотя по умолчанию я обычно вижу все строки.

Проблема в том, что это таблица bootstrap, страницы не отображаются в URL. Кто-нибудь смог взломать эти таблицы? Мои коды приведены ниже:

Использование URLLib:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
reg_url = "https://www.pepperscale.com/hot-pepper-list/"
req = Request(url=reg_url, headers=headers) 
html = urlopen(req).read()

pepscrap = pd.read_html(html)
print(pepscrap[0])

Использование BS4 (не финишировал sh, потому что я видел только 10 строк)

page = requests.get("https://www.pepperscale.com/hot-pepper-list/", verify=False)
soup = BeautifulSoup(page.content, 'html.parser')
print(soup.find(id='table_1'))

1 Ответ

1 голос
/ 20 февраля 2020

Вам, вероятно, лучше просто поговорить с тем же API, который в первую очередь заполняет таблицу bootstrap. Я использовал сетевой регистратор Google Chrome для просмотра только тех ресурсов XHR (XmlHttpRequest), к которым мой браузер отправлял запросы. Изучив содержимое отфильтрованных ресурсов, я определил, что браузер отправляет запрос к их API, используя этот URL: https://www.pepperscale.com/wp-admin/admin-ajax.php?action=get_wdtable&table_id=5

. По какой-либо причине вам нужно сделать POST-скорее чем GET-запрос - каждый API отличается от других. На вкладке «Заголовок и тело запроса» вы можете увидеть параметры формы, которые ожидает API - они кажутся важными. Я не пытался выяснить, какие из них являются критическими, а какие нет, поэтому я просто сконструировал свой POST-запрос с теми же параметрами формы, которые отправил мой браузер.

Это дает хороший JSON ответ, который тривиален для анализа:

import requests

url = "https://www.pepperscale.com/wp-admin/admin-ajax.php?action=get_wdtable&table_id=5"

data = {
    "draw": "1",
    "columns[0][data]": "0",
    "columns[0][name]": "wdt_ID",
    "columns[0][searchable]": "true",
    "columns[0][orderable]": "true",
    "columns[0][search][value]": "",
    "columns[0][search][regex]": "false",
    "columns[1][data]": "1",
    "columns[1][name]": "heat",
    "columns[1][searchable]": "true",
    "columns[1][orderable]": "true",
    "columns[1][search][value]": "",
    "columns[1][search][regex]": "false",
    "columns[2][data]": "2",
    "columns[2][name]": "image",
    "columns[2][searchable]": "true",
    "columns[2][orderable]": "false",
    "columns[2][search][value]": "",
    "columns[2][search][regex]": "false",
    "columns[3][data]": "3",
    "columns[3][name]": "hotpepper",
    "columns[3][searchable]": "true",
    "columns[3][orderable]": "true",
    "columns[3][search][value]": "",
    "columns[3][search][regex]": "false",
    "columns[4][data]": "4",
    "columns[4][name]": "minshu",
    "columns[4][searchable]": "true",
    "columns[4][orderable]": "true",
    "columns[4][search][value]": "",
    "columns[4][search][regex]": "false",
    "columns[5][data]": "5",
    "columns[5][name]": "maxshu",
    "columns[5][searchable]": "true",
    "columns[5][orderable]": "false",
    "columns[5][search][value]": "",
    "columns[5][search][regex]": "false",
    "columns[6][data]": "6",
    "columns[6][name]": "formula_1",
    "columns[6][searchable]": "false",
    "columns[6][orderable]": "false",
    "columns[6][search][value]": "",
    "columns[6][search][regex]": "false",
    "columns[7][data]": "7",
    "columns[7][name]": "formula_2",
    "columns[7][searchable]": "false",
    "columns[7][orderable]": "false",
    "columns[7][search][value]": "",
    "columns[7][search][regex]": "false",
    "columns[8][data]": "8",
    "columns[8][name]": "jalrp",
    "columns[8][searchable]": "true",
    "columns[8][orderable]": "false",
    "columns[8][search][value]": "",
    "columns[8][search][regex]": "false",
    "columns[9][data]": "9",
    "columns[9][name]": "type",
    "columns[9][searchable]": "true",
    "columns[9][orderable]": "true",
    "columns[9][search][value]": "",
    "columns[9][search][regex]": "false",
    "columns[10][data]": "10",
    "columns[10][name]": "origin",
    "columns[10][searchable]": "true",
    "columns[10][orderable]": "false",
    "columns[10][search][value]": "",
    "columns[10][search][regex]": "false",
    "columns[11][data]": "11",
    "columns[11][name]": "use",
    "columns[11][searchable]": "true",
    "columns[11][orderable]": "false",
    "columns[11][search][value]": "",
    "columns[11][search][regex]": "false",
    "columns[12][data]": "12",
    "columns[12][name]": "flavor",
    "columns[12][searchable]": "true",
    "columns[12][orderable]": "false",
    "columns[12][search][value]": "",
    "columns[12][search][regex]": "false",
    "order[0][column]": "5",
    "order[0][dir]": "asc",
    "start": "0",
    "length": "-1",
    "search[value]": "",
    "search[regex]": "false",
    "wdtNonce": "2f82d8936d"
}

response = requests.post(url, data=data)
response.raise_for_status()

peppers = response.json()["data"]

# print out the first pepper information
print(peppers[0])

Вывод:

['1', 'Mild', "<a href='https://www.pepperscale.com/wp-content/uploads/2015/04/Tasty-Colorbell-Pepper-4-Plants-GreenYellowPurpleRed-0.jpg' target='_blank' rel='lightbox[-1]'><img src='https://www.pepperscale.com/wp-content/uploads/2015/04/Tasty-Colorbell-Pepper-4-Plants-GreenYellowPurpleRed-0-75x75.jpg' /></a>", "<a data-content='Bell Pepper' href='https://www.pepperscale.com/bell-pepper' target='_blank'>Bell Pepper</a>", '0', '0', '0', '0.00', '-8,000 to -2,500', 'annuum', 'Mexico', 'Culinary', 'Bright, Sweet']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...