设为首页 - 加入收藏 阜新站长网 (http://www.0418zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 电商 Note 深度 APP
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

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

发布时间:2018-12-01 16:03 所属栏目:[教程] 来源:极客猴
导读:当我刚接触 Python 时,我已经被 Python 深深所吸引。Python 吸引我的地方不仅仅能用其编写网络爬虫,而且能用于数据分析。我能将大量的数据中以图形化方式呈现出来,更加直观的解读数据。 数据分析的前提是有数据可分析。如果没有数据怎么办?一是可以去一

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

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

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

01抓取目标

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

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

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

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

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

02分析目页面

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

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

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

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

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

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

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

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

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

03爬取思路

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

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

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

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

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

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

04代码实现

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

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

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

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

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章