1. 程式人生 > 其它 >python網路爬蟲-資料儲存(七)

python網路爬蟲-資料儲存(七)

資料儲存

主要介紹兩種資料儲存方法:

  1. 儲存在檔案中,包括text檔案和csv檔案
  2. 儲存在資料庫中,包括MySQL關係型資料庫和mongoDB資料庫

儲存到txt

title = "第一個文字"
# W建立寫入  W+建立讀取+寫入
# R讀取 r+讀取+寫入
# A 寫入 a+ 讀取寫入  附加
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]

# 設定3306埠

port=3306

# 設定mysql的安裝目錄

basedir=E:\DownLoad\mysql\mysql-8.0.27-winx64

# 設定mysql資料庫的資料的存放目錄

datadir=E:\DownLoad\mysql\mysql-8.0.27-winx64\data

# 允許最大連線數

max_connections=200

# 允許連線失敗的次數。這是為了防止有人從該主機試圖攻擊資料庫系統

max_connect_errors=10

# 服務端使用的字符集預設為UTF8

character-set-server=utf8

# 建立新表時將使用的預設儲存引擎

default-storage-engine=INNODB

# 預設使用“mysql_native_password”外掛認證

default_authentication_plugin=mysql_native_password

[mysql]

# 設定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()
# 寫入純SQL語句
cur.execute("insert  into urls (url,content)VALUES('www.baidu.com','百度')")
# 關閉遊標
cur.close()
# 執行SQL
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 #這個選項可以過濾掉一些無用的日誌資訊,若需要除錯使用請設定為false
port=27017 #埠號 預設為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服務的方式開啟

//檢視所有資料庫
show dbs
使用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的類,可以很方便的連線資料庫,提取資料庫中的內容,向資料庫中加入資料以及更新資料庫中的資料。

# coding=utf-8
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)

# 檢視集合中是否包含滿足條件的資料  找到了返回True  沒找到返回False
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)