爬取酒店信息,首先知道要用到那些库。本次使用request库区获取网页,使用bs4来解析网页,使用selenium来进行模拟浏览。

  本次要爬取的美团网的蚌埠酒店信息及其评价。爬取的网址为“http://hotel.meituan.com/bengbu/”。首先获取导航页的相关信息,具体代码如下

  1. url = 'http://hotel.meituan.com/bengbu/'
  2.  
  3. # 获取酒店分页信息,返回最大页码
  4. html = requests.get(url).text
  5. soup = BeautifulSoup(html,'html.parser')
  6. page_info = soup.find_all('li',class_='page-link') # 获取酒店首页的页面导航条信息
  7. get_page_num = page_info[-1].find('a').get_text() # 获取酒店页面的总页数
  8. print(get_page_num)

  获取了上面的信息,就可以选择一个具体网页,利用Google浏览器的F12查看具体的元素,利用xpath定位相关元素,把获取的信息保存在文件夹下,具体方法代码如下

  1. # 获取所有酒店详细信息
  2. def get_hotel_info(url):
  3. dcap = dict(DesiredCapabilities.PHANTOMJS)
  4. dcap['phantomjs.page.settings.userAgent'] = ('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36')
  5. browser = webdriver.PhantomJS("D:/PhantomJS/phantomjs-2.1.1-windows/bin/phantomjs", desired_capabilities=dcap) #指定phantomjs程序路径
  6. browser.get(url)
  7. hotel_info = {}
  8. page_num = 1
  9.  
  10. while(page_num < int(get_page_num)+1):
  11. # 获取一个页面的所有酒店信息
  12. for item in browser.find_elements_by_class_name('info-wrapper'):
  13. hotel_info['name'] = item.find_element_by_class_name('poi-title').text
  14. hotel_info['star'] = item.find_element_by_class_name('poi-grade').text
  15. hotel_info['consumers'] = item.find_element_by_class_name('poi-buy-num').text
  16. hotel_info['link'] = item.find_element_by_class_name('poi-title').get_attribute('href')
  17. print("酒店名称:{}".format(hotel_info['name']))
  18. print("酒店评分:{}".format(hotel_info['star']))
  19. print("酒店销量:{}".format(hotel_info['consumers']))
  20. print("酒店链接:{}".format(hotel_info['link']))
  21. f = open("酒店信息.txt", 'a', encoding="utf8")
  22. f.write(hotel_info['name']+"\n"+hotel_info['star']+"\n"+hotel_info['consumers']+"\n"+hotel_info['link']+"\n")
  23. u = hotel_info['link'][25:-1]
  24. # print(u)
  25. # 获取酒店前10页评论内容(动态加载的静态爬取)
  26. for i in range(10):
  27. page = i + 1
  28. s = i * 10
  29. print("正在加载第" + str(page) + "页评论")
  30. html = "http://ihotel.meituan.com/group/v1/poi/comment/" + u + "?sortType=default&noempty=1&withpic=0&filter=all&limit=10&offset=" + str(
  31. s)+"&X-FOR-WITH="
  32. # print(html)
  33. # 第一次只使用一个header导致爬取信息不全,添加多个可以正常爬取
  34. my_headers = [
  35. "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
  36. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
  37. "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
  38. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
  39. "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)"
  40. ]
  41. randdom_header = random.choice(my_headers)
  42. headers = {
  43. "User-Agent":randdom_header,
  44. "Host":"ihotel.meituan.com"
  45. }
  46. r = requests.get(html,headers=headers)
  47. print(r.text)
  48. data = json.loads(r.text,strict=False)
  49. # print(data)
  50. comments = data['data']['feedback']
  51. for n in comments:
  52. replytime = n['feedbacktime']
  53. content = n['comment']
  54. # print("评论时间:", replytime)
  55. # print("评论内容:", content)
  56. f = open("jieguo-1.txt", 'a',encoding="utf8")
  57. f.write(content+"\n")
  58.  
  59. browser.find_element_by_class_name('paginator').find_element_by_class_name('next').find_element_by_tag_name('a').click() # 一个页面写完后,通过点击"下一页"图标至下一页,继续获取
  60. time.sleep(1)
  61. page_num += 1

  实现了上述的方法,就可以把完整的酒店信息抓取下来,所有代码如下:

  1. # encoding="utf8"
  2. # 爱学习的兔兔
  3. import requests
  4. from bs4 import BeautifulSoup
  5. from selenium import webdriver
  6. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  7. import time
  8. import json
  9. import random
  10.  
  11. url = 'http://hotel.meituan.com/bengbu/'
  12.  
  13. # 获取酒店分页信息,返回最大页码
  14. html = requests.get(url).text
  15. soup = BeautifulSoup(html,'html.parser')
  16. page_info = soup.find_all('li',class_='page-link') # 获取酒店首页的页面导航条信息
  17. get_page_num = page_info[-1].find('a').get_text() # 获取酒店页面的总页数
  18. print(get_page_num) # 返回酒店页面的
  19.  
  20. # 获取所有酒店详细信息
  21. def get_hotel_info(url):
  22. dcap = dict(DesiredCapabilities.PHANTOMJS)
  23. dcap['phantomjs.page.settings.userAgent'] = ('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36')
  24. browser = webdriver.PhantomJS("D:/PhantomJS/phantomjs-2.1.1-windows/bin/phantomjs", desired_capabilities=dcap) #指定phantomjs程序路径
  25. browser.get(url)
  26. hotel_info = {}
  27. page_num = 1
  28.  
  29. while(page_num < int(get_page_num)+1):
  30. # 获取一个页面的所有酒店信息
  31. for item in browser.find_elements_by_class_name('info-wrapper'):
  32. hotel_info['name'] = item.find_element_by_class_name('poi-title').text
  33. hotel_info['star'] = item.find_element_by_class_name('poi-grade').text
  34. hotel_info['consumers'] = item.find_element_by_class_name('poi-buy-num').text
  35. hotel_info['link'] = item.find_element_by_class_name('poi-title').get_attribute('href')
  36. print("酒店名称:{}".format(hotel_info['name']))
  37. print("酒店评分:{}".format(hotel_info['star']))
  38. print("酒店销量:{}".format(hotel_info['consumers']))
  39. print("酒店链接:{}".format(hotel_info['link']))
  40. f = open("酒店信息.txt", 'a', encoding="utf8")
  41. f.write(hotel_info['name']+"\n"+hotel_info['star']+"\n"+hotel_info['consumers']+"\n"+hotel_info['link']+"\n")
  42. u = hotel_info['link'][25:-1]
  43. # print(u)
  44. # 获取酒店前10页评论内容(动态加载的静态爬取)
  45. for i in range(10):
  46. page = i + 1
  47. s = i * 10
  48. print("正在加载第" + str(page) + "页评论")
  49. html = "http://ihotel.meituan.com/group/v1/poi/comment/" + u + "?sortType=default&noempty=1&withpic=0&filter=all&limit=10&offset=" + str(
  50. s)+"&X-FOR-WITH="
  51. # print(html)
  52. # 第一次只使用一个header导致爬取信息不全,添加多个可以正常爬取
  53. my_headers = [
  54. "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
  55. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
  56. "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
  57. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
  58. "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)"
  59. ]
  60. randdom_header = random.choice(my_headers)
  61. headers = {
  62. "User-Agent":randdom_header,
  63. "Host":"ihotel.meituan.com"
  64. }
  65. r = requests.get(html,headers=headers)
  66. print(r.text)
  67. data = json.loads(r.text,strict=False)
  68. # print(data)
  69. comments = data['data']['feedback']
  70. for n in comments:
  71. replytime = n['feedbacktime']
  72. content = n['comment']
  73. # print("评论时间:", replytime)
  74. # print("评论内容:", content)
  75. f = open("jieguo-1.txt", 'a',encoding="utf8")
  76. f.write(content+"\n")
  77.  
  78. browser.find_element_by_class_name('paginator').find_element_by_class_name('next').find_element_by_tag_name('a').click() # 一个页面写完后,通过点击"下一页"图标至下一页,继续获取
  79. time.sleep(1)
  80. page_num += 1
  81.  
  82. def main():
  83. get_hotel_info(url)
  84.  
  85. if '__main__' == __name__:
  86. main()

  这样就顺利的拿到了酒店信息和评价,为了简单分析下拿到的数据,使用了SnowNLP分词看数据,发现效果一般,又使用了jieba分词和词云来分析,得出一张图片如下图:

