Bagaimana cara web mengikis lineup awal untuk NBA?

Saya baru mengenal web scraping dan memerlukan bantuan. Saya ingin mengikis lineup awal NBA, tim dan posisi pemain menggunakan Xpath. Saya hanya memulai nama karena saya mengalami masalah.

Ini kode saya sejauh ini:

from urllib.request import urlopen
from lxml.html import fromstring 


url = "https://www.lineups.com/nba/lineups"

content = str(urlopen(url).read())
comment = content.replace("-->","").replace("<!--","")
tree = fromstring(comment)


for nba, bball_row in enumerate(tree.xpath('//tr[contains(@class,"t-content")]')):
    names = bball_row.xpath('.//span[@_ngcontent-c5="long-player-name"]/text()')[0]
    print(names)

Sepertinya program berjalan tanpa kesalahan tetapi namanya tidak tercetak. Setiap tip tentang cara mengurai menggunakan Xpath dengan lebih efisien akan sangat dihargai. Saya mencoba mengotak-atik pembantu Xpath dan Xpath Finder. Mungkin ada beberapa trik agar prosesnya lebih mudah. Terima kasih sebelumnya atas waktu dan usaha Anda!


person Able Archer    schedule 23.10.2018    source sumber
comment
Data yang ingin Anda kikis sedang dimasukkan melalui Javascript. Anda tidak dapat mengikisnya seperti yang Anda lakukan. Coba lihat Selenium.   -  person aris    schedule 23.10.2018
comment
Terima kasih @aris! Saya akan memeriksa Selenium dan akan memperbarui kode saya jika saya mengetahuinya.   -  person Able Archer    schedule 23.10.2018


Jawaban (1)


Konten yang diperlukan terletak di dalam script node seperti itu

<script nonce="STATE_TRANSFER_TOKEN">window['TRANSFER_STATE'] = {...}</script>

Anda dapat mencoba melakukan hal berikut untuk mengekstrak data sebagai kamus Python sederhana:

import re
import json
import requests

source = requests.get("https://www.lineups.com/nba/lineups").text
dictionary = json.loads(re.search(r"window\['TRANSFER_STATE'\]\s=\s(\{.*\})<\/script>", source).group(1))

Opsional: Tempel keluaran dictionary di sini dan klik "Percantik" untuk melihat data sebagai JSON yang dapat dibaca

Kemudian Anda dapat mengakses nilai yang diperlukan dengan kunci, mis.

for player in dictionary['https://api.lineups.com/nba/fetch/lineups/gateway']['data'][0]['home_players']:
    print(player['name'])

Kyrie Irving
Jaylen Brown
Jayson Tatum
Gordon Hayward
Al Horford

for player in dictionary['https://api.lineups.com/nba/fetch/lineups/gateway']['data'][0]['away_players']:
    print(player['name'])

D.J. Augustin
Evan Fournier
Jonathan Isaac
Aaron Gordon
Nikola Vucevic

Perbarui

Saya kira saya hanya membuatnya terlalu rumit :)

Ini harus sesederhana di bawah ini:

import requests

source = requests.get("https://api.lineups.com/nba/fetch/lineups/gateway").json()
for player in source['data'][0]['away_players']:
        print(player['name'])

Pembaruan 2

Untuk mendapatkan semua susunan tim gunakan di bawah ini:

import requests

source = requests.get("https://api.lineups.com/nba/fetch/lineups/gateway").json()

for team in source['data']:
    print("\n%s players\n" % team['home_route'].capitalize())
    for player in team['home_players']:
        print(player['name'])
    print("\n%s players\n" % team['away_route'].capitalize())
    for player in team['away_players']:
        print(player['name'])
