简单的爬虫架构
调度器
URL管理器
管理待抓取的URL集合和已抓取的URL,防止重复抓取,防止死循环
功能列表
1:判断新添加URL是否在容器中2:向管理器添加新URL3:判断容器是否为空4:将已爬取URL移动到已爬取集合5:获取待爬取URL
实现方式
1:使用set(自动去除重复项目)2:使用关系数据库(MySQL)3:使用缓存数据库(redis):大型公司使用这玩意
网页下载器
功能列表
1:get 2:post3:伪装头信息4:HTTPCookieProcessor5:ProxyHandler6:HTTPSHandler7:HTTPRedirectHAndler
实现方法
1:urllib22:URLlib33:requests
此处使用request实现
#coding=utf-8import requests,jsonurl = 'http://www.baidu.com'headers = {'user-agent':'Mozilla/5.0'} #模拟Mozilla浏览器头,此行可以为空get_data = {'wd':'linux'}r = requests.get(url,headers=headers,params = get_data)if r.status_code == 200: '访问成功' try: file = open('baidu.com','w') file.write('本次访问网址是:' + r.url) print('本次访问网址是:' + r.url) except IOError as e: print('文件读取错误:' + str(e)) try: file = open('baidu.com','a+') text = r.text file.write('\n得到数据如下:\n' + text) print('得到数据长度:' + str(len(r.content))) except IOError as e: print('文件读取错误:' + str(e))else: print('我是假的404')
解析器
1:正则表达式 传统经典,语法奇葩难懂2:html.parser python自带3:BeautifulSoup 可以使用上下两种解析器,集合天地精华4:lxml 可以解析html和xml#coding=utf-8from bs4 import BeautifulSoup,retry: file = open('baidu.com','r') html_str = file.read() print(type(html_str))except IOError as e: print(str(e))finally: if 'file' in locals(): file.close()if 'html_str' in locals(): #根据HTML网页字符串创建BeautifulSoup对象 soup = BeautifulSoup( html_str, #html文档字符串 'html.parser', #html解析器,可以使用py自带的html_parser from_encoding='utf-8' #文档编码格式 ) #soup.find(name,attrs,string) #只查找第一个匹配对象,支持正则表达式 nodes = soup.find_all('a') for node in nodes: print(node.name) #得到节点标签(参数1) print(node['href']) #得到属性(参数2) print(node.get_text()) #得到文字(参数3) #正则匹配 nodes2 = soup.find_all('a',href=re.compile(r"map")) print('\n\n\n\n\n---------------------------百年分割线------------------------\n') for node in nodes2: print(node.name) #得到节点标签(参数1) print(node['href']) #得到属性(参数2) print(node.get_text()) #得到文字(参数3)