• 爬取某网站景区列表并保存为csv文件


     

    网址:http://www.halehuo.com/jingqu.html

    经过查看可以发现,该景区页面没有分页,不停的往下拉,页面会进行刷新显示后面的景区信息

    通过使用浏览器调试器,发现该网站使用的是post请求,使用ajax传输数据

     

    请求参数:

     

    响应数据:

     

    经过以上分析,大致思路如下:

    (1)向请求网站使用post方式传递参数,先传递首页参数,获得json数据,然后进行数据提取,获取所需要的数据

    (2)使用for循环遍历获取数据

    需要注意的地方:

    (1)景区logo图片获取的是相对地址,通过构造一个函数获得景区logo的绝对地址

    (2)获取到的景区详情链接打不开,通过景区列表页面打开景区详情页面,发现获取的景区详情链接跟景区详情页面链接不匹配再构造一个函数处理获取到的景区详情链接

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import csv
    import json
    from urllib.parse import urlencode
    
    import requests
    
    # 构造参数,发起请求,获得数据
    def get_page_index(pageindex):
        data = {
            'citycode': 0,
            'countycode': 0,
            'keywords': 0,
            'pageindex': pageindex,
            'sceniclev': 0,
            'themetype': 0,
        }
        params = urlencode(data)
        base = 'http://www.halehuo.com/index.php/Scenic/getScenicList'
        url = base + '?' + params
        try:
            response = requests.get(url)
            if response.status_code == 200:
                return response.text
            return None
        except ConnectionError:
            print('Error occurred')
            return None
    
    # 处理景区logo地址
    def get_log_url(url):
        base_url = 'http://www.halehuo.com'
        return base_url + url
    
    # 处理景区详情链接
    def get_detail_url(url):
        return url.replace('index.php/Scenic/main/id', 'jingqu')
    
    # 解析获得的景区数据
    def parse_page_index(pageindex):
        item = get_page_index(pageindex)
        items = json.loads(item)['data']
        for item in items:
            yield {
                'id': item['id'],
                'scenic_name': item['scenic_name'],
                'logo': get_log_url(item['logo']),
                'address': item['address'],
                'policy': item['policy'],
                'url': get_detail_url(item['url']),
                'remarks': item['remarks']
            }
    
    
    # 数据存储到csv
    def write_to_file3(item):
        with open('jingqu_detail.csv', 'a', encoding='utf_8_sig', newline='') as f:
            # 'a'为追加模式(添加)
            # utf_8_sig格式导出csv不乱码
            fieldnames = ['id', 'scenic_name', 'logo', 'address', 'policy', 'url', 'remarks']
            w = csv.DictWriter(f, fieldnames=fieldnames)
            # w.writeheader()
            # print(item)
            w.writerow(item)
    
    
    def main():
        for i in range(1, 13):
            items = parse_page_index(i)
            for item in items:
                write_to_file3(item)
    
    if __name__ == '__main__':
        main()

    保存到csv文件的截图如下:

  • 相关阅读:
    Android开发--去掉标题栏
    Android开发app如何设定应用图标下的应用名称为汉字以及自定义图标
    mysql的sql其他 SQL中inner join、outer join和cross join的区别
    中文乱码问题 -js页面传值乱码
    liunx Centos Xshell 简单命令汇总
    html 属性及相关应用-实例
    时间格式转换
    三元表达式
    Grid++Report生成简单的条形码、Excel导出、图表控件 等
    jmp指令的简单应用
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/10249582.html
Copyright © 2020-2023  润新知