基本架构:调度器,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 urllib2 request=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() #创建一个opener opener = urlib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #给urlib2安装opener uelib2.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')
访问节点信息:
#得到节点<a href='1.html'>Python</a> #获取查找到的节点的标签名称 node.name #获取查找到的a节点的href属性 node['href'] #获取查找到的a节点的链接文字 node。get_text()
lxml