2016-12-07 2 views
0

Я пытаюсь очистить некоторые строки данных игрока (tr) от URL-адреса, однако ничего не происходит, когда я запускаю свой код. Я уверен, что мой код в порядке, потому что он работает с другими статистическими веб-сайтами, содержащими таблицы. Может ли кто-нибудь сказать мне, почему ничего не происходит? Заранее спасибо.Python BeautifulSoup не соскабливает этот url

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 

def make_soup(url): 
thepage = urllib.request.urlopen(url) 
soupdata = BeautifulSoup(thepage, "html.parser") 
return soupdata 

soup = make_soup("https://www.whoscored.com/Regions/252/Tournaments/7/Seasons/6365/Stages/13832/PlayerStatistics/England-Championship-2016-2017") 
for record in soup.findAll('tr'): 
    print(record.text) 

ответ

0

это использование страницы Javascript для извлечения данных, вы можете найти исходные данные в этой ссылке:

https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=summary&subcategory=all&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=13832&tournamentOptions=7&sortBy=Rating&sortAscending=&age=&ageComparisonType=&appearances=&appearancesComparisonType=&field=Overall&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=&isMinApp=true&page=&includeZeroValues=&numberOfPlayersToPick=10 

каждое поле URL-адрес может быть изменен, чтобы извлечь нужные вам данные.

0

Это происходит потому, что веб-сайт не хочет, чтобы вы его очистили.

Incapsula Protection

Я использовал selenium отправить запрос и представил смоделированный браузер он создал

Это используя Incapsula, который является служба безопасности (у них даже есть некоторые information о выскабливание над их веб-сайт) -открыть, его интересные -

  • This может быть полезным
1

Короткий ответ: данные игрока, которого вы ищете НЕ в этом URL.

Тогда вы можете задать вопрос почему? Я видел их на этой странице, почему их там нет?

Так что я попытаюсь объяснить , что происходит, когда вы просматриваете этот URL-адрес с помощью современного браузера, такого как Chrome.

Вы: Введите URL-адрес и нажмите enter.

Хром: Gotcha. Я получу эту страницу для вас как можно скорее, всего за секунду. (получение контента из этого URL-адреса), отлично, теперь у меня это есть! Но подождите, позвольте мне прочитайте/проанализируйте его сначала, прежде чем я покажу его вам (прочитав, что находится внутри контента), о, дерьмо, этот javascript подсказывает мне получить дополнительную информацию с другого URL-адреса, я сделаю это; oh wait here еще один один, чтобы сказать мне, чтобы загрузить объявления в заголовке, ну мне это не нравится Я просто собираюсь сделать то, что мне говорят; всего лишь секунда, эти css сообщают мне имена игроков с отображением жирным шрифтом, хорошо не плохо; о, вот еще одна фотография от url xxx Мне нужно загрузить, никаких проблем ... ох, сколько вещей для меня? Я не доволен этим веб-сайтом ... (работая над букетом других вещей ...) Наконец все готово! Теперь проверьте это!

Вы: Проигрыватель xxx на самом деле неплохой, я проверю его. (Нажмите игрок ххй)

Chrome:: ......

Как вы можете видеть каждый раз, когда вы просматриваете веб-страницу, браузер делает много «за сценой» вещей для отображения его для пользователей. Поэтому в основном: URL вошли >> содержимое из URL-адреса извлеченной >> содержания проанализированного >> дополнительный контент сгружен >> все вещи визуализации >> страница отображается (один или несколько шагов может быть сделано одновременно)

И с кодами, это только «контент из URL-адреса», также те статистические данные, которые вы хотите, являются «дополнительным контентом», который необходимо загрузить из другого места, поэтому у вас ничего нет.

Как мне получить такую ​​статистику? Как только вы узнаете URL-адреса, ответственные за загрузку этих характеристик, просто идите за ними. Как узнать эти URL? Ну, вы всегда можете прочитать javascripts ... если вы достаточно терпеливы ...

