基本架构:调度器,url管理器,网页下载器,网页解析器
调度器:启动爬虫,关闭爬虫,监视爬虫的进度
url管理器:管理待爬取的URL和已爬取的URL
需要支持:添加新URL到待爬取集合
判断待添加URL是否已经被爬取
获取待爬取URL,判断是否还有带爬取的URL
被爬取之后将该URL从待爬取集合移动到已爬取集合
实现方式:存储在内存中,使用set数据结构
存储在关系数据库
存储在缓存数据库中
网页下载器:对URL管理器中待爬取的URL指定的网页以html形式下载到本地,存储成字符串
urllib2:Python官方基础模块
下载网页方法:response=urllib2.urlopen(url),使用response.getcode()方法获取状态码,是200则表示下载成功;response.read()方法读取下载内容
使用request类,将url,data,header传入request类,调用urllib2.urlopen(request)
import urllib2request=urllib2.Request(url)#向服务器提交数据request.add_data('a','1') #将爬虫伪装成一个mozilla浏览器request.add_header('User-Agent','Mozilla/5.0') response = urllib2.urlopen(request)
添加特殊情景处理器
import urlib2,cookielib#创建cookie容器cj = cookielib.CookieJar()#创建一个openeropener = urlib2.build_opener(urllib2.HTTPCookieProcessor(cj))#给urlib2安装openeruelib2.install_opener(opener)#使用带有cookie的urllib2访问网页response = urlibopen("http://www.baidu.com/")
网页解析器:对于网页下载器所产生的字符串进行解析,解析出价值数据与新的URL,添加进URL管理器
使用正则表达式:字符串的模糊匹配,其余三种为结构化解析
html.parser
BeautifulSoup
创建beautifulsoup对象:
from bs4 import BeautifulSoup#根据html网页字符串创建beautifulsoup对象soup = beautiful(html_doc, #html文档字符串 'html.parser' #html解析器 from_encoding='utf8' #html文档编码 )
搜索结点:
#查找所有标签为a的结点soup.find_all('a')#查找所有标签为a,链接符合/view/123.htm形式的节点soup.find_all('a',href='/view/123.htm')#查找所有标签为a,链接符合/view/数字.htm形式的节点soup.find_all('a',href=re.compile(r'/view/\d+\.htm'))#查找所有标签为div,class为abc,文字为Python的节点soup.find_all('div',class_='abc',string='Python')
访问节点信息:
#得到节点Python#获取查找到的节点的标签名称node.name#获取查找到的a节点的href属性node['href']#获取查找到的a节点的链接文字node。get_text()
lxml