<sub id="gqw76"><listing id="gqw76"></listing></sub>
      <sub id="gqw76"><listing id="gqw76"></listing></sub>

    1. <form id="gqw76"><legend id="gqw76"></legend></form>
    2. 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之外我們還可以使用數據庫進行保存。

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

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

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



      posted @ 2021-03-01 19:28  天問非攻  閱讀(144)  評論(0編輯  收藏
      最新chease0ldman老人|无码亚洲人妻下载|大香蕉在线看好吊妞视频这里有精品www|亚洲色情综合网

        <sub id="gqw76"><listing id="gqw76"></listing></sub>
        <sub id="gqw76"><listing id="gqw76"></listing></sub>

      1. <form id="gqw76"><legend id="gqw76"></legend></form>