python 為抓取而生

2021-09-06 05:49:13 字數 3649 閱讀 2283

隨筆- 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 什麼是持續整合 持續整合是指開發...