一、设计工作流,分成两步:第一步,先在列表页里面把所有详情页的链接抓取然后保存到数据库;第二部,从数据库中依次取出链接爬取详情页的详细信息并保存到新的数据库列表中。
二、利用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有字符串参数,就会先去除参数,然后在原参数处分割字符串;如果split没有参数,就会去除所有格式符和空格,并按照在原格式符空格处分割字符串,返回其列表。
split()的特殊之处:
(1)如果在字符串开头参数重复匹配,匹配多少个,就插入多少个空字符串到返回的列表中;
(2)如果在字符串结尾参数重复匹配,匹配多少个,就插入多少个空字符串到返回的列表中;
(3)如果在字符串中间参数重复匹配,匹配n个,就插入n-1个空字符串到返回的列表中;
例如:
>>> s='**sgng***ssksg***'
>>> s.split('*')
['', '', 'sgng', '', '', 'ssksg', '', '', '']
四、split()与strip()的区别:
(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循环获得全部值),要得到标签对象里去除格式符,空格和标签格式后的字符串,就必须用list方法或者for循环等对其进行迭代取值。
title = soup.select()
list(title[0].stripped_strings)
(3)、strings方法和stripped_strings类似,区别是strings不去除格式符,空格和标签格式。
六、每个函数应该注释,写出参数意义,功能,返回值意义;每个函数应该能够单独赋参测试。
网友评论