数据储存
主要介绍两种数据储存方法:
- 储存在文件中,包括text文件和csv文件
- 存储在数据库中,包括MySQL关系型数据库和mongoDB数据库
存储到txt
| title = "第一个文本" |
| |
| |
| |
| with open(r'C:\Users\K1567\Desktop\title.txt', "a+") as f: |
| f.write(title) |
| f.close() |
| |
| output = '\t'.join(['name', 'title', 'age', 'gender']) |
| with open(r'C:\Users\K1567\Desktop\title.txt', "a+") as f: |
| f.write(output) |
| f.close() |
| |
| output = '\t'.join(['name', 'title', 'age', 'gender']) |
| |
| with open(r'C:\Users\K1567\Desktop\title.txt', "r") as f: |
| resulf = f.read() |
| print(resulf) |
存储到csv
| |
| with open(r'C:\Users\K1567\Desktop\test.csv', 'r', encoding='UTF-8') as csvfile: |
| csv_reader = csv.reader(csvfile) |
| for row in csv_reader: |
| print(row) |
| print(row[0]) |
| |
| output_list = ['1', '2', '3', '4'] |
| with open(r'C:\Users\K1567\Desktop\test2.csv', 'a+', encoding='UTF-8', newline='') as csvfile: |
| w = csv.writer(csvfile) |
| w.writerow(output_list) |
存储至MySQL数据库
安装MySQL数据库
具体步骤另外搜一搜就好了,有两种安装方式,一种是在线安装,一种离线安装。在线安装的这个比较麻烦没有成功过,本人用的离线安装的。
1.在线的参考一下这个:https://blog.csdn.net/theLostLamb/article/details/78797643
离线安装:
1.先下载好压缩包:zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录。点击底部“No thanks, just start my download.”即可开始下载。
2.安装: 解压zip包到安装目录---配置初始化的my.ini文件
点击查看代码
| [mysqld] |
| |
| |
| |
| port=3306 |
| |
| |
| |
| basedir=E:\DownLoad\mysql\mysql-8.0.27-winx64 |
| |
| |
| |
| datadir=E:\DownLoad\mysql\mysql-8.0.27-winx64\data |
| |
| |
| |
| max_connections=200 |
| |
| |
| |
| max_connect_errors=10 |
| |
| |
| |
| character-set-server=utf8 |
| |
| |
| |
| default-storage-engine=INNODB |
| |
| |
| |
| default_authentication_plugin=mysql_native_password |
| |
| [mysql] |
| |
| |
| |
| default-character-set=utf8 |
注意:其中的data目录不需要创建,下一步初始化工作中会自动创建。
3.cmd进入bin文件夹
通过管理员权限进入cmd(如果不是管理员权限就会出现问题),进入MySQL安装目录的bin目录下

4.初始化数据库:mysqld --initialize --console
执行完成后,会打印 root 用户的初始默认密码