Самый простой способ получить то, что вы хотите, - это проанализировать трафик, пока эта страница загружается, и узнать все те, что находятся за кулисами трафика. Я бы порекомендовал fiddler, но вы можете использовать любые инструменты, которые вам подходят.

Теперь давайте посмотрим, что происходит, когда вы загрузите эту страницу: traffic analytics

Там на самом деле сотни запросов, сделанных полностью вынести эту страницу вы посещаете, и все, что вам нужно сделать, это выяснить, какой из каналов «фактическая» или «настоящая» статистика. Есть ли этот url даже с «StatisticsFeed» в нем, может ли он быть одним? Давайте посмотрим:

https://www.whoscored.com/StatisticsFeed/1/GetPlayerStatistics?category=summary&subcategory=all&statsAccumulationType=0&isCurrent=true&playerId=&teamIds=&matchId=&stageId=13832&tournamentOptions=7&sortBy=Rating&sortAscending=&age=&ageComparisonType=&appearances=&appearancesComparisonType=&field=Overall&nationality=&positionOptions=&timeOfTheGameEnd=&timeOfTheGameStart=&isMinApp=true&page=&includeZeroValues=&numberOfPlayersToPick=10

{ 
    "playerTableStats": [{ 
     "name": "Conor Hourihane", 
     "firstName": "Conor", 
     "lastName": "Hourihane", 
     "playerId": 134172, 
     "height": 181, 
     "weight": 62, 
     "age": 25, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-MC-", 
     "positionText": "Midfielder", 
     "playedPositionsShort": "M(C)", 
     "teamId": 142, 
     "teamName": "Barnsley", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "ie", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.8705882352941181, 
     "ranking": 1, 
     "apps": 17, 
     "subOn": 0, 
     "minsPlayed": 1530, 
     "manOfTheMatch": 4, 
     "yellowCard": 5.0, 
     "redCard": 0.0, 
     "goal": 3, 
     "assistTotal": 8, 
     "shotsPerGame": 2.2352941176470589, 
     "aerialWonPerGame": 0.6470588235294118, 
     "passSuccess": 81.370449678800867 
    }, 
    { 
     "name": "Anthony Knockaert", 
     "firstName": "Anthony", 
     "lastName": "Knockaert", 
     "playerId": 86794, 
     "height": 172, 
     "weight": 69, 
     "age": 25, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-AML-AMR-", 
     "positionText": "Midfielder", 
     "playedPositionsShort": "AM(LR)", 
     "teamId": 211, 
     "teamName": "Brighton", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "fr", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.6722222222222216, 
     "ranking": 2, 
     "apps": 18, 
     "subOn": 1, 
     "minsPlayed": 1471, 
     "manOfTheMatch": 5, 
     "yellowCard": 4.0, 
     "redCard": 0.0, 
     "goal": 6, 
     "assistTotal": 0, 
     "shotsPerGame": 2.3888888888888888, 
     "aerialWonPerGame": 0.22222222222222221, 
     "passSuccess": 83.420593368237348 
    }, 
    { 
     "name": "Lewis Dunk", 
     "firstName": "Lewis", 
     "lastName": "Dunk", 
     "playerId": 86441, 
     "height": 192, 
     "weight": 88, 
     "age": 25, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-DC-", 
     "positionText": "Defender", 
     "playedPositionsShort": "D(C)", 
     "teamId": 211, 
     "teamName": "Brighton", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "gb-eng", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.660000000000001, 
     "ranking": 3, 
     "apps": 18, 
     "subOn": 0, 
     "minsPlayed": 1620, 
     "manOfTheMatch": 3, 
     "yellowCard": 8.0, 
     "redCard": 0.0, 
     "goal": 1, 
     "assistTotal": 1, 
     "shotsPerGame": 0.61111111111111116, 
     "aerialWonPerGame": 3.5, 
     "passSuccess": 79.72251867662753 
    }, 
    { 
     "name": "Tom Clarke", 
     "firstName": "Tom", 
     "lastName": "Clarke", 
     "playerId": 133974, 
     "height": 180, 
     "weight": 77, 
     "age": 28, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-DC-", 
     "positionText": "Defender", 
     "playedPositionsShort": "D(C)", 
     "teamId": 181, 
     "teamName": "Preston", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "gb-eng", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.6126315789473677, 
     "ranking": 4, 
     "apps": 19, 
     "subOn": 0, 
     "minsPlayed": 1692, 
     "manOfTheMatch": 4, 
     "yellowCard": 0.0, 
     "redCard": 0.0, 
     "goal": 2, 
     "assistTotal": 0, 
     "shotsPerGame": 0.89473684210526316, 
     "aerialWonPerGame": 5.4736842105263159, 
     "passSuccess": 66.666666666666657 
    }, 
    { 
     "name": "Pontus Jansson", 
     "firstName": "Pontus", 
     "lastName": "Jansson", 
     "playerId": 121123, 
     "height": 194, 
     "weight": 89, 
     "age": 25, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-DC-", 
     "positionText": "Defender", 
     "playedPositionsShort": "D(C)", 
     "teamId": 19, 
     "teamName": "Leeds", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "se", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.5976923076923066, 
     "ranking": 5, 
     "apps": 13, 
     "subOn": 0, 
     "minsPlayed": 1126, 
     "manOfTheMatch": 1, 
     "yellowCard": 6.0, 
     "redCard": 0.0, 
     "goal": 1, 
     "assistTotal": 0, 
     "shotsPerGame": 0.53846153846153844, 
     "aerialWonPerGame": 3.5384615384615383, 
     "passSuccess": 86.336633663366342 
    }, 
    { 
     "name": "Angus MacDonald", 
     "firstName": "Angus", 
     "lastName": "MacDonald", 
     "playerId": 110825, 
     "height": 184, 
     "weight": 70, 
     "age": 24, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-DC-", 
     "positionText": "Defender", 
     "playedPositionsShort": "D(C)", 
     "teamId": 142, 
     "teamName": "Barnsley", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "gb-eng", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.5066666666666677, 
     "ranking": 6, 
     "apps": 12, 
     "subOn": 0, 
     "minsPlayed": 1080, 
     "manOfTheMatch": 0, 
     "yellowCard": 3.0, 
     "redCard": 0.0, 
     "goal": 0, 
     "assistTotal": 0, 
     "shotsPerGame": 0.33333333333333331, 
     "aerialWonPerGame": 4.833333333333333, 
     "passSuccess": 72.147651006711413 
    }, 
    { 
     "name": "Marc Roberts", 
     "firstName": "Marc", 
     "lastName": "Roberts", 
     "playerId": 138949, 
     "height": 183, 
     "weight": 81, 
     "age": 26, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-DC-", 
     "positionText": "Defender", 
     "playedPositionsShort": "D(C)", 
     "teamId": 142, 
     "teamName": "Barnsley", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "gb-eng", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.503125, 
     "ranking": 7, 
     "apps": 16, 
     "subOn": 0, 
     "minsPlayed": 1440, 
     "manOfTheMatch": 1, 
     "yellowCard": 3.0, 
     "redCard": 0.0, 
     "goal": 2, 
     "assistTotal": 2, 
     "shotsPerGame": 0.625, 
     "aerialWonPerGame": 7.0625, 
     "passSuccess": 61.595547309833023 
    }, 
    { 
     "name": "Bradley Johnson", 
     "firstName": "Bradley", 
     "lastName": "Johnson", 
     "playerId": 12490, 
     "height": 178, 
     "weight": 68, 
     "age": 29, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-MC-ML-", 
     "positionText": "Midfielder", 
     "playedPositionsShort": "M(CL)", 
     "teamId": 20, 
     "teamName": "Derby", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "gb-eng", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.4954545454545443, 
     "ranking": 8, 
     "apps": 11, 
     "subOn": 0, 
     "minsPlayed": 952, 
     "manOfTheMatch": 1, 
     "yellowCard": 4.0, 
     "redCard": 0.0, 
     "goal": 2, 
     "assistTotal": 1, 
     "shotsPerGame": 1.3636363636363635, 
     "aerialWonPerGame": 4.0909090909090908, 
     "passSuccess": 71.908127208480565 
    }, 
    { 
     "name": "Christophe Berra", 
     "firstName": "Christophe", 
     "lastName": "Berra", 
     "playerId": 8287, 
     "height": 186, 
     "weight": 81, 
     "age": 31, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-DC-", 
     "positionText": "Defender", 
     "playedPositionsShort": "D(C)", 
     "teamId": 165, 
     "teamName": "Ipswich", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "gb-sct", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.4789473684210526, 
     "ranking": 9, 
     "apps": 19, 
     "subOn": 0, 
     "minsPlayed": 1710, 
     "manOfTheMatch": 3, 
     "yellowCard": 4.0, 
     "redCard": 0.0, 
     "goal": 0, 
     "assistTotal": 1, 
     "shotsPerGame": 0.94736842105263153, 
     "aerialWonPerGame": 6.2105263157894735, 
     "passSuccess": 58.636363636363633 
    }, 
    { 
     "name": "Adam Webster", 
     "firstName": "Adam", 
     "lastName": "Webster", 
     "playerId": 109922, 
     "height": 191, 
     "weight": 0, 
     "age": 21, 
     "isManOfTheMatch": false, 
     "isActive": true, 
     "isOpta": true, 
     "playedPositions": "-DC-", 
     "positionText": "Defender", 
     "playedPositionsShort": "D(C)", 
     "teamId": 165, 
     "teamName": "Ipswich", 
     "seasonId": 6365, 
     "seasonName": "2016/2017", 
     "tournamentId": 7, 
     "tournamentRegionId": 252, 
     "tournamentRegionCode": "gb-eng", 
     "regionCode": "gb-eng", 
     "tournamentName": "Championship", 
     "tournamentShortName": "EC", 
     "rating": 7.4780000000000006, 
     "ranking": 10, 
     "apps": 15, 
     "subOn": 1, 
     "minsPlayed": 1227, 
     "manOfTheMatch": 2, 
     "yellowCard": 1.0, 
     "redCard": 0.0, 
     "goal": 0, 
     "assistTotal": 0, 
     "shotsPerGame": 0.2, 
     "aerialWonPerGame": 5.0666666666666664, 
     "passSuccess": 58.256029684601117 
    }], 
    "paging": { 
     "currentPage": 1, 
     "totalPages": 34, 
     "resultsPerPage": 10, 
     "totalResults": 338, 
     "firstRecordIndex": 1, 
     "lastRecordIndex": 10 
    }, 
    "statColumns": ["apps", 
    "subOn", 
    "minsPlayed", 
    "goal", 
    "assistTotal", 
    "yellowCard", 
    "redCard", 
    "shotsPerGame", 
    "passSuccess", 
    "aerialWonPerGame", 
    "manOfTheMatch"] 
} 

Точно! Ну что теперь? Смоделировать этот запрос и анализировать содержимое, так как это JSON отформатированным уже встроенный модуль json бы сделать работу легко, вы не должны даже использовать BeautifulSoup

Вы можете спросить, почему я не получил ничего, когда я просмотреть эту ссылку напрямую? Это потому, что они устанавливают лимит на своем сервере, так что только запросы с действующими заголовками получат фиды. Итак, как мне обойти это? Имитировать «живо» с правильными параметрами (в основном заголовками), чтобы они вам поверили.

Смежные вопросы