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

需求分析

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

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

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

实现分析

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

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

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

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

完整代码展示

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

import requests
import re
import csv
from parsel import Selector
from base64 import b64decode

headers = {"user-agent": "Mozilla/5.0"}

url = b64decode("aHR0cHM6Ly9ib29rLmRvdWJhbi5jb20vbGF0ZXN0").decode()

r = requests.get(url, headers=headers)

s = Selector(r.text)
divs = s.xpath("//div[@class='media__body']")


al = list()

for div in divs:
    name = div.xpath(".//a[@class='fleft']/text()").get()
    info = div.xpath(".//p[@class='subject-abstract color-gray']/text()").get()
    info = re.sub("\s", "", info)
    score = div.xpath(".//span[@class='font-small color-red fleft']/text()").get()
    times = div.xpath(".//span[@class='fleft ml8 color-gray']/text()").re_first("\d+")
    al.append([name, info, score, times])

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

新书信息爬取(pandas版)

import requests
import re
import pandas as pd
from parsel import Selector
from base64 import b64decode

headers = {"user-agent": "Mozilla/5.0"}

url = b64decode("aHR0cHM6Ly9ib29rLmRvdWJhbi5jb20vbGF0ZXN0").decode()

r = requests.get(url, headers=headers)

s = Selector(r.text)
divs = s.xpath("//div[@class='media__body']")


al = list()

for div in divs:
    name = div.xpath(".//a[@class='fleft']/text()").get()
    info = div.xpath(".//p[@class='subject-abstract color-gray']/text()").get()
    info = re.sub("\s", "", info)
    score = div.xpath(".//span[@class='font-small color-red fleft']/text()").get()
    times = div.xpath(".//span[@class='fleft ml8 color-gray']/text()").re_first("\d+")
    al.append([name, info, score, times])

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

csv和pandas的to_csv对比

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

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

在pandas中使用to_csv是这样的

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

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值