• 暑假给娃买书看?通过爬虫爬取新书评分信息,并通过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更加容易方便一些,对此,你有什么见解呢?你更喜欢哪一种呢?


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

  • 相关阅读:
    New Crack:::CAD .NET 14.1.X
    《CPU设计实战》第四章lab3记录找bug
    虹科分享 | AR眼镜开启工业创新之旅!
    草稿纸-Java项目技术历史
    深度学习-第二章-Window下Yolov5训练打电话
    java基于springboot+vue的园区入驻停车管理系统
    MySQL学习笔记5——函数和索引
    (二十二)大数据实战——Flume数据采集之故障转移案例实战
    代码随想录算法训练营第23期day27|93.复原IP地址、78.子集、90.子集II
    Linux 系统与本地 windows 系统相差30s左右问题解决方案
  • 原文地址:https://blog.csdn.net/sagegrass/article/details/126306720