person Andersson    schedule 23.10.2018
comment
Bagus sekali. Bagaimana Anda mengetahui bahwa tautan ke hasil yang diinginkan mungkin ada dalam skrip @sir Andersson? Apakah ada trik yang perlu diketahui menggunakan alat dev? - person SIM; 23.10.2018
comment
@SIM , hal pertama yang harus dicoba adalah menyalin sebagian data yang diperlukan -› sumber halaman terbuka (klik kanan pada halaman-› Lihat sumber halaman) -› Ctrl + F -› Ctrl + V. Jika data tidak ada, maka kemungkinan besar berasal dari XHR. Namun dalam kasus ini data berada dalam node script dalam format JSON dan kunci pertama JSON adalah tautan ke API. Tidak ada keajaiban :) - person Andersson; 23.10.2018
comment
Ini berfungsi sempurna seperti yang diiklankan... Terima kasih banyak @Andersson atas bantuan Anda. Pekerjaan yang luar biasa! =) - person Able Archer; 23.10.2018
comment
Saya baru memperhatikan bahwa semua tim dan pemain tidak dicetak. Tadinya saya kira karena semua starternya belum masuk tapi starternya sudah diupdate sekarang. Saya melihat 7 tim tercetak dari kode diatas dan tim teratas belum mempunyai gelar. Ada saran @Andersson? Saya sangat berterima kasih atas bantuan anda pak. - person Able Archer; 23.10.2018
comment
@AbleArcher, hmm... Saya mendapat 6 tim sebagai starter untuk 3 pertandingan saat ini... Bisakah Anda menjelaskan apa sebenarnya yang salah dengan keluarannya karena saya tidak yakin keluaran apa yang ingin Anda dapatkan? Pastikan Anda menggunakan kode dari blok Pembaruan ke-2 - person Andersson; 23.10.2018
comment
Sebenarnya hanya ada 3 pertandingan hari ini... Mohon maaf. Outputnya benar seperti yang Anda nyatakan. Semua pemain dan tim awal dicetak. Namun, sepertinya pemain 76er dicetak dua kali. Saya melihat Markelle Fultz dicetak sekali di atas dan sekali di bawah 76ers. Selain itu, itu sempurna. Saya sangat menghargai bantuan Anda @Andersson! Terima kasih banyak atas pengalaman belajarnya. =) - person Able Archer; 24.10.2018
comment
Sebenarnya kode ini berfungsi dengan sempurna berkat @Andersson. Saya yakin saya menambahkan baris kode tambahan. Sekali lagi terima kasih kepada semua orang yang membantu! - person Able Archer; 24.10.2018
comment
Pembaruan 2 berfungsi dengan baik. Masalah yang saya alami adalah menambahkan pembaruan 1 dan pembaruan 2 secara bersamaan. Kode inilah yang saya cari. - person Able Archer; 24.10.2018
comment
Sekali lagi terima kasih @Andersson! Apakah Anda dapat membantu saya mengubah kode ini menjadi kerangka data pandas? Saya ingin sekali bisa mengimpor data ini ke excel. - person Able Archer; 29.10.2018
comment
@AbleArcher Maaf, saya tidak punya banyak pengalaman dengan Pandas... Anda dapat mengirimkan tiket baru mengenai masalah ini dan menambahkan tag pandas. Saya yakin guru Pandas akan membantu Anda :) - person Andersson; 29.10.2018
comment
Terima kasih Pak @Andersson atas waktunya. Itu sangat membantu. =) - person Able Archer; 29.10.2018
comment
Apakah saya bisa menghubungi Anda untuk pekerjaan di masa depan @Andersson? Info kontak saya ada di profil saya. - person Able Archer; 12.11.2018
comment
@AbleArcher, Jika Anda memiliki masalah pengkodean, Anda selalu dapat memposting pertanyaan baru di sini di SO. Saya akan memeriksanya ketika saya punya waktu. Juga masih banyak pengguna lain yang dapat membantu. Saat ini saya sedang mengerjakan sebuah Proyek jadi saya tidak yakin saya punya banyak waktu untuk membimbing - person Andersson; 12.11.2018