学习Python3爬虫实战:爬取大众点评网
(资料图片)
学习Python3爬虫实战:爬取大众点评网某地区所有酒店相关信息,我爬取的北京地区的酒店,由于网站更新,原文中的一些方法已经不再适用,我的工作是在该文指导下重写了一个爬虫。
爬虫无非分为这几块:分析目标、下载页面、解析页面、存储内容,其中下载页面不提。
分析目标:如Python3爬虫实战:爬取大众点评网某地区所有酒店相关信息,目的是爬取所有酒店的用户评分信息解析页面:使用正则表达式和BeautifulSoup两种方式,一般情况都可以使用正则表达式,除非需要分辨特定用户的评论。存储内容:酒店信息(id和名称)存储在“hotel_dianping.txt”中,酒店的评分信息存储在“id_name+comments.txt”中
Talk is cheap, show me the code.
#coding=utf-8import reimport requestsfrom bs4 import BeautifulSoupaim_url = "http://www.dianping.com/beijing/hotel"basic_url = "http://www.dianping.com"hotel_file = "hotel_dianping.txt"def download_page(url): # 伪装请求头部 # 有了Cookie不怕不让爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36", "Cookie":"_lxsdk_cuid=15eea339434c8-0d2cff6b34e61c-c313760-100200-15eea339434c8; _lxsdk=15eea339434c8-0d2cff6b34e61c-c313760-100200-15eea339434c8; _hc.v=cec4c6d7-039d-1717-70c0-4234813c6e90.1507167802;\ s_ViewType=1; __mta=218584358.1507168277959.1507176075960.1507176126471.5; JSESSIONID=48C46DCEFE3A390F647F52FED889020D; aburl=1; cy=2; cye=beijing; _lxsdk_s=15eea9307ab-17c-f87-123%7C%7C48", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Host":"www.dianping.com" } data = requests.get(url, headers=headers).content # 转换编码 data = data.decode("utf-8") return data# 获取并存储酒店信息(id, name)def getHotelInfo(hotel_file): # 网站上显示酒店页面有50页,事实上,只能爬取13页,之后的页面为空 for i in range(1, 51): page = download_page(aim_url) # 如:"action": "click","content":"/shop/8025450","title":"速8酒店" re_result = re.compile(r""action": "click","content":"(.*?)","title":"(.*?)"").findall(page) txt = "" for x in re_result: txt += x[0] # /shop/(/d)+格式 txt += " " + x[1] # 酒店名称 txt += "\n" writeToFile(hotel_file, txt) print("第%d页OK....." % i) i += 1 # 下一页的网址 aim_url = "http://www.dianping.com/beijing/hotel/p" + str(i)# 往文件中写contentdef writeToFile(file_name, content): with open(file_name, "a+", encoding="utf-8") as fp: fp.write(content)# 获取每个评论页的所有评论def getScore(page): # 对于评分需要使用BeautifulSoup,直接使用正则表达式无法判断数据是哪个用户的 score_list = [] soup = BeautifulSoup(page, "html.parser") comment_rst_list = soup.find_all("div", attrs = {"class": "comment-rst"}) # 对于各个用户的评论 for comment_rst in comment_rst_list: rst_list = comment_rst.find_all("span", attrs={"class": "rst"}) # 记录某个用户的各项评分,默认为零,前五项分别是房间、位置、服务、卫生和设施,最后一项为冗余项。 single_score_dic = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0} # 对于各个类型的评论 for rst in rst_list: comment = rst.getText() type_ = comment[:2] score = comment[2] if type_ == "房间": single_score_dic[0] = score elif type_ == "位置": single_score_dic[1] = score elif type_ == "服务": single_score_dic[2] = score elif type_ == "卫生": single_score_dic[3] = score elif type_ == "设施": single_score_dic[4] = score else: single_score_dic[5] = score score_list.append(single_score_dic) return score_list# 中文字符和英文、数字占用的空间不同,为了输出显示友好,user_name不能简单的以%30s格式输出def setProperFormat(user_name): re_result = re.compile(r"(\d|[A-Z]|[a-z]|\_)").findall(user_name) len_eng = len(re_result) total_len = len(user_name) len_cha = total_len - len_eng real_len = len_eng + len_cha * 2 blank_len = 30 - real_len txt = "%s" % (" " * blank_len + user_name) return txt# 获取每一条评论def getEveryComment(hotel_file): # 打开hotel_file文件 with open(hotel_file, "r", encoding="utf-8") as fp: num_hotel = 1 # 对于每家酒店 for line in fp: # 获取酒店url, id和name hotel_url = line.split(" ")[0] hotel_name = line.split(" ")[1][:-1] # 去掉最后的"\n" hotel_id = hotel_url.split("/")[2] # 设置存储用户评论的文件的文件名 store_file = "%s_%scomments.txt" % (hotel_id, hotel_name) # 存入header txt = "%12s%12s%30s%15s%15s%15s%15s%15s%15s\n" % ("hotel_id", "user_id", "user_name", "rate_room", "rate_position", "rate_service", "rate_health", "rate_facility", "rate_others") writeToFile(store_file, txt) # 获取评论页url business_url = basic_url + hotel_url + "/review_more" page = download_page(business_url) # 计算出评论页数 total_comments = re.compile(r"全部\((\d+)\)", re.DOTALL).findall(page) print(total_comments) pages = int(int(total_comments[0]) / 20) + 1 # 对于每一页的评论 for n in range(1, pages+1): comment_url = business_url + "?pageno=%s" % n print(comment_url) page = download_page(comment_url) # 如:HpointK # (id, userName) user_info = re.compile(r"(.*?)", re.DOTALL).findall(page) score_list = getScore(page) txt = "" try: for i, info in enumerate(user_info): txt += "%12s%12s" % (hotel_id, info[0]) txt += setProperFormat(info[1]) txt += "%15s%15s%15s%15s%15s%15s\n" % (score_list[i][0], score_list[i][1], score_list[i][2], score_list[i][3], score_list[i][4], score_list[i][5]) except Exception as e: print(e) print(len(user_info)) break # 每次往文件中写网页中的评论 writeToFile(store_file, txt) print("第%d页已存储,共%d页" % (n, pages)) break print("第%s家酒店的评论已存储", num_hotel) num_hotel += 1 breakgetHotelInfo(hotel_file)getEveryComment(hotel_file)
标签:
相关推荐:
最新新闻:
- 简单了解一下FIS yarnglobaladdfis3使用方法|环球今亮点
- 爬虫代码中使用代理ip的方法 代理ip使用原理
- 数据挖掘的过程是什么?有哪些阶段?
- linuxtone日常命令:快速杀掉mysql进程
- windwos7无线打不开怎么办?acer4820tg无线打不开的解决办法|全球播资讯
- 学习Python3爬虫实战:爬取大众点评网
- community音响怎么样?community音响优势介绍-时讯
- 世界即时看!android屏幕投射功能 安卓手机怎么投射屏幕?
- 【kvm虚拟化】centos7部署CPU虚拟化
- 开源文本编辑器Vim推出新编程语言Zimbu:全球通讯
- 快播怎么用BT种子?快播播放种子的3种方法 全球热文
- 魔兽世界6.2版本宠物对战新内容:塔纳安丛林遍布战斗宠物_每日观点
- 照片和视频拼在一起?快影教你一招|当前热点
- 当前资讯!阿里云服务器怎么开放80端口?操作步骤
- ApachehadoopCloudera分布式存储介绍|世界最资讯
- 智能可穿戴设备 智能可穿戴设备未来会怎样?
- 世界今头条!QQ如何登录?腾讯QQ首次登录QQ保障信息安全
- rmvb怎样转mp4?9.30MBVB转MP4转换器_全球动态
- 全球即时:戴尔笔记本电脑怎么样?戴尔笔记本电脑推荐及价格介绍
- 天天滚动:重装系统常见道ghost 如何恢复分区?
- 微信群怎么设置管理员?设置微信管理员的方法:焦点讯息
- 想让你的二次元老婆动起来吗?试试这个神器吧-世界聚焦
- 【进程隐藏之内核】EPROCESSSS结构体
- 为什么应用需要加固?操作步骤是什么?
- 联想G450摄像头不清楚怎么办?解决办法
- 世界动态:如何一次性删除全部页眉页脚?Word中删除全部页眉页脚的方法
- 【世界新视野】博客积分如何计算?CSDN积分规则
- 天天通讯!【Linux操作系统】系统调用和库函数编程基础知识
- zepto的使用方法 如何在zepto里面增加删除模块?
- 博世壁挂炉怎么样?博世壁挂炉欧洲之星评测
- 什么是单点登录?回顾单系统登录
- 投影仪出租的优势 投影仪出租有哪些注意事项?
- ChatGPT创始人的个性和经历将如何影响它的未来?
- 与哲学僵尸作战
- 即时焦点:天佑武汉 天佑种花家!爬之分析之各省数据入口
- Java程序员面试宝典:100道面试题+答案汇总:全球通讯
- 【MC教程】iPad启动Java版mc 无需越狱:天天新动态
- 【注册码】6.0GA/M1和5.5GA版本的注册信息
- 黑莓手机无法上网怎么办?黑莓手机无法上网解决方案
- 世界快看:《喋血复仇》内容停更 开发商专注于打造新游戏
- 传真机耗材怎么选购?传真机耗材选购窍门
- 【天天热闻】施耐德空气开关怎么样?施耐德空气开关的型号与价格
- 电脑键盘快捷键有哪些?电脑键盘快捷键和组合键功能使用大全
- My97DatePickerBeta日期控件乱码问题解决办法-天天头条
- 死亡计算机官网在线 死亡计算器软件安装教程-世界速看
- 全球微动态丨360隐私保护器是怎么一回事?全面认识下360隐私保护器
- 小米4怎么样?小米4屏幕尺寸以及评测报价
- 《星际争霸Ⅱ》游戏秘籍:游戏中按回车输入以下秘籍|每日播报
- 世界上最大的会计事务所——Pricewaterhouse
- 天天实时:新买的手机怎么充电?充电时接电话会引起爆炸?
- 【进程隐藏之内核】EPROCESSSS结构体
- 世界快看:《喋血复仇》内容停更 开发商专注于打造新游戏
- 与哲学僵尸作战
- ChatGPT创始人的个性和经历将如何影响它的未来?
- 【世界报资讯】魔兽TBC:P3近战门票只有一张,选拔极其严格,副本外就要决胜负
- Windows树大根深 俄罗斯操作系统国产化进展缓慢|今日热文
- 网易神秘密码被玩家解密今天或许有新游戏公布
- 传言:宏碁新显卡使用AMD GPU 每日头条
- 环球微资讯!全能型微单 2400万像素索尼A7M3万元出头
- DirectStorage测试显示PCIe3硬盘的速度基本与PCIe 5相同
- 《火星孤征》现已登陆各平台 上市预告片分享:全球观焦点
- 环球热门:《宝可梦朱紫》BUG多帧率不稳 任天堂道歉
- 印度富豪Adani紧急自救!考虑提前偿债、释放股权质押提振信心,高盛称其债券已触底
- 新年新气象 新一代装机配置怎么选?|天天资讯
- 【当前热闻】每日低价硬货:联想12代酷睿主机套装开工季仅需3093元
- EA砍掉《泰坦陨落》后续游戏 员工自谋出路
- 哈曼中国蝉联“中国杰出雇主2023”称号
- 每日信息:【在线观点】集成灶市场品类优势尽显,2023年必将再创发展高增速
- 天天热头条丨北证50指数表现吸睛 主题基金业绩分化
- 每日头条!玩家抱怨《霍格沃茨之遗》魔法数量太少:老头环有上百种
- 科乐美大幅下调财务预计 预期利润近乎减半-当前快报
- 传闻:任天堂新一期直面会将于下周举行
- Epic喜加一:《罪恶之城》《耻辱:界外魔之死》免费领:全球独家
- “我需要的不是一个丈夫,而是妻子”|世界报道
- 今日报丨昔日16冠豪门今降级?免签5欧冠妖人,但求逆天改命,353场110球