这里没有对符号进行过滤,只能给出一个大体的评价关系图。具体代码图下:

  1. # encoding="utf8"
  2. # SnowNLP分词
  3. # 爱学习的兔兔
  4. from snownlp import SnowNLP
  5. f = open("jieguo-1.txt","r",encoding="utf8")
  6. r = f.readlines() #按行读取
  7. #for line in r:
  8. s = SnowNLP(str(r))
  9. for sentence in s.sentences:
  10. print(sentence)
  11.  
  12. # jieba分词与词云
  13. import jieba.posseg as posseg
  14. from collections import Counter
  15. from wordcloud import WordCloud
  16. #for line in r:
  17. words = [w for w,f in posseg.cut(str(r))]
  18. print(words)
  19. c = Counter(words)
  20. print(c.most_common(20))
  21. wc = WordCloud(font_path='c:\\Windows\\Fonts\\simkai.ttf', height=1080, width=1920).generate_from_frequencies(c)
  22. image = wc.to_image()
  23. image.show()
  24. wc.to_file("ex2.png")

为了得到效果更好一点,自行百度了一下,得到新的图片,如下:

具体的实现代码如下:

  1. import matplotlib.pyplot as plt
  2. from wordcloud import WordCloud
  3. import jieba
  4. text_from_file_with_apath = open('jieguo-1.txt',encoding="utf-8").read()
  5.  
  6. wordlist_after_jieba = jieba.cut(text_from_file_with_apath, cut_all=True)
  7. wl_space_split = " ".join(wordlist_after_jieba)
  8.  
  9. my_wordcloud = WordCloud(font_path='c:\\Windows\\Fonts\\simkai.ttf', height=1080, width=1920).generate(wl_space_split)
  10.  
  11. plt.imshow(my_wordcloud)
  12. plt.axis("off")
  13. plt.show()  

