編寫程序
一葫掉、count()方法
(1)python中的count()方法:統(tǒng)計字符串中子字符串的出現(xiàn)次數(shù)些举,統(tǒng)計列表中相同元素的出現(xiàn)次數(shù)。python中生成器不能用該方法俭厚。
(2)mongodb中collection的count()函數(shù):統(tǒng)計條目數(shù)户魏。在pymongo生成器可采用該方法。
二挪挤、pymongo把字典保存到mongodb后叼丑,字典中會自動添加一個mongodb的id鍵值對。
三电禀、BeatifulSoup的find()與find_all()幢码,python自帶的find()和mongodb的find()
(1)find()的參數(shù)依次為(標簽名笤休,標簽屬性)尖飞,返回一個標簽(可多重嵌套)或None;
(2)find_all()的參數(shù)依次為(標簽名店雅,標簽屬性)政基,返回一個標簽列表或者空列表[];
(3)soup.find('head').find('title')可簡寫為soup.head.title闹啦。
(4)python的find()是字符串對象的方法沮明,用于查找子字符串,返回第一個字串出現(xiàn)的位置或-1(字串不存在)窍奋。
(5)mongodb的find()是列表對象的方法荐健,接收字典參數(shù),鍵值對為所要查找條目鍵值對琳袄,用于查找條目江场,返回True
四、在引用其它py文件或其函數(shù)窖逗,列表址否,變量等等時,如果運行主程序碎紊,被引用的py文件中的可執(zhí)行語句也會被執(zhí)行佑附,因此樊诺,所有的py文件都應(yīng)該封裝好再在主程序中引用。
五音同、requests拋出錯誤词爬,達到最大連接次數(shù)仍然無法連接成功,說明對網(wǎng)站請求頻率過高权均,應(yīng)延長請求的時間間隔缸夹。
六、dict添加新的鍵值對用字典的setdefault(鍵螺句,值)方法虽惭。
七、list和dict可以通過pop(位置)刪除該位置的元素蛇尚。
八芽唇、mongodb的查詢方法find()與find_one()
find()方法成功找到符合條件的記錄則返回一個生成器(實質(zhì)是停留在符合條件記錄的集合的第一條記錄位置的cursor),用list方法轉(zhuǎn)化為列表后取劫,如果該存在符合條件的記錄匆笤,則生成一個列表,否則生成一個空列表谱邪。
find_one({查詢鍵值對}炮捧,{顯示字段:0表示不顯示or1表示顯示,其余默認不顯示惦银,'_id'默認顯示})返回查詢到的第一條咆课。
特別注意:
(1)只返回第一條,沒查詢到返回null扯俱。
(2)find_one第二個參數(shù)留空則返回一條完整的記錄书蚪。
九、BautifulSoup可以尋找下一個標簽和內(nèi)容迅栅,分別是next_sibling方法和next_element方法殊校。
程序運行
中斷常見原因:
(1)數(shù)組越界,BeautifulSoup沒成功抓取读存,嘗試按標簽列表處理時出錯为流。處理方式:所有抓取到的數(shù)據(jù)都要進行判斷分析。
如果BautifulSoup的select方法沒成功抓取让簿,它會返回一個空列表[]敬察,空列表的bool值為False,通過代碼:
if []:
run part1;
if not []:
run part2
可以進行正反判斷拜英。
(2)編碼出錯静汤,所有需要保存的數(shù)據(jù)(寫入文件或者寫入數(shù)據(jù)庫)都要先用encode('utf-8')編碼為utf-8碼再保存,讀取時用decode解碼為unicode碼(大部分編程界面碼)。為了避免出現(xiàn)類似錯誤虫给,還可以將pycharm的程序編碼設(shè)置為‘utf-8’藤抡。
編碼錯誤有兩個問題:
如果抓取的內(nèi)容是utf-8編碼的,抓取到后如果要在cmd運行界面print出來抹估,有時就會報錯:
UnicodeEncodeError: 'gbk' codec can't encode character
這個呢缠黍,并不是程序的編碼有問題,問題是出在操作系統(tǒng)的默認編碼上药蜻,windows的默認編碼是‘gbk’瓷式,對有些unicode碼并不能顯示。
處理方法:不要設(shè)置print语泽,直接將數(shù)據(jù)保存到mongodb數(shù)據(jù)庫中贸典。或者將數(shù)據(jù)用utf-8方式encode為bytes保存到mongodb中踱卵,不過這樣查詢起來非常不方便廊驼,因為都是bytes符號。建議采取第一個方式惋砂。
(3)網(wǎng)站達到最大連接次數(shù)仍無法成功連接妒挎,抓取動作太頻繁,保存數(shù)據(jù)隔一段時間再抓西饵。