一、設計工作流,分成兩步:第一步,先在列表頁里面把所有詳情頁的鏈接抓取然后保存到數(shù)據(jù)庫;第二部,從數(shù)據(jù)庫中依次取出鏈接爬取詳情頁的詳細信息并保存到新的數(shù)據(jù)庫列表中。
二、利用BeatifulSoup的select方法判斷頁面是否有效
抓取列表頁時,一旦抓空就停止抓取,因為這樣表明列表頁已經全部爬取完畢了。判斷是否抓空很簡單:
...
titles = soup.select('a.t strong')
...
if titles:
...
因為soup.select方法沒抓到東西會返回空列表,抓到東西就返回標簽對象的列表,所以直接由它的返回值可知是否成功抓取。
空列表[]在python3判斷式中等價于False,如果要反向判斷,就用邏輯運算符not []等價判定為True。
>>> bool([])
False
>>> bool(not [])
True
三、str字符串的方法split()返回的是一個列表list,不管該列表有多少元素,如果split有字符串參數(shù),就會先去除參數(shù),然后在原參數(shù)處分割字符串;如果split沒有參數(shù),就會去除所有格式符和空格,并按照在原格式符空格處分割字符串,返回其列表。
split()的特殊之處:
(1)如果在字符串開頭參數(shù)重復匹配,匹配多少個,就插入多少個空字符串到返回的列表中;
(2)如果在字符串結尾參數(shù)重復匹配,匹配多少個,就插入多少個空字符串到返回的列表中;
(3)如果在字符串中間參數(shù)重復匹配,匹配n個,就插入n-1個空字符串到返回的列表中;
例如:
>>> s='**sgng***ssksg***'
>>> s.split('*')
['', '', 'sgng', '', '', 'ssksg', '', '', '']
四、split()與strip()的區(qū)別:
(1)split()不賦參時可以用來去除字符串中所有格式符和空格,但strip()只能去除字符串兩頭的格式符和空格,中間存在的格式符和空格去除不了,因為strip()相當于lstrip()和rstrip()的共同作用,去除字符串開頭的格式符和空格與去除字符串結尾的格式符和空格。
(2)split()返回一個列表,strip()返回還是字符串。
>>> r=' ?\n\tha ? ?\n\tngng\t\n\n ?\n'
>>> r.split()
['ha', 'ngng']
>>> r.lstrip()
'ha ? ?\n\tngng\t\n\n ?\n'
>>> r.rstrip()
' ?\n\tha ? ?\n\tngng'
>>> r.strip()
'ha ? ?\n\tngng'
五、stripped_strings
stripped_strings是標簽對象的方法,該標簽對象可以是多重嵌套的標簽,該方法返回一個生成器,該生成器就是依次生成該標簽對象里分散的各個字符串。
特別注意:
(1)、soup.select方法返回的是一個標簽對象的列表,所以soup.select的返回值不能直接調用stripped_strings。
(2)、stripped_strings是一個生成器,可迭代(可以for循環(huán)獲得全部值),要得到標簽對象里去除格式符,空格和標簽格式后的字符串,就必須用list方法或者for循環(huán)等對其進行迭代取值。
title = soup.select()
list(title[0].stripped_strings)
(3)、strings方法和stripped_strings類似,區(qū)別是strings不去除格式符,空格和標簽格式。
六、每個函數(shù)應該注釋,寫出參數(shù)意義,功能,返回值意義;每個函數(shù)應該能夠單獨賦參測試。