使用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就行了。。
以上,解決。