python爬取酒店信息练习
爬取酒店信息,首先知道要用到那些库。本次使用request库区获取网页,使用bs4来解析网页,使用selenium来进行模拟浏览。
本次要爬取的美团网的蚌埠酒店信息及其评价。爬取的网址为“http://hotel.meituan.com/bengbu/”。首先获取导航页的相关信息,具体代码如下
url = 'http://hotel.meituan.com/bengbu/' # 获取酒店分页信息,返回最大页码
html = requests.get(url).text
soup = BeautifulSoup(html,'html.parser')
page_info = soup.find_all('li',class_='page-link') # 获取酒店首页的页面导航条信息
get_page_num = page_info[-1].find('a').get_text() # 获取酒店页面的总页数
print(get_page_num)
获取了上面的信息,就可以选择一个具体网页,利用Google浏览器的F12查看具体的元素,利用xpath定位相关元素,把获取的信息保存在文件夹下,具体方法代码如下
# 获取所有酒店详细信息
def get_hotel_info(url):
dcap = dict(DesiredCapabilities.PHANTOMJS)
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')
browser = webdriver.PhantomJS("D:/PhantomJS/phantomjs-2.1.1-windows/bin/phantomjs", desired_capabilities=dcap) #指定phantomjs程序路径
browser.get(url)
hotel_info = {}
page_num = 1 while(page_num < int(get_page_num)+1):
# 获取一个页面的所有酒店信息
for item in browser.find_elements_by_class_name('info-wrapper'):
hotel_info['name'] = item.find_element_by_class_name('poi-title').text
hotel_info['star'] = item.find_element_by_class_name('poi-grade').text
hotel_info['consumers'] = item.find_element_by_class_name('poi-buy-num').text
hotel_info['link'] = item.find_element_by_class_name('poi-title').get_attribute('href')
print("酒店名称:{}".format(hotel_info['name']))
print("酒店评分:{}".format(hotel_info['star']))
print("酒店销量:{}".format(hotel_info['consumers']))
print("酒店链接:{}".format(hotel_info['link']))
f = open("酒店信息.txt", 'a', encoding="utf8")
f.write(hotel_info['name']+"\n"+hotel_info['star']+"\n"+hotel_info['consumers']+"\n"+hotel_info['link']+"\n")
u = hotel_info['link'][25:-1]
# print(u)
# 获取酒店前10页评论内容(动态加载的静态爬取)
for i in range(10):
page = i + 1
s = i * 10
print("正在加载第" + str(page) + "页评论")
html = "http://ihotel.meituan.com/group/v1/poi/comment/" + u + "?sortType=default&noempty=1&withpic=0&filter=all&limit=10&offset=" + str(
s)+"&X-FOR-WITH="
# print(html)
# 第一次只使用一个header导致爬取信息不全,添加多个可以正常爬取
my_headers = [
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.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",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
"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",
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)"
]
randdom_header = random.choice(my_headers)
headers = {
"User-Agent":randdom_header,
"Host":"ihotel.meituan.com"
}
r = requests.get(html,headers=headers)
print(r.text)
data = json.loads(r.text,strict=False)
# print(data)
comments = data['data']['feedback']
for n in comments:
replytime = n['feedbacktime']
content = n['comment']
# print("评论时间:", replytime)
# print("评论内容:", content)
f = open("jieguo-1.txt", 'a',encoding="utf8")
f.write(content+"\n") browser.find_element_by_class_name('paginator').find_element_by_class_name('next').find_element_by_tag_name('a').click() # 一个页面写完后,通过点击"下一页"图标至下一页,继续获取
time.sleep(1)
page_num += 1
实现了上述的方法,就可以把完整的酒店信息抓取下来,所有代码如下:
# encoding="utf8"
# 爱学习的兔兔
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
import json
import random url = 'http://hotel.meituan.com/bengbu/' # 获取酒店分页信息,返回最大页码
html = requests.get(url).text
soup = BeautifulSoup(html,'html.parser')
page_info = soup.find_all('li',class_='page-link') # 获取酒店首页的页面导航条信息
get_page_num = page_info[-1].find('a').get_text() # 获取酒店页面的总页数
print(get_page_num) # 返回酒店页面的 # 获取所有酒店详细信息
def get_hotel_info(url):
dcap = dict(DesiredCapabilities.PHANTOMJS)
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')
browser = webdriver.PhantomJS("D:/PhantomJS/phantomjs-2.1.1-windows/bin/phantomjs", desired_capabilities=dcap) #指定phantomjs程序路径
browser.get(url)
hotel_info = {}
page_num = 1 while(page_num < int(get_page_num)+1):
# 获取一个页面的所有酒店信息
for item in browser.find_elements_by_class_name('info-wrapper'):
hotel_info['name'] = item.find_element_by_class_name('poi-title').text
hotel_info['star'] = item.find_element_by_class_name('poi-grade').text
hotel_info['consumers'] = item.find_element_by_class_name('poi-buy-num').text
hotel_info['link'] = item.find_element_by_class_name('poi-title').get_attribute('href')
print("酒店名称:{}".format(hotel_info['name']))
print("酒店评分:{}".format(hotel_info['star']))
print("酒店销量:{}".format(hotel_info['consumers']))
print("酒店链接:{}".format(hotel_info['link']))
f = open("酒店信息.txt", 'a', encoding="utf8")
f.write(hotel_info['name']+"\n"+hotel_info['star']+"\n"+hotel_info['consumers']+"\n"+hotel_info['link']+"\n")
u = hotel_info['link'][25:-1]
# print(u)
# 获取酒店前10页评论内容(动态加载的静态爬取)
for i in range(10):
page = i + 1
s = i * 10
print("正在加载第" + str(page) + "页评论")
html = "http://ihotel.meituan.com/group/v1/poi/comment/" + u + "?sortType=default&noempty=1&withpic=0&filter=all&limit=10&offset=" + str(
s)+"&X-FOR-WITH="
# print(html)
# 第一次只使用一个header导致爬取信息不全,添加多个可以正常爬取
my_headers = [
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.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",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
"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",
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)"
]
randdom_header = random.choice(my_headers)
headers = {
"User-Agent":randdom_header,
"Host":"ihotel.meituan.com"
}
r = requests.get(html,headers=headers)
print(r.text)
data = json.loads(r.text,strict=False)
# print(data)
comments = data['data']['feedback']
for n in comments:
replytime = n['feedbacktime']
content = n['comment']
# print("评论时间:", replytime)
# print("评论内容:", content)
f = open("jieguo-1.txt", 'a',encoding="utf8")
f.write(content+"\n") browser.find_element_by_class_name('paginator').find_element_by_class_name('next').find_element_by_tag_name('a').click() # 一个页面写完后,通过点击"下一页"图标至下一页,继续获取
time.sleep(1)
page_num += 1 def main():
get_hotel_info(url) if '__main__' == __name__:
main()
这样就顺利的拿到了酒店信息和评价,为了简单分析下拿到的数据,使用了SnowNLP分词看数据,发现效果一般,又使用了jieba分词和词云来分析,得出一张图片如下图:
这里没有对符号进行过滤,只能给出一个大体的评价关系图。具体代码图下:
# encoding="utf8"
# SnowNLP分词
# 爱学习的兔兔
from snownlp import SnowNLP
f = open("jieguo-1.txt","r",encoding="utf8")
r = f.readlines() #按行读取
#for line in r:
s = SnowNLP(str(r))
for sentence in s.sentences:
print(sentence) # jieba分词与词云
import jieba.posseg as posseg
from collections import Counter
from wordcloud import WordCloud
#for line in r:
words = [w for w,f in posseg.cut(str(r))]
print(words)
c = Counter(words)
print(c.most_common(20))
wc = WordCloud(font_path='c:\\Windows\\Fonts\\simkai.ttf', height=1080, width=1920).generate_from_frequencies(c)
image = wc.to_image()
image.show()
wc.to_file("ex2.png")
为了得到效果更好一点,自行百度了一下,得到新的图片,如下:
具体的实现代码如下:
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import jieba
text_from_file_with_apath = open('jieguo-1.txt',encoding="utf-8").read() wordlist_after_jieba = jieba.cut(text_from_file_with_apath, cut_all=True)
wl_space_split = " ".join(wordlist_after_jieba) my_wordcloud = WordCloud(font_path='c:\\Windows\\Fonts\\simkai.ttf', height=1080, width=1920).generate(wl_space_split) plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
整体走下来,感觉写个简单的爬虫能学到不少有用的信息。
python爬取酒店信息练习的更多相关文章
- Python爬取招聘信息,并且存储到MySQL数据库中
前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...
- Python爬取网页信息
Python爬取网页信息的步骤 以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例. 1.确认网址 在浏览器中输入初 ...
- (转)python爬取拉勾网信息
学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...
- python爬取商品信息
老严要爬某网购网站的商品信息,正好我最近在学python,就一起写了一个简单的爬虫程序. 需求:某网的商品信息,包括商品名,市场价和售价 工具:python2.7.8,urllib2,re #codi ...
- 配置scrapy-splash+python爬取医院信息(利用了scrapy-splash)
北京艾丽斯妇科医院(http://fuke.fuke120.com/) 首先先说一下配置splash 1.利用pip安装scrapy-splash库 pip install scrapy-splash ...
- python爬取微信信息--显示性别/地域/词云(附代码)
看到一篇有意思的博客 利用微信开放的接口itchat 可以获取登录的微信好友信息 并且利用图像工具显示分析结果 非常的有意思 记录下实现过程 并提供可执行代码 首先要 import itchat 库 ...
- [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】
[python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...
- 常用正则表达式爬取网页信息及HTML分析总结
Python爬取网页信息时,经常使用的正则表达式及方法. 1.获取<tr></tr>标签之间内容 2.获取<a href..></a>超链接之间内容 3 ...
- 使用python爬取MedSci上的期刊信息
使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...
随机推荐
- c++ 接口类
什么是接口类?2017-06-07 接口类就是只提供接口不提供实现的类,就是接口类,接口类和抽象类对C++而言,没有什么区别. 接口类有如下特点: 子类来实现接口类中没有实现的所有接口. 接口方法前面 ...
- 各种uml图
UML各种图总结-精华 UML(Unified Modeling Language)是一种统一建模语言,为面向对象开发系统的产品进行说明.可视化.和编制文档的一种标准语言.下面将对UML的九种图+ ...
- jq-杂记
点击消失 <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"> </script& ...
- 2014最新 iOS App 提交上架store 详细流程
http://blog.csdn.net/tt5267621/article/details/39430659
- uva-321-暴力枚举-隐式图搜索
题意:给你n个房间,有许多灯的控制开关,i房间灯的开关在j房间,未开灯的房间不能进,i房间和j房间之间如果没有门,也不能从i进入到j,开始房间是1,并且灯是开着的,问你是否能够走到最后一个房间n,并且 ...
- sql server无log ldf日志文件附件mdf数据库重新生成ldf日志文件
CREATE DATABASE TestDB ON ( FILENAME ='D:\TestDB.mdf' --路径 ) for ATTACH_REBUILD_LOG
- 55.1拓展之边框border-width属性。
效果地址:https://scrimba.com/c/cQpDKkSN HTML code: <div class="border1 borders"></div ...
- 《算法》第四章部分程序 part 14
▶ 书中第四章部分程序,包括在加上自己补充的代码,两种 Prim 算法求最小生成树 ● 简单 Prim 算法求最小生成树 package package01; import edu.princeton ...
- mysql 外键引发的删除失败
mysql> TRUNCATE TABLE role ; ERROR 1701 (42000): Cannot truncate a table referenced in a foreign ...
- hive随机采样
hive> select * from account limit 10;OKaccount.accountname account.accid account.platid ac ...