爬虫识别
python scrape

上一期: 爬虫系列:存储媒体文件,讲解了如果通过爬虫下载媒体文件,以及下载媒体文件相关代码讲解。

本期将讲解如果将数据保存到 CSV 文件。

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号)是存储表格数据常用文件格式。Microsoft Excel 和很多应用都支持 CSV 格式,因为它很简洁。下面是一个 CSV 文件的例子:

code,parentcode,level,name,parentcodes,province,city,district,town,pinyin,jianpin,firstchar,tel,zip,lng,lat
110000,100000,1,北京,110000,北京,,,,Beijing,BJ,B,,,116.405285,39.904989
110100,110000,2,北京市,"110000,110100",北京,北京市,,,Beijing,BJS,B,010,100000,116.405285,39.904989
110101,110100,3,东城区,"110000,110100,110101",北京,北京市,东城区,,Dongcheng,DCQ,D,010,100000,116.418757,39.917544

和 Python 一样, CSV 里留白(whitespace)也是很重要的:每一行都用一个换行符,列与列之间用逗号分隔(因此也叫“逗号分隔值”)。CSV 文件还可以用 Tab 字符或其他字符分隔行,但是不太常见,用得不多。

如果你只想从网页上把 CSV 文件下载到电脑里,不打算做任何修改和解析,那么接下来的内容就不要看了,只用上一篇文章介绍的方法下载并保存 CSV 文件就可以了。

Python 的 CSV 库可以非常简单的修改 CSV 文件,甚至从零开始创建一个 CSV 文件:

import csv
import os
from os import path


class DataSaveToCSV(object):
    @staticmethod
    def save_data():
        get_path = path.join(os.getcwd(), 'files')
        if not path.exists(get_path):
            os.makedirs(get_path)
        csv_file = open(get_path + '\\test.csv', 'w+', newline='')
        try:
            writer = csv.writer(csv_file)
            writer.writerow(('number', 'number plus 2', 'number times 2'))
            for i in range(10):
                writer.writerow((i, i + 2, i * 2))
        finally:
            csv_file.close()


if __name__ == '__main__':
    DataSaveToCSV().save_data()

如果 files 文件夹不存在,新建文件夹。如果文件已经存在,Python 会用新的数据覆盖 test.csv 文件,newline='' 去掉行与行之间得空格。

运行完成之后,你会看到一个 CSV 文件:

number,number plus 2,number times 2
0,2,0
1,3,2
2,4,4
3,5,6
4,6,8
5,7,10
6,8,12
7,9,14
8,10,16
9,11,18

下面一个示例是采集某博客文章,并存储到 CSV 文件中,具体代码如下:

import csv
import os
from os import path

from utils import connection_util
from config import logger_config


class DataSaveToCSV(object):
    def __init__(self):
        self._init_download_dir = 'downloaded'
        self._target_url = 'https://www.scrapingbee.com/blog/'
        self._baseUrl = 'https://www.scrapingbee.com'
        self._init_connection = connection_util.ProcessConnection()
        logging_name = 'write_csv'
        init_logging = logger_config.LoggingConfig()
        self._logging = init_logging.init_logging(logging_name)


    def scrape_data_to_csv(self):
        get_path = path.join(os.getcwd(), 'files')
        if not path.exists(get_path):
            os.makedirs(get_path)
        with open(get_path + '\\article.csv', 'w+', newline='', encoding='utf-8') as csv_file:
            writer = csv.writer(csv_file)
            writer.writerow(('标题', '发布时间', '内容概要'))
            # 连接目标网站,获取内容
            get_content = self._init_connection.init_connection(self._target_url)
            if get_content:
                parent = get_content.findAll("section", {"class": "section-sm"})[0]
                get_row = parent.findAll("div", {"class": "col-lg-12 mb-5 mb-lg-0"})[0]
                get_child_item = get_row.findAll("div", {"class": "col-md-4 mb-4"})
                for item in get_child_item:
                    # 获取标题文字
                    get_title = item.find("a", {"class": "h5 d-block mb-3 post-title"}).get_text()
                    # 获取发布时间
                    get_release_date = item.find("div", {"class": "mb-3 mt-2"}).findAll("span")[1].get_text()
                    # 获取文章描述
                    get_description = item.find("p", {"class": "card-text post-description"}).get_text()
                    writer.writerow((get_title, get_release_date, get_description))
            else:
                self._logging.warning('未获取到文章任何内容,请检查!')


if __name__ == '__main__':
    DataSaveToCSV().scrape_data_to_csv()

代码大部分复用了前几篇文章的内容,这里需要着重说明的是:

    logging_name = 'write_csv'
    init_logging = logger_config.LoggingConfig()
    self._logging = init_logging.init_logging(logging_name)

设置日志名称,并实例化日志,用于后面记录日志。

    with open(get_path + '\\article.csv', 'w+', newline='', encoding='utf-8') as csv_file:

with() 定义了在执行 with 语句时要建立的运行时上下文。with() 允许对普通的 try...except...finally 使用模式进行封装以方便地重用。

newline='' 避免在 CSV 文件中行与行之间空行内容产生。

同时也设置了文件的编码为 utf-8 ,这样做的目的是避免文件含有中文或者其他语言造成乱码。

以上就是关于将采集的内容保存为 csv 文件的内容,本实例的所有代码托管于 github。

github: https://github.com/sycct/Scrape_1_1.git

如果有任何问题,欢迎在 github issue。

返回顶部

深圳SEO优化公司坑梓网页设计松岗网络营销松岗企业网站设计南联seo优化广州建网站坪山seo网站推广民治百度竞价包年推广大鹏设计公司网站南澳关键词按天计费福田网站定制惠州建设网站沙井如何制作网站永湖网站改版罗湖品牌网站设计坪山网站推广工具双龙模板网站建设松岗设计公司网站荷坳百姓网标王龙华企业网站制作横岗网站制作松岗网站优化软件东莞关键词排名包年推广荷坳网站建设双龙设计公司网站龙岗关键词排名包年推广西乡模板推广坂田SEO按天收费永湖网站开发吉祥设计公司网站同乐百搜词包歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化