整体走下来,感觉写个简单的爬虫能学到不少有用的信息。

  1.  

python爬取酒店信息练习的更多相关文章

  1. Python爬取招聘信息,并且存储到MySQL数据库中

    前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...

  2. Python爬取网页信息

    Python爬取网页信息的步骤 以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例. 1.确认网址 在浏览器中输入初 ...

  3. (转)python爬取拉勾网信息

    学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...

  4. python爬取商品信息

    老严要爬某网购网站的商品信息,正好我最近在学python,就一起写了一个简单的爬虫程序. 需求:某网的商品信息,包括商品名,市场价和售价 工具:python2.7.8,urllib2,re #codi ...

  5. 配置scrapy-splash+python爬取医院信息(利用了scrapy-splash)

    北京艾丽斯妇科医院(http://fuke.fuke120.com/) 首先先说一下配置splash 1.利用pip安装scrapy-splash库 pip install scrapy-splash ...

  6. python爬取微信信息--显示性别/地域/词云(附代码)

    看到一篇有意思的博客 利用微信开放的接口itchat 可以获取登录的微信好友信息 并且利用图像工具显示分析结果 非常的有意思 记录下实现过程 并提供可执行代码 首先要 import itchat 库 ...

  7. [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

    [python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...

  8. 常用正则表达式爬取网页信息及HTML分析总结

    Python爬取网页信息时,经常使用的正则表达式及方法. 1.获取<tr></tr>标签之间内容 2.获取<a href..></a>超链接之间内容 3 ...

  9. 使用python爬取MedSci上的期刊信息

    使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...

随机推荐

  1. SP1812 LCS2 - Longest Common Substring II

    能匹配上子串的节点对它的所有parent都有贡献 在树上转移即可 #include<cstdio> #include<algorithm> #include<cstrin ...

  2. python 函数传递可变参数的用法

    可变参数 在Python函数中,还可以定义可变参数.顾名思义,可变参数就是传入的参数个数是可变的,可以是1个.2个到任意个,还可以是0个. 我们以数学题为例子,给定一组数字a,b,c……,请计算a2 ...

  3. 'pip' 不是内部或外部命令

    安装好Python,在环境变量Path中加入相应路径信息后,Python命令没问题,但是运行pip失败: 'pip' 不是内部或外部命令,Pip工具已经自带安装好了,只是跟Python命令一样,需要我 ...

  4. Oracle Service Bus (OSB) 12c 的配置安装

    Oracle Service Bus (OSB) 12c 的配置安装 1.OSB配置环境: Oracle Database Oracle Fusion Middleware Infrastructur ...

  5. python-性能测试

    目录: 1.timeit 1.1 在命令后调用timeit 1.2 在代码中使用 1.3 创建计时器实例,通过autorange获得循环次数 1.4 Wall时间和CPU时间 2.profile和cP ...

  6. gentoo kvm qemu virt-manager - Unable to complete install: error creating macvtap interface macvtap0@: Operation not supported'

    碰到这个一般是内核没有开启相应的 macvtap 选项,开启相应选项后,就不会报错了. Device Drivers ---> Network Device Support ---> &l ...

  7. Java命令运行.class文件

    class使用全名(点号间隔):java headfirst.designpatterns.proxy.gumball.GumballMonitorTestDrive

  8. 34.纯 CSS 创作在文本前后穿梭的边框

    原文地址: https://segmentfault.com/a/1190000015045700 感想: 动画  +  z-index:n   ; HTML code: <div class= ...

  9. winform/timer控件/权限设置/三级联动

    一.timer控件 组件--timer timer是一个线程,默认可以跨线程访问对象 属性:Enabled--可用性 Interval--间隔时间 Tick:间隔时间发生事件 二.三级联动 例: pu ...

  10. 【3-28】JavaScript的DOM操作

    一.定义:DOM是一种用于HTML和XML文档的编程接口. 二.Windows对象操作: (一)Window.open(URL,name,features,replace) 1.URL;页面地址 2. ...