隨筆- 5文章- 0
緣起:
給力,因而需要乙個開啟速度快的目錄小**。
思路:
1.資料表設計:
id(int), //主鍵自增
title(varchar 50), //速度優先,只需要title,不需要
date(varchar 25), //採集的date中有如「1小時前」,因此也設計成varchar
2.採集函式設計:
3.採集流程及入庫:
資料庫採用mysql,如何使python支援mysql詳見python**建設,因為是多執行緒所以在插入資料的時候需要資源鎖。
關於python多執行緒thread以及資源鎖,可以參照python模組學習。
**:
1說明:#!/usr/bin/env python2#
coding=utf-8
3import
urllib2
4importre5
import
mysqldb
6import
thread
7import
time8#
建立鎖,用於訪問資料庫
9 lock =thread.allocate_lock()10#
抓取函式
11def fetch(id=1,debug=false):
12 urlbase = '
'13 url = urlbase + '
order_1_view_1_page_
' + str(id) + '/'
14 res =urllib2.urlopen(url).read()
15 abstarct = re.compile(r'
',re.dotall).findall(res)
1617 vid_list =
18for i in
range(0,len(abstarct)):
19 title = re.compile(r'
title="(.*?)"
',re.dotall).findall(abstarct[i])
20 href = re.compile(r'
href="(.*?)"
',re.dotall).findall(abstarct[i])
21 date = re.compile(r'
(.*?)
',re.dotall).findall(abstarct[i])
22if debug ==true:
23print title[0]+href[0]+date[0]
24 vid =
2930
#print thread.get_ident()
31return
vid_list32#
插入資料庫
33def
insert_db(page):
34global
lock35#
執行抓取函式
36 vid_date =fetch(page,false)
37 sql = "
insert into ykgame (title,href,date) values (%s,%s,%s)"38
#插入資料,一頁20條
39for i in
range(0,len(vid_date)):
40 param = (vid_date[i]['
title
'],vid_date[i]['
href'],
41 vid_date[i]['
date'])
42 lock.acquire() #
建立鎖43
cursor.execute(sql,param)
44conn.commit()
45 lock.release() #
釋放鎖46
47if
__name__ == "
__main__":
48#連線資料庫
49 conn = mysqldb.connect(host="
localhost
",user="
root",
50 passwd="
root
",db="
python_test
",charset="
utf8")
51 cursor =conn.cursor()
52 conn.select_db('
python_test')
53#建立表54 sql = "
create table if not exists \
55ykgame(id int primary key auto_increment, title varchar(50), \
56href varchar(50), date varchar(25))"57
cursor.execute(sql)58#
插入資料庫
59for i in range(1,10):
60thread.start_new_thread(insert_db,(i,))
61print
'採集中...
'62 time.sleep(3)63#
關閉資料庫
64cursor.close()
65 conn.close()
urllib2模組:進行網頁內容抓取
re模組:進行正規表示式提取
mysqldb模組:mysql操作
thread模組:多執行緒操作
time模組:time.sleep(3)
遇到的問題:
1.mysql中文亂碼:問題比較複雜,通用解決辦法如下
程式中只要在開頭寫好:#coding=utf-8
連線資料庫的時候設定編碼方式:conn=mysqldb.connect(host="127.0.0.1",user="webdb",passwd="web123",db="web",charset="utf8")
對於採集來的中文字串,可以編碼轉換後插入str = str.decode("gbk").encode("utf-8")
2.warning: data truncated for column 'href' at row 1
原因:href 資料庫中為 varchar(25),而實際長度》25
解決辦法:將href 數庫中改為 varchar(50)
3.多執行緒問題:現象混亂有時候無報錯,注意事項如下
使用相同資源是需要用資源鎖,不然出現異常
執行緒處理時間短時,啟用執行緒後加time.sleep(3)
為理想而生存
各位阿里人,幾天前,有朋友問我今生最相信什麼,我說 我相信相信 最近我發現很多阿里人非常鬱悶和難過,大批網路報道指責 網調整搜尋結果,甚至還惹起了某些賣家來 網門口 示威 看到那麼多同事很委屈,甚至流下了眼淚,也發現不少年輕的 人在不斷自問 我 們到底做錯了什麼,為了鼓勵大家在 上創業,堅持七年不向...
Vimium 為鍵盤而生
the hacker s browser.作為乙個chrome的忠實使用者,從開發人員工具到谷歌的擴充套件程式 extensions 外掛程式 這些都在無形之中提高我們的工作效率。n年前的一天,看到了一款外掛程式,vimium,嗯,就是它。於是開始了vimium的學習。安裝後,在網頁中按下shift...
CI CD 蝸牛,為夢想而生
持續整合ci 合併 構建 部署 測試都在一起,不斷的執行這個過程,並對結果反饋 持續部署cd 部署到測試環境 預發布環境 生產環境 持續交付cd 將最終產品發布到生產環境,給使用者使用 開發電腦 git svn 人工定時觸發 自動構建與發布 自動測試 工程師 1.2 什麼是持續整合 持續整合是指開發...