开发轻量级的爬虫,不需要登录的静态网页的爬取:
1,爬虫的简介:
2,简单的爬虫架构:
3,url管理器的实现方法:
*实现方式:
1,内存:
python内存;
等待爬取的URL集合:set()
已经爬取的URL集合:set()
2,关系数据库
MySQL
urls(url, is _crawled)
3,缓存数据库
redis
等待爬取的URL集合:set
已经爬取的URL集合:set
4,网页下载器:
*urllib2下载网页方法1:最简洁的方法
import urllib2
# 直接请求
response= urllib2.urlopen('http://www.baidu.com')
# 获取状态码,如果是200表示获取成功
Printresponse.getcode()
# 读取内容
cout = response.read()
*urllib2下载网页方法2:添加data, http header
import urllib2
#创建Request对象
request = urllib2.Request(ur1)
#添加数据
request.add_data('a','1')
#添加http的header
request.add.header('user-Agent','Mozilla/5.0')
*urllib2下载网页方法3 :添加特殊情景的处理器
#增强cookie的处理
import urllib2, cookielib
#创建cookie容器
cj =cookielib.CookieJar()
#创建一个opener
opener =urllinb2.build_opener(urllib2.HTTPCookieProcessor(cj))
#使用带有cookie的urllib2访问网页
response = urllib2.urlopen("http://www.baidu.com/")
5,网页解析器;
Python的4种网页解析器
2017年2月1日
22:50
*正则表达式:
1:将网页文档作为一个字符串,然后通过模糊匹配的方式来提取出有价值的数据。
2:优点;直观。
3:缺点;如果文档比较复杂的话,这种方法非常的麻烦。
*python自带的html,parser模块来解析网页:
*第三方插件BeautifulSoup解析网页:
#可以使用html,parser模块和Ixml解析器来解析网页
#BeautifulSoup语法:
& 创建BeautifulSoup的对象,--->搜索find_all,find,--->访问节点名称<a>,属性(href='123.html',class='artice_link'),文字(节点内容:Python);
& 代码:
frombs4 import BeautifulSoup
import re
#根据HTml网页字符串创建BeautifulSoup对象
soup = BeautifulSoup(
html_doc, # HTML文档字符串
'html.parser' # HTML解析器
from_encoding = 'utf8'# HTML文档的编码
)
#搜索节点(find_all,find) 方法:find_all(name, attrs, string)
#查找所有标签为a的节点
soup.find_all('a')
#查找所有标签为a,链接符合/view/123.html形式的节点
soup.find_all('a', href = '/view/123.html')
soup.find_all('a', href = re,compile(r'/view/\d+\.html') )
#查找所有标签为div, class为abc, 文字为Python的节点
soup.find_all('div', class_='abc', string = 'python' )
#访问节点信息 得到节点:<a hef ='1.html'>python</a>
#获取查找到的节点的标签的名称
node.name
#获取查找到的节点的href属性
node['href']
#获取查找到的a节点的链接文字
node.get_text()
*第三方插件Ixml解析html网页或者xml网页
#后3种方法是一种结构化的解析,第一种是字符串的模糊匹配
6,实例爬虫--分析目标
- 目标:百度百科python词条相关词条页面—标题和简介
- 入口页:http://baike.baidu.com/view/21087.htm
- URL格式:
—词条页面URL:/view/125370.htm
- 数据结构
—标题:
* <ddclass ="lemmaWagt-lemmaTitle-title"><h1>***<h1></dd>
—简介:
*<divclass = "lemma-summary">***<div>