Python3爬虫实战:爬取大众点评网某地区所有酒店相关信息

Posted 啊啊啊西吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3爬虫实战:爬取大众点评网某地区所有酒店相关信息相关的知识,希望对你有一定的参考价值。

历时一下午加一晚上,终于把这个爬虫代码写好,后面还有很多想完善的地方(譬如数据存储用redis、使用多线程加快速度、爬取图片、细分数据等等),待有空再做更改,下面是具体的步骤与思路:

工具:PyCharm、Google Chrome开发者工具、fiddle2

平台:Python3.4

一、进入大众点评首页默认的地区是上海地区,所以干脆直接进入上海地区酒店首页从这里开始爬数据

我完成的任务很简单,分为两步:

1、爬取点评网上海地区所有酒店的主页地址,保存下来

2、对于每一个酒店,爬取所有对其评价的顾客的信息(id、name),评价情况(房间、环境、服务、评价时间等),综合评价情况等等,并保存

二、代码编写

1、我们可以看到,酒店主页的每一页都有很多酒店,每一页的url都是如下形式:

http://www.dianping.com/shanghai/hotel/pn

其中n是指页数(1-50),这样我们就可以遍历所有页面,找到所有酒店,如下:

for k1 in range(0,50):
    tempurlpag = "http://www.dianping.com/shanghai/hotel/p"+str(pagelist[k1])
    #queuepag.append(tempurlpag)
    #下面对于当前页拿到每个酒店网址并加入队列
    op = opener.open(tempurlpag)
    if 'html' not in op.getheader('Content-Type'):
        continue
    data1 = op.read().decode(encoding='UTF-8')
    #  οnclick="window.open('/shop/2503441')
  
    linkre = re.compile(r'οnclick="window.open\\(\\'(.*?)\\'\\)', re.DOTALL).findall(data1)
    for k2 in range(0, len(linkre)):
        tempurlhotel = "http://www.dianping.com" + linkre[k2]
        queue.append(tempurlhotel)
        fileOp.write(tempurlhotel+'\\n')
        #print('目前是第:  %d  页的第: %d  个酒店,其地址是 :%s'%(k1+1,k2+1,tempurlhotel))
    print('第:  %d  页抓取完成!'%k1)

运行过程如下

输出文件如下:

可以看到点评网以游客身份登录给的750条酒店信息全部抓取到(游客登录只显示50页数据,不知道用户登录是不是酱紫,爬虫的login请参考上上篇博客)

2、我把所有酒店主页放到了队列里,这里用了常用的deque模块,为了防止网站禁止爬虫,所以在post的时候要把爬虫伪装成浏览器(详见前几篇博客)

对于每个酒店read到的数据,下面是获取评价用户name的示例:

  #   <a target="_blank" rel="nofollow" href="/member/8450012" user-id="8450012" class="J_card">
  #   <img title="灵燕儿" alt="灵燕儿" src="http://i2.dpfile.com/pc/0ffc32ea67e4e872fc50ec7c04effcec(48#c48)/thumb.jpg">

# 用户的名字
username = re.compile(r'<img title="(.*?)" alt=', re.DOTALL).findall(data)
# print('username', username)

前面注释里内容是利用Google或者fiddle或者查看保存下来的html数据里包含用户名的一段字符串,利用正则:

re.compile(r'<img title="(.*?)" alt=', re.DOTALL).findall(data)


就可以得到username

同理,获取所有你想要的信息,处理之后就可以格式化输出到文件:

mink = min(int(len(userid)), int(len(rate_total)), int(len(rate_room)))
                # print('mink:  ', mink)

                # 打开输出文件,追加信息进去
                fileOp = open(fileOut, 'a', encoding="utf-8")
                for k in range(0, mink):
                    fileOp.write('%12s\\t%12s\\t%20s\\t%15s\\t%15s\\t%15s\\t%15s\\t\\n' % (hotelid, userid[k], username[k], rate_room[k], rate_service[k], rate_total[k], rate_time[k]))
                fileOp.close()

在编写代码的过程中不要忘记使用try...except抛出异常,例如下面:

except:
        file_except = open('D:/exception.txt','a')
        file_except.write(tempurl+'\\n')
        breaknumber = breaknumber+1
我们也可以顺便把异常处的信息保存下来,方便进行调试

这是运行过程:



(感觉自己在写课程报告。。。习惯性贴过程。。。)

这是最后抓取到的数据样子:



(有几位歪了不知道啥情况,请忽略)

这样,我们就很easy的完成了想要达成的目标(欢迎留言讨论)

------------------------

要代码的人太多了,上传网上了一份v2版本供大家参考,现在csdn下载无法设置为免费,所以需要1积分,

地址:http://download.csdn.net/download/drdairen/9938689

以上是关于Python3爬虫实战:爬取大众点评网某地区所有酒店相关信息的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫实战,Scrapy实战,大众点评爬虫

python爬虫实战一|大众点评网

爬取大众点评评论犯法吗

python爬虫实战一|大众点评网

python爬虫爬取大众点评并导入redis

python爬虫实例详细介绍之爬取大众点评的数据