功能:从初始网址爬取并抽取内层网址继续爬取 技术:随机User-Agent生成,队列,多线程,robots解析,下载限流,mongodb存储,爬取深度限制,重试下载,抽取特定路由,真正下载,网址正常化,功能封装 规范:用到类属性和类方法的方法在类里编写,用不到的在类外面编写,可以建个助手目录utils存放这些助手函数
通常在开发过程中不可能一下子就把init写得完整,先把最易用到的,已经想到的初始化,后面的在编写其他函数想到时再来init里编写
使用不同的队列会造成BFS和DFS的效果 使用先进先出队列产生广度优先搜索,使用先进后出(栈)产生深度优先搜索
text:返回的是unicode 型的数据,一般是在网页的header中定义的编码形式,如果想要提取文本就用text; content:返回的是bytes,二级制型的数据;想要提取图片、文件,就要用到content; .text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常,这是就需要用.content进行手动编码。
将重试下载模块封装在此,不对用户展示重试下载接口
保存函数:将爬取内容MD5加密存储到文件中,注:使用mongodb保存结果则无需次函数
方式:lxml、BeautifulSoup、正则
lxml
1 html = lxml.html.fromstring(html_content)
2 html_data = html.xpath('//a/@href')
BeautifulSoup
1 soup = BeautifulSoup('lxml')
2 a_list = soup.find_all('a')
3 for a in a_list:
4 print(a['href'])
正则
1 url_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
2 return url_regex.findall(html_content.decode("utf-8"))
decode解码问题:不同网站所使用的编码方式有所不同—— utf-8 , gbk, gb2312, ISO-8859-1
实现一个类方法的时候,要注意类方法是否使用了当前类的属性或其他方法,如果未使用就说明和当前类没有直接关系,最好独立出来,当做工具方法
1 urljoin:拼接网址,若参数2网址是正确格式,那么拼接的结果只是参数2网址,参数1网址忽略;若参数2网址是错误格式或是后缀path,那么和参数1网址进行拼接
2 urljoin('http://www.baidu.com','/ljb.html/index.html')
3 'http://www.baidu.com/ljb.html/index.html'
4
5 urljoin('http://www.baidu.com','http://ljb.html/index.html')
6 'http://ljb.html/index.html'
7
8 urljoin('/www.baidu.com','http://ljb.html/index.html')
9 'http://ljb.html/index.html'
10
11 urljoin('/test.html','http://ljb.html/index.html')
12 'http://ljb.html/index.html'
13
14 urljoin('http://www.baidu.com/test.html','http://ljb.html/index.html')
15 'http://ljb.html/index.html'
16
17 urljoin('http://www.baidu.com/test.html','http://www.sina.com/ljb.html/index.html')
18 'http://www.sina.com/ljb.html/index.html'
限流:设置爬取的间隔时间是为了避免IP被封锁,随机间隔时间更可靠