现在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文件的保存,来对比一下它们到底有什么不同,哪一种你更喜欢呢?
- 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)
- 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中是这样的
- 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更加容易方便一些,对此,你有什么见解呢?你更喜欢哪一种呢?
非常感谢给我提供建议的这位小伙伴啊,当然,如果你在阅读文章的时候有什么更好的意见和想法,也欢迎随时给我留言评论,我们可以一起探讨!