一個人人網(wǎng)python爬蟲

background

不知道現(xiàn)在還有多少人在使用人人網(wǎng),但是在我剛上大學(xué)的時候人人網(wǎng)還有開心網(wǎng)還是很火的,然而它們都相繼死去了。倒是高中時喜歡玩的QQ空間依舊風(fēng)生水起。

但是畢竟在人人網(wǎng)上留下了很多東西,將來一不小心人人網(wǎng)關(guān)掉了(這種可能我感覺越來越大,畢竟資本市場不會說謊),這些東西丟掉豈不是很可惜?

每天發(fā)生的各種瑣事,你此時棄之如敝屐,珍之如瑰寶,在不久的將來會化作一串串珍珠,讓人憑吊……然而珍珠也會蒙塵,所以還是盡可能地保護(hù)吧!

最終代碼

RenRenDownload

遇到的一些問題

1.登錄

用python實(shí)現(xiàn)模擬登錄人人網(wǎng)

2.驗(yàn)證碼

在登錄那篇博客中已提到驗(yàn)證碼的問題,實(shí)際當(dāng)中應(yīng)該是登錄時重復(fù)多次輸錯密碼導(dǎo)致的。

之后我又發(fā)現(xiàn),在之后爬去好友的個人信息時,人人網(wǎng)對瀏覽數(shù)進(jìn)行了限制,當(dāng)對好友的個人頁面瀏覽量累計超過100時,人人網(wǎng)會進(jìn)行一次驗(yàn)證碼識別。

解決思路都是將圖片下載下來,將識別后的字符串返回。關(guān)于如何確保返回的驗(yàn)證碼不是刷新后的新驗(yàn)證碼,詳見上述博客的最后幾段。

3.Python中的中文,Unicode

如果涉及到中文,Python處理字符時經(jīng)常會報錯。
主要學(xué)習(xí)參考以下幾篇博文:

  1. 字符編碼筆記:ASCII,Unicode和UTF-8
  2. PYTHON-進(jìn)階-編碼處理小結(jié)
  3. 也談 Python 的中文編碼處理

首先是代碼中的編碼問題,詳見第一篇。
剛開始的英文只需要256個字符編碼就可以解決問題,即ASCII,可以說是計算機(jī)中最基礎(chǔ)的編碼了吧,記得大學(xué)第一門計算機(jī)專業(yè)課就對它進(jìn)行了講解。
然而除了英文之外還有許多其他字符需要進(jìn)行編碼工作,例如中文。但是沒有一種編碼方式將這些ASCII編碼無法涵蓋的字符進(jìn)行統(tǒng)一規(guī)則,知道出現(xiàn)了Unicode。如名字一樣,每個字符對應(yīng)的編碼都是獨(dú)一無二的。
但是Unicode只是一個很大的集合,只規(guī)定了符號的二進(jìn)制代碼,而沒有規(guī)定在計算機(jī)中應(yīng)該如何存儲。
后來,隨著互聯(lián)網(wǎng)的發(fā)展,需要一種統(tǒng)一的編碼方式進(jìn)行通信,UTF-8就是一種Unicode的編碼方式,并且是應(yīng)用最廣的。
以上就是三者的關(guān)系。

然后是Python中的編碼問題。
我們經(jīng)常遇到兩種類型的字符,一種是str,一種是Unicode。
Python認(rèn)為Unicode才應(yīng)該是最基礎(chǔ)的編碼。所以str變Unicode是str.decode('str的編碼方式'),而Unicode變str是Unicode.encode('想要變成的編碼方式')。
為了防止意外,理想的情況是,從外界輸入進(jìn)來的字符,統(tǒng)一decode成Unicode,在Python代碼中統(tǒng)一使用Unicode,在輸出至外界時,再根據(jù)所需encode成對應(yīng)的字符。
另外,在Python代碼開頭,統(tǒng)一聲明# -- coding: utf-8 --表示該代碼內(nèi)部的str編碼方式均為utf-8,方便之后進(jìn)行轉(zhuǎn)換(雖然python本身進(jìn)行默認(rèn)轉(zhuǎn)換時,并不會參考該設(shè)置)。

