人生苦短,我用 Python。
Life is short, I use Python.
本次将对【常州美食】全部美食推荐 进行一次爬虫实践,主要想爬取的信息有:
1.餐厅的名称
2.餐厅的评分
3.餐厅评论数
4.餐厅的地址
5.人均消费价格
确定了以上信息后,开始爬一个先试试是什么样子的。先用 xpath 试试。
果然碰到了403。
美团看来使用了反爬虫机制,必须要模拟浏览器来进行爬取。
先看下浏览器的 Headers
经过几次尝试,发现只对 Cookie 和 User-Agent 进行校验。
哈哈,成功抓取到网页了。 不过看起来网页结构和之前我们设置的 xpath不太一样。看来只能使用正则表达式了。
关于正则表达式的学习,推荐使用在线的正则表达式工具,可以很方便的进行调试
省略一万字后,得到正则表达式:
很显然这是个新手写的,但是并没有办法,第一次用,硬着头皮写了这么复杂。
虽有看起来很乱其实很管用,也很好理解。
最终我如愿爬到了我的第一组数据
收集到这里已经结束了吗?是的,你猜对了结束了。
不过这样结束有点无聊,太敷衍了。
再翻页搜集下把常州全部餐饮全爬下来吧。
好的。
先看看网页是怎么翻页的
第一页: http://cz.meituan.com/meishi/pn1/
第二页: http://cz.meituan.com/meishi/pn2/
第三页: http://cz.meituan.com/meishi/pn3/
看来还是相当爬虫友好的,没有很复杂混乱的运算来迷惑
那就翻页爬吧
没想到这么轻松就全下来了,想着又快结束,感觉还是很无聊啊。
再搞点事情吧,发现之前获取的商家信息里没有电话号码的信息。找找看也一起爬下来吧。
原来电话在这里,顺便把营业时间也爬下来吧。
观察了一下网页链接发现后面的数字就是我们爬下来的数据中的 poiId 的这个
这样我们就可以根据,poiId 来爬取电话和营业时间啦。
打包写个函数
还是轻松成功获取到了所有的电话和营业信息。
但是好景不长,在爬取到一半的时候,又被403了。
而且现在浏览器打开也被403了。
试了下 Firefox 和 Chrome 也都挂了。
很明显了我的 Cookie 里面的信息被服务器拉黑了。看看 Cookie 里到底有什么信息。
因为被封了,我们只能用无痕方式来访问了
看了下,决定采用多个 Cookie 然后随机调用的方式来避免被封了。
最后搞了17个 Cookie
观察这个 Cookies 发现里面竟然有定位信息,哈哈。 果断修改了,17个不同的定位。
最后在用随机函数的方式,随机使用 Cookie。
经测试,可以很高速的爬取数据而且不会被封啦。
最终,用 csv进行了一下简单的数据保存。
这次有趣的探索终于结束啦。
领取专属 10元无门槛券
私享最新 技术干货