阅读文本大概需要 10 分钟。

当我刚接触 Python 时,我已经被 Python 深深所吸引。Python 吸引我的地方不仅仅能用其编写网络爬虫,而且能用于数据分析。我能将大量的数据中以图形化方式呈现出来,更加直观的解读数据。

数据分析的前提是有数据可分析。如果没有数据怎么办?一是可以去一些数据网站下载相关的数据,不过数据内容可能不是自己想要的。二是自己爬取一些网站数据。

今天,我就爬取全国各地所有的必胜客餐厅信息,以便后续做数据分析。

01 抓取目标

我们要爬取的目标是必胜客中国。打开必胜客中国首页,进入“餐厅查询”页面。

我们要爬取的数据内容有城市、餐厅名字、餐厅地址以及餐厅联系电话。因为我看到页面中有地图,所以页面一定有餐厅地址的经纬度。因此,餐厅的经纬度也是我们需要爬取的数据。

至于全国有必胜客餐厅的城市列表,我们可以通过页面的“切换城市”获取。

02 分析目页面

在编写爬虫程序之前,我都是先对页面进行简单分析,然后指定爬取思路。而且对页面结构进行分析往往会有一些意想不到的收获。

我们使用浏览器的开发者工具对页面结构进行简单分析。

我们在 StoreList 页面中能找到我们所需的数据。这个能确定数据提取的 Xpath 语法。

StoreList 页面的 Response 内容比较长。我们先不着急关闭页面,往下看看,找找看是否有其他可利用的内容。最后,我们找到调用获取餐厅列表信息的 JavaScript 函数代码。

我们接着搜索下GetStoreList函数,看看浏览器如何获取餐厅列表信息的。

从代码中,我们可以了解到页面使用 Ajax 方式来获取数据。页面以 POST 方式请求地址http://www.pizzahut.com.cn/StoreList/Index。同时,请求还携带参数 pageIndex 和 pageSize

03 爬取思路

经过一番页面结构分析之后,我们指定爬取思路。首先,我们先获取城市信息。然后将其作为参数,构建 HTTP 请求访问必胜客服务器来获取当前城市中所有餐厅数据。

为了方便数据爬取,我将所有城市全部写入到 cities.txt 中。等要爬取数据时,我们再从文件中读取城市信息。

爬取思路看起来没有错,但是还是有个难题没有搞定。我们每次打开必胜客的官网,页面每次都会自动定位到我们所在的城市。如果无法破解城市定位问题,我们只能抓取一个城市数据。

于是乎,我们再次浏览首页,看看能不能找到一些可用的信息。最终,我们发现页面的 cookies 中有个 iplocation 字段。我将其进行 Url 解码,得到 深圳|0|0 这样的信息。

看到这信息,我恍然大悟。原来必胜客网站根据我们的 IP 地址来设置初始城市信息。如果我们能伪造出 iplocation 字段信息,那就可以随便修改城市了。

04 代码实现

第一步是从文件中读取城市信息。

# 全国有必胜客餐厅的城市, 我将城市放到文件中, 一共 380 个城市
cities = []def get_cities():""" 从文件中获取城市 """  file_name = 'cities.txt'with open(file_name, 'r', encoding='UTF-8-sig') as file:for line in file:city = line.replace('\n', '')cities.append(city)

第二步是依次遍历 cities 列表,将每个城市作为参数,构造 Cookies 的 iplocation 字段。

# 依次遍历所有城市的餐厅
for city in cities:restaurants = get_stores(city, count)results[city] = restaurantscount += 1time.sleep(2)

然后,我们再以 POST 方式携带 Cookie 去请求必胜客服务器。最后再对返回页面数据进行提取。

def get_stores(city, count):""" 根据城市获取餐厅信息 """session = requests.Session()# 对【城市|0|0】进行 Url 编码city_urlencode = quote(city + '|0|0')# 用来存储首页的 cookiescookies = requests.cookies.RequestsCookieJar()headers = {'User-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.3964.2 Safari/537.36','accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Host': 'www.pizzahut.com.cn','Cache-Control': 'max-age=0','Connection': 'keep-alive',}print('============第', count, '个城市:', city, '============')resp_from_index = session.get('http://www.pizzahut.com.cn/', headers=headers)# print(resp_from_index.cookies)# 然后将原来 cookies 的 iplocation 字段,设置自己想要抓取城市。cookies.set('AlteonP', resp_from_index.cookies['AlteonP'], domain='www.pizzahut.com.cn')cookies.set('iplocation', city_urlencode, domain='www.pizzahut.com.cn')# print(cookies)page = 1restaurants = []while True:data = {'pageIndex': page,'pageSize': "50",}response = session.post('http://www.pizzahut.com.cn/StoreList/Index', headers=headers, data=data, cookies=cookies)html = etree.HTML(response.text)# 获取餐厅列表所在的 div 标签divs = html.xpath("//div[@class='re_RNew']")temp_items = []for div in divs:item = {}content = div.xpath('./@onclick')[0]# ClickStore('22.538912,114.09803|城市广场|深南中路中信城市广场二楼|0755-25942012','GZH519')# 过滤掉括号和后面的内容content = content.split('(\'')[1].split(')')[0].split('\',\'')[0]if len(content.split('|')) == 4:item['coordinate'] = content.split('|')[0]item['restaurant_name'] = content.split('|')[1] + '餐厅'item['address'] = content.split('|')[2]item['phone'] = content.split('|')[3]else:item['restaurant_name'] = content.split('|')[0] + '餐厅'item['address'] = content.split('|')[1]item['phone'] = content.split('|')[2]print(item)temp_items.append(item)if not temp_items:breakrestaurants += temp_itemspage += 1time.sleep(5)return restaurants

