Python爬蟲系統化學習(4)

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之外我們還可以使用資料庫進行保存。

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

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

首先在網址//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="//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文本,甚至寫入到資料庫,其中最關鍵的就是寫入到資料庫里,通過將爬取到的資料庫寫入到資料庫里,我們可以創造更多有價值的東西,包括可視化之類的。至此爬蟲的三部分包括獲取、解析、存儲已經講完了。但是後面多執行緒的爬蟲、分散式爬蟲的內容才是更有魅力的。


Tags: