python 爬⾍(上)--请求——关于旅游⽹站的酒店评论爬取(传参⽅法)前⾔
最近考试⼀直都没有时间写这篇总结,现在考试暂告⼀段落,现在抽空出来写⼀篇总结,总结⼀下python爬⾍的学习进度。
承接上⼀篇,上⼀篇主要是第⼆次作业后,“⽼师说会给我们时间继续完善这个作业,直到可以真的爬到朋友圈内容….”,其实之后前⾯半句是有,但是后⾯半句真的爬到朋友圈却没有了,⽼师改变了需求,我们变成了去爬⼀些旅游⽹站了。
selenium获取cookie我们被分派到的任务是:研究分析携程,艺龙,去哪⼉,途⽜和驴友的爬去规则分析以及爬取他们的酒店评论,我分配到的是携程和艺龙的酒店评论的爬取。
刚开始是我想⽤之前⽤过的scrapy来做这个爬取,但是不知道是不是我⽤的不太熟练,了解不深⼊,导致⼀些问题我⾃⼰没有办法处理,⽽且上⽹搜索的⼀些答案我都看不懂,之后我才直到,scrapy如果⾃⼰没有⼀定实⼒,排错很困难。
所以还是回到底层python爬⾍实现,凡是要⼀步步来,因为如果我发现⽹上许多python爬⾍都是⽤urllib,urllib2,bs4,Request等库来实现的,所以先抛开scrapy框架来,回归⼀些更加基础的爬⾍相关库的学习。
(在进⾏下⾯之前请执⾏pip list查看⾃⼰是否已经安装了beautiful soup,lxml,Request和scrapy等第三⽅库,urllib,urllib2,re和json都是内置库不⽤考虑,如果没有上⾯四个第三⽅库,请⽤pip install之)
分析要爬取的⽹站
①携程
上⾯这个是携程酒店页,⼴度优先的话就是这⼀层先完成爬去每个酒店评论页的URL,携程酒店页长这样:
然后再在每个url⾥⾯到评论数据来源再抓下来,这⾥我们选择上图第⼀个酒店为例⼦,点进去长这样:
hotels .ctrip /hotel/
看到图中酒店评论(1423)没有,点开看看:
貌似我们的要的评论就近在咫尺,但是当我们打开⽹页源码我们发现它的评论只有第⼀页的5条,后⾯的没有了,那么剩下的评论(第2,第3页…)⼜是怎么获得的呢?
AJAX:这⾥就得说说AJAX了,本⾝什么意思我就不详细说了,我们只要知道AJAX技术是⼀种异步加载数据的⽅式,在原来静态⽹页的天下,每次点击都要重新从服务器再次请求整个⽹页下来,⽽其实中
间我们需要更新的数据只有⼀⼩部分(如果原来请求整个⽹页是100%的话,那么这⼀⼩部分只有5%),这样就造成了⼤量的带宽浪费,AJAX就是当需要更新部分数据时候,只从服务器加载这⼀⼩部分数据,⽽不⽤把整个页⾯⼜重新下载⼀遍,AJAX属于前后端数据交互技术,那么我们⼜要怎么观察AJAX的交互呢?⼜得如何获得这些动态加载的酒店评论数据呢?我⾃⼰⽤的是chrome所以推荐chrome浏览器⾃带的开发者⼯具【Ctrl】+【Shift】+【I】,就可以调出来了,长这样:
图中我们可以看到现在是评论的第⼆页,右边啥都没有,先点到Network,再选择筛选器,原来是【All】,现在换成【XHR】(⼤部分重新加载的AJAX在浏览器中都属于XHR类,当然有部分还可能在JS 类中),这样更加⽅便出通过AJAX加载的更新数据,接下就刷新⼀下页⾯,让它重新加载第⼆页评论,结果如图:
P.s.我这⾥试了⼀下,直接刷新会回到最开始的。最好的办法就是,先点进酒店评论(1420),此时为第⼀页,打开chrome的开发者⼯具,选择XHR筛选器,然后点击下⼀页,就会得到⼀模⼀样的上图
我们可以看到,在右侧的这个URL的内容⾥⾯有很多有价值的信息,有Request URL,往下翻,可以看到Reques
Headers(Cookie,Referer,User-Agent等伪装头部必备元素~)内容,这⾥上张图更清晰:
⼀般来说,通过Request URL,我们就可以抓到更新加载的评论数据了,但是这个URL打开,⼀⽚空⽩,不对啊,以往经验来说应该是有显⽰出json格式的数据的!!后⾯我以为是请求头request headers或者是referer(有些⽹站会检查这个请求来源URL,这个referer记录的就是请求来源URL)的伪装问题,但是写上去了问题依旧,但是通过Preview倒是能够看到加载的内容:
我这⾥纠结了好⼏天,也尝试很多办法,可能携程有特殊的反爬⾍⼿段?现在⽬测只能后⾯再试试通过Selenium+PhantomJS(⽆头浏览器)模仿⽤户正常请求来试试了,但是Selenium也要做功课的呀,外加这篇讲传参的就不涉及了。考虑到最近要准备期末考试了,所以暂时把携程酒店评论抓取的⼯作挂起,以后有空再折腾- -b
P.s.今天在开发者头条看到携程酒店研发部研发经理崔⼴宇的⼀个,感觉之后可以参考再分析
②艺龙
艺龙总的来说给我的感觉没有携程那么复杂,可能携程太出名了吧,⼜⼴告,各种⽿闻。
hotel.elong
上⾯这个是艺龙酒店页⾯,我们以⼴州的酒店为例⼦,谁叫我们是⼴州仔呢,⼴州的话就是这个:
hotel.elong/guangzhou/
和携程⼀样⼜是⼀列的酒店,长这样:
我们也可以⼴度优先先爬去每个酒店的URL,不过这个先放着,我们先看看点进去每个酒店的评论页⾯,先分析⼀番,这⾥我们以上图中的⼴州珠江新城希尔顿欢朋酒店为例,下⾯就是点进去,点击点评,呈现出来长这样:
惯例对⽐⽹页源码和⽹页内容(这⾥指评论),我们发现和携程⼀样,艺龙酒店评论页⾯的源代码中只有5条评论,其他估计也是通过AJAX异步加载的,通过chrome的开发者⼯具分析交互过程,果然如此: