Python爬蟲系統化學習(4)

天問非攻發表於2021-03-01

Python爬蟲系統化學習(4)

在之前的學習過程中,我們學習瞭如何爬取頁面,對頁面進行解析並且提取我們需要的資料。

在通過解析得到我們想要的資料後,最重要的步驟就是儲存資料。

一般的資料儲存方式有兩種:儲存在檔案或者資料庫中。在本篇部落格中我會細緻的講解從零基礎到血會儲存在txt或者csv檔案,以及通過PHPstudy去儲存資料。

Python檔案儲存

首先我們來寫一組最簡單的程式碼,實現的功能是開啟C盤目錄下的a.txt,並且寫入"hello python",然後關閉檔案。程式碼如下:

content="hello python"
with open('C:\\a.txt',"a+") as f:
    f.write(content)
    f.close()

這裡有個細節是C:\是兩個反斜槓,這是因為轉義的原因。通常地址的三種表現形式:

open('D:\\Data\\a.txt',"a+")
open(r'D:\Data\a.txt',"a+")
open('D:/Data/a.txt',a+)

一個重點是我們要知道檔案的本質是控制程式碼,他是檔案的唯一識別符號。我們每次開啟一個檔案,都會在系統中生成一個用數字表示的控制程式碼,這串數字表示應用程式所代表的一系列內容。我們在記事本內寫東西就是代表著我們對控制程式碼所代表的內容進行輸入。

我們可以檢視下上述程式碼開啟a.txt檔案的控制程式碼,在原有程式碼之下輸入一下程式碼:

print(f)
#輸出內容:<_io.TextIOWrapper name='D:\\a.txt' mode='a+' encoding='cp936'>
此後對f的操作就是對a.txt的操作

所以對檔案的操作都是在控制程式碼上進行的,常用的檔案處理方法及屬性列表如下

方法:

方法名作用使用方法(舉例)
open 開啟一個檔案,建立一個file物件,相關的方法可以呼叫它進行讀寫 file=open('a.txt',"a+")
close 重新整理緩衝區中任何沒寫入的資訊,並且關閉檔案,此後資訊就不會寫入 file.close()
write 將任何字元寫入開啟的檔案,不僅僅是文字也可以是二進位制 file.write('haha')
read 從一個開啟的檔案中讀取一個字串。python的字串是二進位制資料,不僅僅是文字 len=file.read(10)[讀取10個長度的內容,空格也計算在內]
tell 告訴檔案的當前位置,下次讀寫會發生在檔案開頭的位元組後 file.tell()
seek 改變當前檔案的位置,第一個字母表示要移動的位元組數,From表示開始移動位元組的參考位置 file.seek(0,0)
readline 以行的形式去讀,一行一行的讀 data=f.readline()
readlines 把所有的行讀出來 data=f.readlines()

一個注意點是控制程式碼用完後一定要關閉,不然在大量文字情況下會大量消耗系統記憶體

    file.close()

但是使用with open 就會自動關閉這是要注意到的。

將字元文字儲存到檔案中,可讀性是很重要的,以列的形式表示有助於我們閱讀,假如我的物件有4個變數,那如何將這四個變數有序的儲存在txt文字呢?

name=['wang','zhou','sudong']
num=['1','2','3']
house=['nanjing','shanghai','guangdong']
year=['19','20','21']
with open("D:/a.txt","a+") as f:
    for i in range(0,3):
        thing='\t'.join((name[i],num[i],house[i],year[i]))
        f.write(thing)
        f.write('\n')

通過'\t'.join就可以實現有序的儲存

CSV檔案儲存

Python對CSV檔案的儲存及其簡單,以行的形式讀取CSV程式碼如下:

import csv
with open('a.csv',"r",encoding='utf-8') as fileread:
    csv_reader=csv.reader(fileread)
    for row in csv_reader:
        print(row)

csv以行的形式寫檔案:

import csv
out_put=['2','0','2','1']
with open('1.csv','a+',encoding='UTF-8',newline='') as csvwrite:
    w=csv.writer(csvwrite)
    w.writerow(out_put)

此外除了使用檔案和csv之外我們還可以使用資料庫進行儲存。

由於是從零基礎去學習爬蟲的儲存,所以資料庫的安裝是很有必要說一下的

