mathematica的Import除了可以从文件中导入数据之外,还可以方便的从任何可访问的网页中导入数据,例如
Import["https://book.douban.com/top250"]
通过加入Elements,可以查看可用的元素
Import["https://book.douban.com/top250", "Elements"]
{"Data", "FullData", "Hyperlinks", "ImageLinks", "Images", "Plaintext", "Source", "Title", "XMLObject"}
为了获取豆瓣图书的top250,我们需要解析它的html页面元素,因此
Import["https://book.douban.com/top250", "Source"]
这将得到一个html格式的源码(当然,你也可以通过浏览器查看源代码)
找到其中关键的一行
<a href="https://book.douban.com/subject/1770782/" onclick="moreurl(this,{i:'0'})" title="追风筝的人"
这是一个超链接,里面含有书的标题以及对应页面,因此,我们需要从整个html中取出这些元素,注意,你的正则表达式应该尽量匹配这些元素,利用mathematica的StringCases,可以方便找到这些元素
dbhtml = Import["https://book.douban.com/top250?start=0", "Source"];
list = StringCases[dbhtml, RegularExpression["<a href=\"https://book.douban.com/subject/.+\""]];
第一行,获取整个html页面,
第二行,取出href超链接
生成的是一个list,结果如下
"<a href=\"https://book.douban.com/subject/1770782/\" \
onclick="moreurl(this,{i:'0'})" title=\"追风筝的人\"", "<a \
href=\"https://book.douban.com/subject/1084336/\" \
onclick="moreurl(this,{i:'1'})" title=\"小王子\"", "<a \
href=\"https://book.douban.com/subject/1008145/\" \
onclick="moreurl(this,{i:'2'})" title=\"围城\"", "<a \
href=\"https://book.douban.com/subject/25862578/\" \
onclick="moreurl(this,{i:'3'})" title=\"解忧杂货店\"", "<a \
href=\"https://book.douban.com/subject/1082154/\" \
onclick="moreurl(this,{i:'4'})" title=\"活着\"", "<a \
href=\"https://book.douban.com/subject/3259440/\" \
onclick="moreurl(this,{i:'5'})" title=\"白夜行\"",
..........
}
利用StringReplace替换规则,替换想要的结果
list = StringReplace[list,
RegularExpression[".+\"(.+)\".+\"(.+)\""] -> "-$1-$2"];
生成结果
{"-https://book.douban.com/subject/1770782/-追风筝的人", \
"-https://book.douban.com/subject/1084336/-小王子", \
"-https://book.douban.com/subject/1008145/-围城", \
"-https://book.douban.com/subject/25862578/-解忧杂货店", \
"-https://book.douban.com/subject/1082154/-活着", \
"-https://book.douban.com/subject/3259440/-白夜行", \
"-https://book.douban.com/subject/1046265/-挪威的森林", \
"-https://book.douban.com/subject/3211779/-嫌疑人X的献身", \
"-https://book.douban.com/subject/2567698/-三体", \
"-https://book.douban.com/subject/1017143/-不能承受的生命之轻", \
"-https://book.douban.com/subject/1007305/-红楼梦", \
"-https://book.douban.com/subject/1016300/-梦里花落知多少", \
"-https://book.douban.com/subject/1040771/-达\[CenterDot]芬奇密码", \
"-https://book.douban.com/subject/20427187/-看见", \
"-https://book.douban.com/subject/6082808/-百年孤独", \
"-https://book.douban.com/subject/5275059/-1988:我想和这个世界谈谈", \
"-https://book.douban.com/subject/1461903/-何以笙箫默", \
"-https://book.douban.com/subject/1200840/-平凡的世界(全三部)", \
"-https://book.douban.com/subject/1141406/-简爱", \
"-https://book.douban.com/subject/1041007/-哈利\[CenterDot]波特与魔法石", \
"-https://book.douban.com/subject/10554308/-白夜行", \
"-https://book.douban.com/subject/3066477/-三体Ⅱ", \
"-https://book.douban.com/subject/1068920/-飘", \
"-https://book.douban.com/subject/4238362/-送你一颗子弹", \
"-https://book.douban.com/subject/5363767/-三体Ⅲ"}
注意,以上仅仅只是一个页面(第一页),那么,如何进行翻页呢?
答案是显然的,你只需要将以上步骤写成一个函数,然后对于不同的页面进行调用即可
https://book.douban.com/top250?start=0
https://book.douban.com/top250?start=25
https://book.douban.com/top250?start=50
https://book.douban.com/top250?start=75
.......