热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python爬虫系列之美团全站信息爬取实战

Python爬虫系列之美团全站信息爬取实战该实战有时间我会持续更新,因为近期比较忙,只写了一个类目下的抓取流程,其他类目我后期会慢慢补上声明:仅供用于学习交流,不可用于恶意操作》》
Python爬虫系列之美团全站信息爬取实战

该实战有时间我会持续更新,因为近期比较忙,只写了一个类目下的抓取流程,其他类目我后期会慢慢补上

声明:仅供用于学习交流,不可用于恶意操作

》》》》》》爬虫接单,点击这里联系我们《《《《《《

直接上代码,详情请看注释

import requests
from bs4 import BeautifulSoup
import re
import json
import time
'''
@Author :王磊
@Time :2018/12/31
@Description:美团站点所有有效信息抓取(待完善)
'''
class MeiTuanSpider:
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0",
"COOKIE": "_lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; _lxsdk_cuid=167ffca928ec8-0e654d87ed4011-4d045769-100200-167ffca928ec8; __mta=210679722.1546184730073.1546184730073.1546184730073.1; _lxsdk=167ffca928ec8-0e654d87ed4011-4d045769-100200-167ffca928ec8; _ga=GA1.2.268215992.1546188830; _gid=GA1.2.2085490335.1546188830; mtcdn=K; lsu=; token2=k5KFzZOmjNtI4RXwSn-MBwHYS_QF#AqgcAAM17q21drlYFsEkrWY8nBciWgigr_vFCL5FDakc3B15Z318X6W3X_Dkc15OrK0yCPQ; u=646978641; n=XwR964951585; lt=k5KFzZOmjNtI4RXwSn-MBwHYS_QF#AqgcAAM17q21drlYFsEkrWY8nBciWgigr_vFCL5FDakc3B15Z318X6W3X_Dkc15OrK0yCPQ; ci=146; rvct=146%2C224%2C527%2C1114%2C1268%2C758%2C835%2C811%2C729%2C113%2C402; unc=XwR964951585; uuid=d927d5e7a70f4031900e.1546184723.2.0.0; client-id=03aeb51b-56e7-4809-b3a0-1fd44f5b4ea4; lat=40.74812; lng=107.400892; _lxsdk_s=16803187a83-b3c-b35-5ba%7C%7C171",
# "Referer": "https://as.meituan.com/",
"Upgrade-Insecure-Requests": "1"
}
self.start_url = "https://www.meituan.com/changecity/"
def getHTML(self, url):
'''
get方式请求url
:param url: 请求url
:return: str
'''
resp = requests.get(url, headers=self.headers)
return resp.content.decode(resp.apparent_encoding)
def getCityList(self, html):
'''
获取全国城市的美团主页地址列表
:param html: 城市选择页面html
:return: list
'''
soup = BeautifulSoup(html, 'html.parser')
spans = soup.findAll("span", attrs={"class": "cities"})
citys = []
for i in range(len(spans)):
a = spans[i].findAll("a", attrs={"class": re.compile("link.*?city.*?")})
for j in range(len(a)):
url = "https:" + a[j]['href']
city_name = a[j].text
citys.append({"city_name": city_name, "url": url})
return citys
def getMoreList(self, html):
'''
获取城市主页的分类信息地址
:param html: 主页html
:return: list
'''
soup = BeautifulSoup(html, 'html.parser')
a = soup.findAll("a", attrs={"class": re.compile("link.*?detail-more.*?")})
moreList = []
for i in range(len(a)):
url = a[i]['href']
type_name = re.findall(r'"title":"(.*?)"', str(a[i]))[0]
moreList.append({"type_name": type_name, "url": url})
return moreList
def meiShiParser(self, html):
'''
解析美食类目下所有店铺的店铺信息以及店铺类目下的所有商品信息,店铺评价信息等等
:param html: 店铺页面html
:return: None
'''
req = re.compile(r'{"itemId":"(.*?)"', re.S)
itemsIds = re.findall(req, html)
preURL = "https://www.meituan.com/meishi/"
for i in range(len(itemsIds)):
url = preURL + itemsIds[i] + "/"
detailHTML = self.getHTML(url)
shopDirtyInfo = re.findall(r'detailInfo":(.*?),"crumbNav', detailHTML)[0]
# 店铺信息
shopId, shopName = re.findall(r'"poiId":(.*?),"name":"(.*?)"', shopDirtyInfo)[0]
avgScore = re.findall(r'"avgScore": (.*?)', shopDirtyInfo)
address = re.findall(r'"address":"(.*?)"', shopDirtyInfo)
phone = re.findall(r'"phone":"(.*?)"', shopDirtyInfo)
# 店铺提供设施服务
extraInfos = re.findall(r'"text":"(.*?)"', shopDirtyInfo)
req_good = re.compile(r'recommended":(.*?)]', re.S)
# 商品列表
goods = re.findall(req_good, shopDirtyInfo)[0]
req_goodList = re.compile(r'{"id":"(.*?)","name":"(.*?)","price":(.*?),"frontImgUrl":"(.*?)"}', re.S)
goodsList = re.findall(req_goodList, goods)
# 用户评价
evaluateURL = "http://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=d927d5e7a70f4031900e.1546184723.2.0.0&platform=1&partner=126&originUrl=" + url + "&riskLevel=1&optimusCode=1&id=" + str(itemsIds[i]) + "&userId=646978641&offset=0&pageSize=10&sortType=1"
totalPages = int(json.loads(self.getHTML(evaluateURL))['data']['total'])
evaluateList = []
for k in range(totalPages):
offset = k * 10
evaluateURL = "http://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=d927d5e7a70f4031900e.1546184723.2.0.0&platform=1&partner=126&originUrl=" + url + "&riskLevel=1&optimusCode=1&id=" + str(itemsIds[i]) + "&userId=646978641&offset=" + str(offset) + "&pageSize=10&sortType=1"
evaluateList.extend(json.loads(self.getHTML(evaluateURL))['data']['comments'])
# 数据量太大,此处做测试打印
print(evaluateList)
time.sleep(5)
for j in range(len(goodsList)):
good_id = goodsList[j][0]
good_name = goodsList[j][1]
good_price = goodsList[j][2]
good_img = goodsList[j][3]
print("shopId: %s,shopName: %s, avgScore: %s, address: %s, phone: %s, extraInfos: %s, good_id: %s, good_name: %s, good_price: %s, good_img: %s" %
(shopId, shopName, avgScore, address, phone, extraInfos, good_id, good_name, good_price, good_img)
)
print(evaluateList)
time.sleep(10)
def spider(self):
'''
数据分析
:return: None
'''
html = self.getHTML(self.start_url)
cityList = self.getCityList(html)
type_detail = []
# 每一个城市为单位
for i in range(len(cityList)):
cityIndexHtml = self.getHTML(cityList[i]['url'])
moreList = self.getMoreList(cityIndexHtml)
# 每一个城市下每一个类目为单位
for j in range(len(moreList)):
moreType = moreList[j]['type_name']
moreURL = moreList[j]['url']
#############################
# 爬取数据量较大,此处做测试步骤#
#############测试块开始############
print(moreURL)
aimHTML = self.getHTML(moreURL)
self.meiShiParser(aimHTML)
exit(0)
#############测试块结束############
type_detail.append({"city_name": cityList[i]['city_name'], "type_name": moreType, "type_url": moreURL})
time.sleep(5)
for k in range(len(type_detail)):
city_name = type_detail[k]['city_name']
type_name = type_detail[k]['type_name']
type_url = type_detail[k]['type_url']
aimHTML = self.getHTML(type_url)
if type_name == '美食':
self.meiShiParser(aimHTML)
elif type_name == '外卖':
pass
elif type_name == '酒店星级':
pass
elif type_name == '热门城市':
pass
elif type_name == '火车票':
pass
elif type_name == '休闲娱乐':
pass
elif type_name == '生活服务':
pass
elif type_name == '丽人':
pass
elif type_name == '结婚':
pass
elif type_name == '儿童乐园':
pass
elif type_name == '幼儿教育':
pass
elif type_name == '亲子摄影':
pass
elif type_name == '孕产护理':
pass
elif type_name == '运动健身':
pass
elif type_name == '装修设计':
pass
elif type_name == '装修建材':
pass
elif type_name == '家具家居':
pass
elif type_name == '家装卖场':
pass
elif type_name == '音乐培训':
pass
elif type_name == '职业技术':
pass
elif type_name == '外语培训':
pass
elif type_name == '美术培训':
pass
elif type_name == '医疗健康':
pass
elif type_name == '爱车':
pass
elif type_name == '宠物':
pass
elif type_name == '玩乐':
pass
if __name__ == '__main__':
mt = MeiTuanSpider()
mt.spider()

