ip提取网站源码带后台-100行代码爬取全国所有必胜客餐厅信息

点击上方“极客猴”ip提取网站源码带后台,选择“热门公众号”

尽快获取Python技术资料!

标题图片:jinovich 来自 Instagram

阅读全文大约需要 10 分钟。

当我第一次接触Python时,我就已经被Python深深吸引了。 Python吸引我的不仅在于它能够编写网络爬虫,还在于它在数据分析方面的用途。 我可以以图形方式呈现大量数据并更直观地解释数据。

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

今天我就爬取全国所有必胜客餐厅信息,进行后续的数据分析。

01

获取目标

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

我们要爬取的数据包括城市、餐厅名称、餐厅地址、餐厅联系电话。 因为我在页面上看到了地图,所以页面上一定有餐厅地址的经纬度。 因此,餐厅的经纬度也是我们需要爬取的数据。

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

02

分析页面

在写爬虫程序之前,我首先对页面进行简单的分析,然后明确爬虫的思路。 而分析页面结构往往会带来一些意想不到的收获。

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

我们可以在StoreList页面找到我们需要的数据。 这决定了数据提取的 Xpath 语法。

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

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

从代码中我们可以了解到该页面使用Ajax来获取数据。 页面以POST方式请求地址。 同时请求中还携带参数pageIndex和pageSize。

03

抓取想法

经过一些页面结构的分析,我们明确了抓取的思路。 首先,我们获取城市信息。 然后以它为参数构造HTTP请求访问必胜客服务器,获取当前城市的所有餐厅数据。

为了方便数据爬取,我将所有城市都写入了city.txt。 当我们要爬取数据时,我们会从文件中读取城市信息。

爬行的思路看上去是正确的,但是还有一个问题没有解决。 每次我们打开必胜客官方网站时,页面每次都会自动定位到我们所在的城市。 如果城市定位问题解决不了,我们就只能抓取一个城市的数据。

于是,我们又浏览了一下主页,看看是否能找到一些有用的信息。 最后我们发现页面的cookies中有一个iplocation字段。 我对URL进行了解码,得到了像Shenzhen|0|0这样的信息。

看到这个信息后,我恍然大悟。 原来,必胜客网站根据我们的IP地址设置了初始城市信息。 如果我们能够伪造iplocation字段信息ip提取网站源码带后台,我们就可以随意修改城市。

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)

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

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

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

def get_stores(city, count):
    """ 根据城市获取餐厅信息 """
    session = requests.Session()
    # 对【城市|0|0】进行 Url 编码
    city_urlencode = quote(city + '|0|0')
    # 用来存储首页的 cookies
    cookies = 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 = 1
    restaurants = []

    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:
            break
        restaurants += temp_items
        page += 1
        time.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”的文件。

完整代码我已经上传到后台了,需要的同学可以在后台回复“必胜客”获取。

如果您觉得文章不错,请点赞和分享。 您的肯定是对我最大的鼓励和支持。