這裡我比較喜歡用小皮皮膚裡的資料庫,讓我們來看看資料庫如何安裝以及資料庫的基本操作。

首先在網址https://www.xp.cn下載小皮皮膚,開啟小皮皮膚並在phpstudy_pro/Extension找到相應的Mysql目錄並且進入,然後開啟CMD控制檯:

輸入

mysql -u root -p
password:root

連線到資料庫

連線到資料庫後我們需要了解下資料庫的基本命令:

#顯示資料庫
show databases;
#建立資料庫
CREATE DATABASE scraping
#使用資料庫
USE scraping
#建立資料表
CREATE TABLE urls(
id INT NOT NULL AUTO_INCREMENT,
url VARCHAR(1000) NOT NULL,
content VARCHAR(4000) NOT NULL,
crated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
#檢視資料表的結構
DESCRIPBE urls;
#插入資料
INSERT INTO urls (url,content) VALUES ("www.baidu.com","嘿嘿嘿");
#查詢資料
SELECT * FROM urls WHERE id=1;
#查詢部分資料
SELECT url,content FROM urls WHERE id=1;
#刪除某些資料
DELETE FROM urls WHERE url="www.baidu.com"
#更新某些資料
UPDATE urls SET url="www.google.com",content="Google"  WHERE id=2;

通過Python操作Mysql資料庫需要事先用PIP下載好pymysql

#coding:utf-8
import pymysql
#連線到資料
Dbcursor=pymysql.connect(host="127.0.0.1",user="root",password="root1234",database="scraping")
cursor=Dbcursor.cursor()
sql="""INSERT INTO urls (url,content) VALUES ('www.baidu.com','測試程式碼1')"""
try:
    cursor.execute(sql)
    Dbcursor.commit()
except:
    Dbcursor.rollback()
Dbcursor.close()

邏輯:通過連線到資料庫然後通過cursor()方法獲得資料庫操作的遊標,繼而對資料庫執行sql語句的操作。

實戰:

#coding:utf-8
import requests
import re
import pymysql
from bs4 import BeautifulSoup
link="https://nj.ke.com/ershoufang/pg"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0","Host":
"nj.ke.com"}
db=pymysql.connect(host="127.0.0.1",user="root",password="root1234",database="house_selling")
cursor=db.cursor()
sql="""CREATE TABLE house(
              `id` INT NOT NULL AUTO_INCREMENT,
              `name` VARCHAR(1000) NOT NULL,
              `house_info` VARCHAR(1000) NOT NULL,
              `total_money` VARCHAR(1000) NOT NULL,
              `aver_money` VARCHAR(1000) NOT NULL,
              `address` VARCHAR(1000) NOT NULL,
              `created_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
              PRIMARY KEY (id)
              );
    """ 
cursor.execute(sql)
for i in range(1,999):
    link_=link+str(i)+'/'
    r=requests.get(link_,headers=headers)
    soup=BeautifulSoup(r.text,"html.parser")
    houst_list=soup.find_all('li',class_='clear')
    for house in houst_list:
        name=house.find('div',class_='title').a.text.strip()
        houst_info=house.find('div',class_='houseInfo').text.strip()
        houst_info=re.sub('\s+','',houst_info)
        total_money=str(house.find('div',class_='totalPrice').span.text.strip())+''
        aver_money=str(house.find('div',class_='unitPrice').span.text.strip())
        adderess=house.find('div',class_='positionInfo').a.text.strip()
        print(name,houst_info,total_money,aver_money,adderess)
        sql="""INSERT INTO house (name,house_info,total_money,aver_money,address) values (%s,%s,%s,%s,%s)"""
        values=(name,houst_info,total_money,aver_money,adderess)
        cursor.execute(sql,values)
        #把資料庫進行更新,如果缺少,程式碼就會報錯
        db.commit()
cursor.close()
db.close()

通過檢視資料庫發現資料庫已經寫入,

本文總結:通過本篇文章,我們學到了通過Python進行檔案處理,可以將檔案寫入txt,csv文字,甚至寫入到資料庫,其中最關鍵的就是寫入到資料庫裡,通過將爬取到的資料庫寫入到資料庫裡,我們可以創造更多有價值的東西,包括視覺化之類的。至此爬蟲的三部分包括獲取、解析、儲存已經講完了。但是後面多執行緒的爬蟲、分散式爬蟲的內容才是更有魅力的。



相關文章