推荐阅读
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在今天的实践中,我深入学习了网页图像抓取技术,通过编写爬虫程序批量获取网站上的图片资源。具体来说,我选择了一个包含大量高质量图片的网站作为练习对象,并成功实现了将这些图片批量下载到本地存储。这一过程不仅提升了我对爬虫技术的理解,还增强了我的编程能力。 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • Android Studio 安装指南:详细步骤与常见问题解答
    Android Studio 安装指南:详细步骤与常见问题解答 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 在第10天的夜灵HTML日志中,我们深入探讨了浏览器兼容性和高级选择器的应用。CSS3引入了许多新属性,但在旧版浏览器中的支持情况并不理想。然而,目前主流浏览器的最新版本已全面支持这些新特性。对于那些不支持CSS3新属性的浏览器,我们提供了多种解决方案,以确保网站在不同环境下的兼容性和用户体验。此外,我们还详细讨论了如何利用高级选择器提升页面布局的灵活性和可维护性。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 通过 NuGet 获取最新版本的 Rafy 框架及其详细文档
    为了帮助开发者更便捷地使用Rafy领域实体框架,我们已将最新版的Rafy框架程序集上传至nuget.org,并同步发布了最新版本的Rafy SDK至Visual Studio。此外,我们还提供了详尽的文档和示例,以确保开发者能够快速上手并充分利用该框架的强大功能。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 软件测试工程师必备:全面解析Web应用的浏览器兼容性测试方法与工具
    随着市场上浏览器种类的不断增多,特别是在平板和移动设备上的普及,确保网站在各种浏览器中都能正常运行变得尤为重要。本文将深入探讨Web应用的浏览器兼容性测试方法与工具,帮助软件测试工程师全面掌握这一关键技能,以提高应用的用户体验和可靠性。 ... [详细]
author-avatar
零乱772_553
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有