1. 程式人生 > >使用python爬蟲抓取頁面之後,將頁面儲存到Mysql資料庫中

使用python爬蟲抓取頁面之後,將頁面儲存到Mysql資料庫中

 #首先抓取html頁面內容,為了安全起見,有關url內容和mysql連線內容都以星號代替

headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}

req = urllib2.Request(url='******',headers=headers);

httpContent = urllib2.urlopen(req).read()

db = MySQLdb.connect(host='******',user='******',passwd='******',db='******',port=3306,charset='utf8')#獲取資料庫連線,根據資料庫設計的編碼,設定編碼為utf-8
cur=db.cursor()

sql = 'INSERT INTO pageContents (pageContent,queryTerm,querySource,queryTime,queryType) values(%s,%s,%s,%s,%s)'   #寫入資料庫

#pageContent欄位是MediumBlob型別,資料庫中專門儲存檔案和二進位制流。

cur.execute(sql,(str,'測試用資料1','百度','2015/8/5',''))

cur.close()

db.close()

讀取的時候使用:

cur=db.cursor()
cur.execute('select * from pageContents')

cur.fetchone()
data = cur.fetchone();
cur.close()
db.close()

mysql的blob型別分為四類:

TinyBlob 最大 255位元組
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G

根據自己儲存的內容大小來指定類別。選大了會浪費空間

最後談一談遇見的坑吧。。

當時在網上找了找示例程式碼。

在insert的時候,針對要存的檔案,都是用了Mysqldb.escape_string()方法。

但是!!!

這就是坑的所在了!

使用escape_string()方法來處理html檔案的時候。會把各種符號給你轉義出來!轉義出來!轉義出來!

什麼意思呢?

換行會轉義成\r\n,冒號會轉義成個\"。

比如你有一段html程式碼是:

<!DOCTYPE html>


<html><!--STATUS OK--><head><meta name="referrer" content="always">

它會給你轉成

<!DOCTYPE html>\r\n<html><!--STATUS OK--><head><meta name=\"referrer\" content=\"always\">

看出區別了嗎?

換行被顯式轉義出來了,冒號也出來了。

導致的結果是什麼?

當你從資料庫去讀出html檔案的時候,你滿心期待地開啟檔案,結果出來的全是亂碼。亂碼。。亂碼。。。

最後試過了n多種方法,最開始以為是編碼問題,因為python預設編碼是ascii碼,就用轉碼轉成utf8,結果不行。

後來以為讀取blob出來的內容是個字元陣列,還費盡心思地把返回值構建成字串str,

最後發現這貨讀取出來的就是個字串!

把所有可能都試過了之後,最後就把問題定位到了insert的時候。

解決方法就是在insert的時候不用Mysqldb.escape_string()這個方法,直接把html字串丟去insert就行了。。

以上,解決。