第三步是将城市以及城市所有餐厅信息等数据写到 Json 文件中。

with open('results.json', 'w', encoding='UTF-8') as file:file.write(json.dumps(results, indent=4, ensure_ascii=False))

05 爬取结果

程序运行完之后, 就会在当前目录下生成一个名为「results.json」文件。

源码地址: https://github.com/monkey-soft/SchweizerMesser/tree/master/Pizzahut

100 行代码爬取全国所有必胜客餐厅信息相关推荐

  1. 100行代码爬取全国所有必胜客餐厅信息

    点击上方"极客猴",选择"置顶公众号" 第一时间获取Python技术干货! 题图: by jinovich from Instagram 阅读文本大概需要 10 ...

  2. 爬取全国所有必胜客餐厅信息

    本文转载自:http://gkhelp.cn/1206.html 当我刚接触 Python 时,我已经被 Python 深深所吸引.Python 吸引我的地方不仅仅能用其编写网络爬虫,而且能用于数据分 ...

  3. 10行代码爬取全国所有A股/港股/新三板上市公司信息

    参加 2018 AI开发者大会,请点击 ↑↑↑ 作者 | 高级农民工 本文已获原作者授权,如需转载,请联系原作者. 摘要: 我们平常在浏览网页中会遇到一些表格型的数据信息,除了表格本身体现的内容以外, ...

  4. 爬虫 | 百行代码爬取14.5W条豆瓣图书信息

    前言 先上一波爬取的结果: 数据库中部分截图 实战 引入类库 import requests from bs4 import BeautifulSoup from requests.exception ...

  5. python爬上市公司信息_实战项目 1:5 行代码爬取国内所有上市公司信息

    实战项目 1:5 行代码爬取国内所有上市公司信息 Python入门爬虫与数据分析 在正式开始这门专栏课的学习之前,我们先来看一个简单的爬虫案例.兴趣是最好的老师,当你对爬虫产生兴趣的时候,才会更有动力 ...

  6. pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...

    爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...

  7. Python爬虫利用18行代码爬取虎牙上百张小姐姐图片

    Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...

  8. 简单20行代码爬取王者荣耀官网1080p壁纸

    简单20行代码爬取王者荣耀官网1080p壁纸 # -*- coding: utf-8 -*- # @Time : 2020/12/13 18:08 # @Author : ningfangcong i ...

  9. Python25行代码爬取豆瓣排行榜数据

    Python25行代码爬取豆瓣排行榜数据 只需要用到requests, re ,csv 三个库即可. code import re import requests import csv url = ' ...

最新文章

  1. PYTHON -MYSQLDB安装遇到的问题和解决办法
  2. python乘法表左下变右上_vc++乘法表变换形式怎么变就是变成左上、右上三角形 左下、右下、等腰三角形 还有倒三角形,...
  3. 云钉一体应用创新:音视频如何带来灵活高效的协同体验
  4. Windows网络接口API函数
  5. Linux select函数用法和原理
  6. Win7系统电脑修改不了文件属性怎么办
  7. 《计算机应用基础》模拟试卷三,2015年《计算机应用基础》模拟试题及答案(一)...
  8. Flutter中为图片设置波纹点击效果
  9. 微软实习期的我,纠正了一位高级开发人员的错误......
  10. C++数字与字符串的相互转换
  11. 计算机地图制图的点状符号制作,计算机地图制图验手册汇编.doc
  12. [礼仪大赛/模特比赛策划方案]现场场景描述
  13. 190328每日一句 When you forgive, you release.
  14. 东芝打印机共享怎么设置_东芝e-studio181打印机怎么设置网络打印机
  15. 道路智慧路灯:山西省长治市道路智慧灯杆(多功能交通一体式综合杆)项目案例分享
  16. ArcGIS三维资源收集帖
  17. Hadoop2.x HA
  18. 江阴长泾/江阴各乡镇到无锡汽车客运站/无锡东站/硕放机场站快捷班车的购票方法
  19. matlab正负序分离模块,一种自适应宽频带正负序分离方法与流程
  20. JavaScript 数组之every

热门文章

  1. Apache Log4j 笔记
  2. html5编写一个手机app的首页
  3. windows bat (批处理)——IF详解
  4. 检验内存泄漏memwatch的使用
  5. Android通过AudioRecord录制系统内置声音
  6. 听六小桨讲AI | 第3期:优化器及其三种形式BGD、SGD以及MBGD
  7. 微机原理和计算机组成原理一样吗_计算机/软工408考研---组成原理+OS重难点
  8. 笔记:将字符串转换成数组的方法
  9. 用户变量tmp修改了怎么恢复_【热点】安卓手机用户微信可以修改账号啦!如何修改微信号?怎么修改微信号?附图教程...
  10. unity简单的背包系统笔记(有视频讲解)