我是日本国际象棋选手,我想根据时间来描绘策略的受欢迎程度。为此,我有一个网站数据库,其中包含第一个名为Yagura的策略的链接: https://shogidb2.com/strategy/%E7%9F%A2%E5%80%89/page/1 我想要做的是存储每个游戏开头出现的年份(像这样我可以存储它,然后计数)。在此页面“2017”。但是,获取文本信息是不可能的。我还试图找到网页链接从游戏页面获取数据......但链接没有出现......
这是我的代码,如果你有任何提示,欢迎你,我开始变得苛刻^^
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"))
答案 0 :(得分:0)
问题是网站是用ReactJS
构建的,它创建了VirtualDom来填充数据。另一方面,BeautifulSoup寻找DOM元素。由于没有为元素创建DOM,因此它将获得空值。 最佳解决方案是使用casperjs
(http://casperjs.org/)
我建议像casperjs
这样的东西的唯一原因比使用python支持的抓取模块(如selenium
)要简单得多。如果你对你的pythonic方式非常认真,Selenium
应该适合你。但第一次很难配置。
使用npm install -g phantomjs casperjs
安装 phantomjs 和 casperjs 。
PS:Casperjs使用Phantomjs,它只是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