要是你手贱,关快了,或者没记住,那也没事,删掉初始化的 datadir 目录,再执行一遍初始化命令,又会重新生成的。
5.安装服务:mysqld --install [服务名] 后面的服务名可以不写,默认的名字为 mysql。当然,如果你的电脑上需要安装多个MySQL服务,就可以用不同的名字区分了,比如 mysql5 和 mysql8。安装完成之后,就可以通过命令net start mysql启动MySQL的服务了。通过命令net stop mysql停止服务。通过命令sc delete MySQL/mysqld -remove卸载 MySQL 服务
6.更改密码:mysql -u root -p
这时候会提示输入密码,记住了上面第3.1步安装时的密码,填入即可登录成功,进入MySQL命令模式。
在MySQL中执行命令:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
可以用 命令查看一下默认安装的数据库:
show databases;
use mysql;
show tables;
创建数据库
| |
| CREATE DATABASE scraping |
| |
| USE scraping |
| |
| CREATE TABLE urls(id int not null auto_increment, |
| url varchar(1000) not null, |
| content varchar(4000) not null, |
| created_time timestamp default current_timestamp, |
| primary key (id) |
| ) |
连接操作MySQL
| |
| conn = MySQLdb.Connection(host='localhost', user='root', passwd='123456', db='scraping') |
| |
| cur = conn.cursor() |
| |
| cur.execute("insert into urls (url,content)VALUES('www.baidu.com','百度')") |
| |
| cur.close() |
| |
| conn.commit() |
| |
| conn.close() |
连接MongoDB
安装mongdb
1.下载安装包,有安装版的可执行文件,一直Next就可以安装,免安装版的要解压到本地计算机。在解压的目录下新建data和logs文件夹,新建mongo.config文件,在data文件下新建db文件夹,mongo.conf文件添加配置信息如下:
| dbpath=E:\DownLoad\MongoDB\mongodb-win32-x86_64-2012plus-4.2.18-rc0-12-gbe2c559\data\db |
| logpath=E:\DownLoad\MongoDB\mongodb-win32-x86_64-2012plus-4.2.18-rc0-12-gbe2c559\logs\mongo.log |
| logappend=true |
| journal=true |
| quiet=true |
| port=27017 |
2.启动mongdb
打开命令行窗口(cmd打开)--cd 跳转到mongodb的bin目录下--执行命令告诉mongodb自己要把数据存放到哪里,在命令行输入:mongod -dbpath E:\mongodbFiles\db\data (根据自己刚才创建的data文件夹路径,此处为我创建的实际路径)
mongodb默认连接端口27017,如果出现如图的情况,在浏览器访问:http://localhost:27017
3.打开新的cmd命令行窗口,之前的不要关闭。
在新的命令行cd到mongodb的bin目录下,继而输入命令:mongod --config D:\software\professional\mongoDB\mongo.config --install -serviceName "MongoDB"
这一步是告诉mongodb,配置文件的方法,并将mongodb作为系统服务启动。
命令行窗口(cmd)输入services.msc命令——查看服务可以看到MongoDB服务,点击可以启动。
弹出窗口如下,找到MongoDB服务,双击MongoDB项(此处我的已经启动了),弹出窗口点击启动,并将启动类型设置为自动:至此已经完全配置完毕。
操作mongdb
1.使用mongodb有两种启动方式,一种是以程序的方式打开另外一种是以window服务的方式打开
使用python操作mongdb
| client = MongoClient('localhost', 27017) |
| db = client.blog_database |
| collection = db.blog |
| |
| link = "http://www.santostang.com/" |
| headers = { |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36' |
| } |
| |
| r = requests.get(link, headers=headers) |
| soup = BeautifulSoup(r.text, "html.parser") |
| title_list = soup.find_all('h1', class_="post-title") |
| for h in title_list: |
| url = h.a['href'] |
| title = h.a.text.strip() |
| post = { |
| "url": url, |
| "title": title, |
| "date": datetime.datetime.utcnow() |
| } |
| collection.insert_one(post) |
MongoDB爬虫实践:虎扑论坛
使用mongodb的类,可以很方便的连接数据库,提取数据库中的内容,向数据库中加入数据以及更新数据库中的数据。
| |
| from pymongo import MongoClient |
| |
| |
| class MongoAPI(object): |
| def __init__(self, db_ip, db_port, db_name, table_name): |
| self.db_ip = db_ip |
| self.db_port = db_port |
| self.db_name = db_name |
| self.table_name = table_name |
| self.conn = MongoClient(host=self.db_ip, port=self.db_port) |
| self.db = self.conn[self.db_name] |
| self.table = self.db[self.table_name] |
| |
| |
| def get_one(self, query): |
| return self.table.find_one(query, projection={"_id": False}) |
| |
| |
| def get_all(self, query): |
| return self.table.find(query) |
| |
| |
| def add(self, kv_dict): |
| return self.table.insert_one(kv_dict) |
| |
| |
| def delete(self, query): |
| return self.table.delete_many(query) |
| |
| |
| def check_exist(self, query): |
| ret = self.table.find_one(query) |
| return ret != None |
| |
| |
| def update(self, query, kv_dict): |
| self.table.update_one(query, {"$set": kv_dict}, update=True) |
| from MongoAPI import MongoAPI |
| # 连接数据库hupu中的post集合。 |
| hupu_post = MongoAPI("localhost", 27017, "hupu", "post") |
| for i in range(1, 11): |
| link = "https://bbs.hupu.com/bxj" + "-" + str(i) |
| headers = { |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36' |
| } |
| r = requests.get(link, headers=headers) |
| suop = BeautifulSoup(r.text, "html.parser") |
| |
| li_list = suop.find_all("li", class_="bbs-sl-web-post-body") |
| for li in li_list: |
| title = li.find('div', class_="post-title").a.text.strip() |
| title_link = li.find('div', class_="post-title").a["href"] |
| datum = li.find("div", class_="post-datum").text.strip() |
| reply = datum.split('/')[0] |
| browse = datum.split('/')[1] |
| author = li.find("div", class_="post-auth").text.strip() |
| start_date = li.find("div", class_="post-time").text.strip() |
| # data = datetime.datetime.strptime(start_date, '%Y-%m-%d').date() |
| # 添加数据 |
| hupu_post.update( |
| {"title": title, "title_link": title_link, "reply": reply, "browse": browse, "author": author, |
| "data": start_date}) |
| print(title, title_link, reply, browse, author, start_date) |
| time.sleep(1) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通