BeautifulSoup4 python3.6 无法获取屏幕中间的数据

BeautifulSoup4 python3.6 impossible to get data in middle of the screen

我是一名日本象棋棋手,我想根据时间绘制出一种策略的受欢迎程度。为此,我有一个网站数据库,其中包含第一个名为 Yagura 的策略的 link: https://shogidb2.com/strategy/%E7%9F%A2%E5%80%89/page/1 我想做的是存储每场比赛开始时出现的年份(这样我可以存储它,然后计算)。在此页面“2017”中。但是,获取文本信息是不可能的。我也试图找到网络 links 从游戏页面获取数据...但是 links 没有出现...

这是我的代码,如果你有任何提示,欢迎你,我开始疯狂了^^

import requests
from bs4 import BeautifulSoup

def downloadString(url, params = {}, cookies = {}):
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    data = requests.get(url, params = params, headers = headers, cookies = cookies)
    return data.text
    
url = "https://shogidb2.com/strategy/%E7%9F%A2%E5%80%89"
html_doc = downloadString(url, params = {}, cookies = {})
soup = BeautifulSoup(html_doc)
      
links = []
      
for link in soup.find_all("a"):
  print(link.get("href"))

问题是网站是用 ReactJS 构建的,它创建 VirtualDom 来填充数据。 BeautifulSoup 另一方面寻找 DOM 元素。由于 DOM 不是为元素创建的,因此它将获得空值。 最好的解决方案是使用casperjs (http://casperjs.org/)

我建议像 casperjs 这样的东西的唯一原因是比 python 支持的抓取模块(如 selenium)更易于使用。如果您对自己的 pythonic 方式非常认真,Selenium 应该适合您。但是第一次配置比较麻烦

使用 npm install -g phantomjs casperjs 安装 phantomjscasperjs

PS: Phantomjs被casperjs使用,只是casperjs的依赖

// scrape.js
var casper = require('casper').create();
var links;

function getLinks() {
// Scrape the links from top-right nav of the website
    var links = document.querySelectorAll('a');
    return Array.prototype.map.call(links, function (e) {
        return e.getAttribute('href')
    });
}

// Opens casperjs homepage
casper.start('https://shogidb2.com/strategy/%E7%9F%A2%E5%80%89');

casper.then(function () {
    links = this.evaluate(getLinks);
});

casper.run(function () {
    for(var i in links) {
        console.log(links[i]);
    }
    casper.done();
});

到运行脚本:casperjs scrape.js