首发:http://qixinbo.info/2016/05/04/mathematica-crawler/
今下午实在不想改论文,学着做了一个Mathematica爬虫,用来爬取即将上映(后天5月6号)的<美国队长3>的剧照。
参考文献:
看这里
首先得找到<美队3>的照片网站吧,这里用的是经典大牌电影网站——时光网,链接是here,然后将网页的源文件导入Mathmatica中:
1 | input = Import["http://movie.mtime.com/209122/posters_and_images/posters/hot.html", "Source"]; |
注意这里导入的元素是Source,即原始的源文件,没有经过任何转化。还可以用XMLObject,见这个教程,但是我感觉没有Source好使。
第二步:分析源文件这一步是分析出来图片在网站的哪一部分。可以通过两种途径,一个是可视化操作,即用浏览器的检查功能,比如火狐的“查看元素”和Chrome的“检查”,通过点击不同的地方,就能在原网页中高亮该部分;另一种是直接分析,即在源文件中直接查看寻找。一般是两者结合着用,比如先用方法一找到该元素的标记,然后在源文件中直接找到该标记。但是此例中找到的网页元素在“查看源代码”中找不到,难道是因为启用了JS的某项特技?搞不懂为啥,所以还是按部就班地在源文件中查找,于是发现了这样一行:
1 2 3 4 5 6 7 8 9 | var imageList = [{"stagepicture":[{"officialstageimage":[{"id":7141431,"title":"官方剧照 #01","type":6,"subType":6001,"status":1,"img_ 220":"http://img31.mtime.cn/pi/2016/03/11/133802.60497903_ 220X220.jpg","img_ 1000":"http://img31.mtime.cn/pi/2016/03/11/133802.60497903_ 1000X1000.jpg","width":4785,"height":3190,"fileSize":5236,"enterTime": "2015-12-10","enterNickName":"旁聽生","description":"","commentCount":0, "imgDetailUrl": |
这里面就暴露了图片的地址。
找到地址后,复制出来实际验证一下,这时可以发现这里每张图片都对应了两种尺寸,一种是220x220的缩略图形式,一种是1000x1000的高清无码大图。两个都下下来有些浪费空间,后面选哪个下那很清楚了。
上一步虽然找到了图片地址,但是它埋没在了整个源文件中,所以还需要通过Mathematica的字符串操作将它规矩地提取出来。
1 | data1 = StringCases[input, ""img_1000"" ~~ Shortest[__] ~~ "jpg"] |
继续利用StringCases进一步提炼:
1 2 | data2 = StringCases[data1, "http" ~~ Shortest[__] ~~ "jpg"]; data3 = Flatten[data2]; |
将图片批量保存到本地,这一步参考了这篇博文。
1 | Export["~/Public/" <> StringSplit[#, "/"][[-1]], Import[#]] & /@ data3; |
Over!