• 暑假给娃买书看?通过爬虫爬取新书评分信息,并通过pandas存入csv文件


    需求分析

    现在8月份已经过了小一半了,暑假也过了有一半了。听说勤劳的学生现在已经写完暑假作业了。当然,对于学生的家长来说,孩子写完作业了要干什么呢,也是成为了一个比较困扰的问题

    这不,有一个家长就在为孩子写完了作业而发愁:他希望能够买一些好的书给孩子在剩余的暑假期间阅读,但是呢,由于自己平时不怎么看书,也不知道什么书比较好,适合阅读,因此希望能够通过爬虫爬取新书的评分信息,以此来为他买书提供一些参考

    当然了,这没什么难的,本次我也决定将爬取到的信息保存为csv文件。这是因为csv可以像excel那样,通过表格的形式直接打开,阅读起来非常的方便

    实现分析

    在上一次七夕节的文章中,我已经使用过了csv的保存,详情可以查看爬取电影评分存入csv文件,不过呢,那次我使用的是python中内置的csv模块进行的写入

    1. import csv
    2. with open("douban.csv", "w", newline="") as csvfile:
    3. w = csv.writer(csvfile, delimiter=",")
    4. w.writerow(["c1", "c2", "c3", "c4"])
    5. for row in xxx:
    6. w.writerow([row["c1"], row["c2"], row["c3"], row["c4"]])

    当然呢,在上次七夕节的文章之后,我也收到了一些反馈意见,比如有小伙伴告诉我说,现在他们已经很少使用内置的csv格式了,现在一般都直接通过pandas中的to_csv完成写入。因为pandas进行数据处理非常方便,顺便进行保存也很容易。所以说,像这种csv的格式的数据,一般都是直接保存到pandas中的,然后再通过pandas直接完成写入。而且小伙伴建议我说,我也可以试一试

    我觉得,这个提议非常的不错。这次,我就同时通过这两种方式完成csv文件的保存,来对比一下它们到底有什么不同,哪一种你更喜欢呢?

    完整代码展示

    新书信息爬取(内置csv版)

    1. import requests
    2. import re
    3. import csv
    4. from parsel import Selector
    5. from base64 import b64decode
    6. headers = {"user-agent": "Mozilla/5.0"}
    7. url = b64decode("aHR0cHM6Ly9ib29rLmRvdWJhbi5jb20vbGF0ZXN0").decode()
    8. r = requests.get(url, headers=headers)
    9. s = Selector(r.text)
    10. divs = s.xpath("//div[@class='media__body']")
    11. al = list()
    12. for div in divs:
    13. name = div.xpath(".//a[@class='fleft']/text()").get()
    14. info = div.xpath(".//p[@class='subject-abstract color-gray']/text()").get()
    15. info = re.sub("\s", "", info)
    16. score = div.xpath(".//span[@class='font-small color-red fleft']/text()").get()
    17. times = div.xpath(".//span[@class='fleft ml8 color-gray']/text()").re_first("\d+")
    18. al.append([name, info, score, times])
    19. with open("dushu.csv", "w", newline="") as csvfile:
    20. csv_writer = csv.writer(csvfile, delimiter=",")
    21. csv_writer.writerow(["书名", "简介", "分数", "评价次数"])
    22. for i in al:
    23. csv_writer.writerow(i)

    新书信息爬取(pandas版)

    1. import requests
    2. import re
    3. import pandas as pd
    4. from parsel import Selector
    5. from base64 import b64decode
    6. headers = {"user-agent": "Mozilla/5.0"}
    7. url = b64decode("aHR0cHM6Ly9ib29rLmRvdWJhbi5jb20vbGF0ZXN0").decode()
    8. r = requests.get(url, headers=headers)
    9. s = Selector(r.text)
    10. divs = s.xpath("//div[@class='media__body']")
    11. al = list()
    12. for div in divs:
    13. name = div.xpath(".//a[@class='fleft']/text()").get()
    14. info = div.xpath(".//p[@class='subject-abstract color-gray']/text()").get()
    15. info = re.sub("\s", "", info)
    16. score = div.xpath(".//span[@class='font-small color-red fleft']/text()").get()
    17. times = div.xpath(".//span[@class='fleft ml8 color-gray']/text()").re_first("\d+")
    18. al.append([name, info, score, times])
    19. df = pd.DataFrame(al, columns=["书名", "简介", "分数", "评价次数"])
    20. df.to_csv("dushu2.csv", sep=",", mode="w", index=False)

    csv和pandas的to_csv对比

    如果将两种使用方式中主要的代码部分取出来的话,在csv中是这样的

    1. with open("dushu.csv", "w", newline="") as csvfile:
    2. csv_writer = csv.writer(csvfile, delimiter=",")
    3. csv_writer.writerow(["书名", "简介", "分数", "评价次数"])
    4. for i in al:
    5. csv_writer.writerow(i)

    在pandas中使用to_csv是这样的

    1. df = pd.DataFrame(al, columns=["书名", "简介", "分数", "评价次数"])
    2. df.to_csv("dushu2.csv", sep=",", mode="w", index=False)

    由此看来的话,似乎确实是使用to_csv更加容易方便一些,对此,你有什么见解呢?你更喜欢哪一种呢?


    非常感谢给我提供建议的这位小伙伴啊,当然,如果你在阅读文章的时候有什么更好的意见和想法,也欢迎随时给我留言评论,我们可以一起探讨!

  • 相关阅读:
    CIO们开始将软件供应链升级为安全优先级top
    k8s 集群使用 haproxy+keepalived+nginx 实现k8s集群负载均衡
    一文读懂官方给出torch.nn.RNN API的参数及手写RNN API复现
    【C++天梯计划】1.6 动态规划(DP dynamic programming)
    【JavaWeb】虚拟路径和虚拟主机
    重构学习(四):代码的坏味道
    Linux基础学习——用户和组
    Windows操作系统进阶:AD域
    Keras中model.evaluate() 返回的是 loss value 和 metrics values
    便携一体机设计资料机构图:定制化仪器户外便携式手提触摸一体机
  • 原文地址:https://blog.csdn.net/sagegrass/article/details/126306720