马蜂窝台湾全网游记爬取

作者: 谁占了我的一年的称号 | 来源:发表于2017-07-21 15:50 被阅读156次

一个同学要做毕业设计,需要马蜂窝网上关于台湾省的全部点评游记,正好很久没写这种小爬虫了,来练练手。
马蜂窝的游记可以在两个地方找到,一个是直接在首页上:http://www.mafengwo.cn/

Paste_Image.png
另外一个是:http://www.mafengwo.cn/yj/12684/ Paste_Image.png

不同的是首页上会多一点,有250页,而第二种只有50页。当然选择第一种。
首先观察首页上的关于台湾的热门游记,1,2,3,4翻下来之后发现网址不会变,肯定是ajax了。F12,network之后开始找网址吧。

这里要着重提一下的是这次遇到的一个问题。

http://www.mafengwo.cn/note/pagelet/pagelet/recommendNoteApi?callback=jQuery18106049210270286689_1500622287438&params=%7B%22type%22%3A0%2C%22objid%22%3A0%2C%22page%22%3A11%2C%22ajax%22%3A1%2C%22retina%22%3A1%7D&_=1500622917079
这是找到的真实网址,返回的是json

Paste_Image.png

第一次找的时候我看了一眼就跳过了,后来问了一个朋友才知道,这是网页中为了加快加载速度的一种方式,将鼠标放上去后,就可以看到它返回的东西了。这一点搞明白就简单了。将其中返回的网页后续取出,装上baseurl就是每一篇游记的地址了。如下:

    data2= re.findall(".*jQuery1810367880419551615_1500604060808\((.*?}})\);",data)[0]
    data3 = json.loads(data2)
    next_page =data3['data']['html']
    html = etree.HTML(next_page)
    infos = html.xpath('//div[@class="tn-image"]/a')
    for info in infos:
        link=info.xpath('@href')[0]
        all_link.append('http://www.mafengwo.cn/'+link)

最后在回到找到的网址,观察后面的params=%7B%22type%22%3A0%2C%22objid%22%3A0%2C%22page%22%3A11%2C%22ajax%22%3A1%2C%22retina%22%3A1%7D,有很多参数都是在下面可以找到的,其他都是不变的,只有page在变的。
page%22%3A11%2C%22,但是有很多数字,符号。多翻几页之后就可以明白是在3A~%2C之间的数字才是真的填写地点。
后续的就简单很多了。

果然还是知己知彼,方能写好爬虫。要补前端的知识了。

相关文章

网友评论

  • 帐号_557a:你好,请问一下,那个游记为了提高加载速度,会分步加载,比如找到一个游记,向下滑动,快到底部的时候会通过js再获取下面的数据,我发现每个游记会这样请求好几次,发现请求的链接有一个随机数参数(我可能不理解其中的规则),一直解决不了。导致现在只能爬取到一半的的游记信息。请问你爬取页面的时候遇到过这种问题吗???
  • lijiaxin0002:求Python源码!!
  • 兜兜有糖_2d91:你好,我想请教您一个问题,我是用xpath抓马蜂窝数据的,想抓取香港伦敦等20个城市的游记,但是写xpath时遇见了问题,比如香港有200页内容,但是抓内容发现有两个xpath表达式,一个为//div[@class="vc_article"]一个为 /html/body/div[2]/div[3], 请问我该怎么结合这两个xpath才能抓取所有数据呢?(我是在KNIME里面做的)
    谁占了我的一年的称号:@兜兜有糖_2d91 你说的两个表达式是什么意思?knime是什么?我不太懂。我用的python

本文标题:马蜂窝台湾全网游记爬取

本文链接:https://www.haomeiwen.com/subject/oydekxtx.html