如果出錯,一般會有兩種報錯:
UnicodeDecodeError: 'ascii' codec can't decode byte...
UnicodeEncodeError: 'ascii' codec can't encode characters...
有時候是我們寫代碼時不小心掉入陷阱,有時候則是python使用默認(rèn)編碼規(guī)則轉(zhuǎn)換時出錯(例如str和Unicode類型進(jìn)行拼接,或者進(jìn)行輸入輸出)。

通過以下代碼可以得知當(dāng)前python使用的編碼規(guī)則:
impoort sys
sys.getdefaultencoding()
結(jié)果是ascii
我們可以將它進(jìn)行強(qiáng)制設(shè)置(不推薦):
reload(sys)
sys.setdefaultencoding('utf-8')
這樣的話可以避免一些錯誤。

不同編碼轉(zhuǎn)換時,推薦先decode成Unicode,再encode成最終編碼。

同樣的道理,如果在控制臺上發(fā)現(xiàn)讀取文件是亂碼,可查看下是否是編碼方式錯誤,在數(shù)據(jù)庫中,也同樣是道理。

有個庫可以進(jìn)行編碼識別:chardet。

4.json

爬取過程中,發(fā)現(xiàn)有數(shù)據(jù)是直接返回的json,有數(shù)據(jù)是html中的一段但是也是json格式。
一般通過如下進(jìn)行獲取,s表示字符串:
dictinfo = json.loads(content)
但是python的json模塊要求key值和value值都用雙引號,而人人網(wǎng)返回的數(shù)據(jù)中,key和value中單引號和雙引號都有使用,需要更改。然而有的單引號需要變成雙引號,有的不需要(只出現(xiàn)了一次:某個value是一段html,其中有一個鏈接包含http:,如果更改為雙引號,則此冒號會造成誤解),所以需要挨個字符進(jìn)行判斷。
導(dǎo)入成功后,就可以使用如下方式進(jìn)行讀?。?br> dictlinfo[key值]

5.MySQL

簡單教程:
MySQL 教程
python操作mysql數(shù)據(jù)庫

使用sql輸出table所有項(xiàng):
select * from table_name into outfile outfile_name.txt

導(dǎo)出表作為原始數(shù)據(jù):
在命令行輸入
mysqldump -u root -p --tab=directory database_name table_name
其中directory即為導(dǎo)出到的目錄

導(dǎo)出sql格式的數(shù)據(jù):
在命令行輸入
mysqldump -u root -p database_name table_name > output file_name.txt
如果要導(dǎo)出整個database,則去掉上面命令中的table_name。
如果要導(dǎo)出所有database(==備份數(shù)據(jù)庫),則是:
mysqldump -u root -p --all-databases > output file_name.txt

關(guān)于在Mysql中使用中文,創(chuàng)建數(shù)據(jù)庫的時候默認(rèn)的編碼方式是latin1,而不是utf-8.
可以通過如下命令來查看對應(yīng)數(shù)據(jù)庫、表的編碼方式:
show create database database_name
show create table table_name
可以通過如下命令來查看創(chuàng)建時使用的默認(rèn)編碼方式:
show variables like '%char%'
如果需要更改,可以執(zhí)行:
SET NAMES utf8
SET CHARACTER_SET_CLIENT=utf8
SET CHARACTER_SET_RESULTS=utf8
只不過這些設(shè)置都是臨時的,下次啟動后還會還原成原先的情況。

那么要在Mysql中使用中文,首先創(chuàng)建時要設(shè)置好編碼方式。
數(shù)據(jù)庫默認(rèn)是latin1:
create database database_name default character set utf8
還需要設(shè)置collation即比對方法,合起來如下:
create database database_name default character set utf8 collate utf8_general_ci

同時python連接時也要設(shè)置為utf8,可以通過在MySQLdb.connect(**arg)的入?yún)⒅性O(shè)置'charset':'utf8'。
另一種方法是連接建立后,執(zhí)行connect.set_character_set('utf8')。
或者是執(zhí)行SET NAMES utf8。

參考:
讓MySQL支持中文
mysql 中 character set 與 collation 的點(diǎn)滴理解
mysql編碼詳解


最后再來上一次代碼:RenRenDownload

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容