recherche

Maison  >  Questions et réponses  >  le corps du texte

网页爬虫 - python如何爬取js生成的数据?

我想要爬取豆瓣音乐music.douban.com上的 新碟榜 和 近期热门歌单 ,看源代码好像都是js生成的,请教大家有什么办法可以爬到这些数据?谢谢!

高洛峰高洛峰2887 Il y a quelques jours474

répondre à tous(9)je répondrai

  • 高洛峰

    高洛峰2017-04-17 17:58:25

    J'utilise Jsoup pour écrire un robot d'exploration et je rencontre généralement du HTML qui ne renvoie aucun contenu. Mais le navigateur affiche du contenu. Ils analysent tous le journal des requêtes http de la page. Analysez le code JS de la page pour le résoudre.

    1. Certains éléments de la page sont masqués->Changez le sélecteur pour résoudre le problème
    2. Certaines données sont enregistrées dans les objets js/json->Interceptez la chaîne correspondante et analysez la solution
    3. Via l'interface API Appel-> Fausse demande pour obtenir des données

    Il existe également une méthode ultime
    4. Utilisez un navigateur sans tête comme phantomjs ou casperjs

    répondre
    0
  • 黄舟

    黄舟2017-04-17 17:58:25

    Certaines des réponses mentionnent qu'il est possible d'analyser l'interface et d'explorer l'interface directement. De plus, si vous explorez directement l'interface, vous n'avez pas besoin d'analyser le code HTML vous-même, car la plupart des interfaces renvoient du json. Je me sens heureux rien que d'y penser ~

    Cependant, il existe encore d'autres méthodes, comme l'utilisation de Phantomjs, qui est simple et facile à utiliser. Python n'est pas omnipotent, et il aura plus de valeur lorsqu'il sera associé à d'autres outils. J'ai aussi quelques petits projets qui le sont. une telle combinaison.

    Il s'agit d'un exemple de code officiel, qui peut être réalisé avec une petite modification.

    console.log('Loading a web page');
    var page = require('webpage').create();
    var url = 'http://phantomjs.org/';
    page.open(url, function (status) {
      //Page is loaded!
      phantom.exit();
    });

    Rénovation

    var page = require('webpage').create();
    var url = 'http://phantomjs.org/';
    page.open(url, function (status) {
      page.evaluate(function() {
        // 页面被执行完之后,一般js生成的内容也可以获得了,但是Ajax生成的内容则不一定
        document.getElementById('xxx'); // 可以操作DOM,这里你就可以尝试获取你想要的内容了
        // ...
      })
      phantom.exit();
    });
    

    Mais en fait, dans de nombreux cas, vous devez attendre qu'Ajax soit exécuté avant de commencer à analyser le contenu de la page. À ce stade, vous pouvez utiliser un exemple de code officiel. En utilisant cette fonction, vous pouvez attendre. toutes les demandes pour cette page doivent être chargées. Continuez ensuite le traitement, vous obtiendrez alors la page entièrement chargée, et vous pourrez alors faire tout ce que vous devez faire.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 17:58:25

    Trouvez vous-même l'interface de données

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-17 17:58:25

    Ils doivent tous être générés par l'interface API

    répondre
    0
  • 高洛峰

    高洛峰2017-04-17 17:58:25

    Exemple d'utilisation du sélénium pour extraire de nouvelles cartes de disques :

    from selenium import webdriver
    dirver = webdriver.Chrome()
    dirver.get('https://music.douban.com/')
    for i in dirver.find_elements_by_css_selector('.new-albums .album-title'):
        print i.text
    

    Résultat :
    Ouvert aujourd'hui
    L'histoire au chevet de Jay Chou
    H.A.M.
    3집EX'ACT
    Wild
    Femme dangereuse
    Dans le noir
    L'année dernière était Compliqué

    répondre
    0
  • 阿神

    阿神2017-04-17 17:58:25

    Chrome, appuyez sur F12, cliquez, affichez la requête, il est facile de trouver l'URL et les paramètres, construisez-la simplement vous-même, puis analysez le contenu renvoyé.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 17:58:25

    Cette ligne de js est citée sous index.html.

    <script type="text/javascript" src="https://img3.doubanio.com/misc/mixed_static/37fa28b9fa94889c.js"></script><script type="text/javascript">
    

    Ouvrez ce fichier js et vous pourrez voir

      React.render(React.createElement(component, {"moreUrl":"\/chart","sections":[{"albums":[{"name":"今日營業中","performers":"林宥.................

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 17:58:25

    Ouvrez Chrome pour inspecter l'élément et recherchez js dans le réseau. Généralement, le js avec un nom spécial peut être ce que vous recherchez. Par exemple, celui-ci,

    répondre
    0
  • 黄舟

    黄舟2017-04-17 17:58:25

    Le moyen le plus direct est d'utiliser du sélénium

    répondre
    0
  • Annulerrépondre